From 176ced938b23c2c5bc92c49e8da6a3c427b4e745 Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 16 Jul 2024 16:14:22 +0900 Subject: [PATCH 001/146] add beginning of file --- .../ma_fixedwing_team_dogfight_env.py | 420 ++++++++++++++++++ 1 file changed, 420 insertions(+) create mode 100644 PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py new file mode 100644 index 00000000..c87ab602 --- /dev/null +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py @@ -0,0 +1,420 @@ +"""Multiagent Fixedwing Dogfighting Environment.""" +from __future__ import annotations + +from typing import Any + +import numpy as np +from gymnasium import spaces + +from PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_base_env import MAFixedwingBaseEnv + + +class MAFixedwingTeamDogfightEnv(MAFixedwingBaseEnv): + """Team Dogfighting Environment for the Acrowing model using the PettingZoo API. + + Args: + ---- + spawn_height (float): how high to spawn the agents at the beginning of the simulation. + damage_per_hit (float): how much damage per hit per physics step, each agent starts with a health of 1.0. + lethal_distance (float): how close before weapons become effective. + lethal_angle_radians (float): the width of the cone of fire. + assisted_flight (bool): whether to use high level commands (RPYT) instead of full actuator commands. + sparse_reward (bool): whether to use sparse rewards or not. + flight_dome_size (float): size of the allowable flying area. + max_duration_seconds (float): maximum simulation time of the environment. + agent_hz (int): looprate of the agent to environment interaction. + render_mode (None | str): can be "human" or None + + """ + + metadata = { + "render_modes": ["human"], + "name": "ma_quadx_hover", + } + + def __init__( + self, + team_size: int = 2, + spawn_height: float = 15.0, + damage_per_hit: float = 0.02, + lethal_distance: float = 15.0, + lethal_angle_radians: float = 0.1, + assisted_flight: bool = True, + sparse_reward: bool = False, + flight_dome_size: float = 150.0, + max_duration_seconds: float = 60.0, + agent_hz: int = 30, + render_mode: None | str = None, + ): + """__init__. + + Args: + ---- + team_size (int): number of planes that comprises a team. + spawn_height (float): how high to spawn the agents at the beginning of the simulation. + damage_per_hit (float): how much damage per hit per physics step, each agent starts with a health of 1.0. + lethal_distance (float): how close before weapons become effective. + lethal_angle_radians (float): the width of the cone of fire. + assisted_flight (bool): whether to use high level commands (RPYT) instead of full actuator commands. + sparse_reward (bool): whether to use sparse rewards or not. + flight_dome_size (float): size of the allowable flying area. + max_duration_seconds (float): maximum simulation time of the environment. + agent_hz (int): looprate of the agent to environment interaction. + render_mode (None | str): can be "human" or None + + """ + # placeholder starting positions + super().__init__( + start_pos=np.array([[10.0, 0.0, 10.0], [-10.0, 0.0, 10.0]]), + start_orn=np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]), + flight_dome_size=flight_dome_size, + max_duration_seconds=max_duration_seconds, + angle_representation="euler", + agent_hz=agent_hz, + assisted_flight=assisted_flight, + render_mode=render_mode, + ) + + self.sparse_reward = sparse_reward + self.damage_per_hit = damage_per_hit + self.spawn_height = spawn_height + self.lethal_distance = lethal_distance + self.lethal_angle = lethal_angle_radians + + # observation_space + # combined (state + aux) + health + enemy state + self._observation_space = spaces.Box( + low=-np.inf, + high=np.inf, + shape=(self.combined_space.shape[0] + 1 + 12,), + ) + + def observation_space(self, agent: Any = None) -> spaces.Box: + """observation_space. + + Args: + ---- + agent (Any): agent + + Returns: + ------- + spaces.Box: + + """ + return self._observation_space + + def _get_start_pos_orn(self, seed: None | int) -> tuple[np.ndarray, np.ndarray]: + """_get_start_pos_orn. + + Args: + ---- + seed (None | int): seed + + Returns: + ------- + tuple[np.ndarray, np.ndarray]: + + """ + np_random = np.random.RandomState(seed=seed) + start_pos = np.zeros((2, 3)) + while np.linalg.norm(start_pos[0] - start_pos[1]) < self.flight_dome_size * 0.2: + start_pos = (np_random.rand(2, 3) - 0.5) * self.flight_dome_size * 0.5 + start_pos[:, -1] = self.spawn_height + start_orn = (np_random.rand(2, 3) - 0.5) * 2.0 * np.array([1.0, 1.0, 2 * np.pi]) + + return start_pos, start_orn + + def reset( + self, seed: None | int = None, options: None | dict[str, Any] = dict() + ) -> tuple[dict[str, Any], dict[str, Any]]: + """reset. + + Args: + ---- + seed (None | int): seed + options (dict[str, Any]): options + + Returns: + ------- + tuple[dict[str, Any], dict[str, Any]]: + + """ + self.start_pos, self.start_orn = self._get_start_pos_orn(seed) + + # define custom forward velocity + _, start_vec = self.compute_rotation_forward(self.start_orn) + start_vec *= 10.0 + drone_options = [dict(), dict()] + for i in range(len(drone_options)): + drone_options[i]["starting_velocity"] = start_vec[i] + + super().begin_reset(seed, options, drone_options=drone_options) + + # reset runtime parameters + self.health = np.ones(2, dtype=np.float64) + self.in_cone = np.zeros((2,), dtype=bool) + self.in_range = np.zeros((2,), dtype=bool) + self.chasing = np.zeros((2,), dtype=bool) + self.current_hits = np.zeros((2), dtype=bool) + self.current_angles = np.zeros(2, dtype=np.float64) + self.current_offsets = np.zeros(2, dtype=np.float64) + self.current_distance = np.zeros(2, dtype=np.float64) + self.previous_hits = np.zeros((2), dtype=bool) + self.previous_angles = np.zeros(2, dtype=np.float64) + self.previous_offsets = np.zeros(2, dtype=np.float64) + self.previous_distance = np.zeros(2, dtype=np.float64) + self.observations = np.zeros((2, *self.observation_space(0).shape)) + self.last_obs_time = -1.0 + self.rewards = np.zeros((2,), dtype=np.float64) + self.last_rew_time = -1.0 + + super().end_reset(seed, options) + + observations = { + ag: self.compute_observation_by_id(self.agent_name_mapping[ag]) + for ag in self.agents + } + infos = {ag: dict() for ag in self.agents} + return observations, infos + + def _compute_agent_states(self) -> None: + """_compute_agent_states. + + Returns: + ------- + None: + + """ + # get the states of both drones + self.attitudes = np.stack(self.aviary.all_states, axis=0) + + """COMPUTE HITS""" + # get the rotation matrices and forward vectors + # offset the position to be on top of the main wing + rotation, forward_vecs = self.compute_rotation_forward(self.attitudes[:, 1]) + self.attitudes[:, -1] = self.attitudes[:, -1] - (forward_vecs * 0.35) # pyright: ignore[reportGeneralTypeIssues] + + # compute the vectors of each drone to each drone + separation = self.attitudes[::-1, -1] - self.attitudes[:, -1] # pyright: ignore[reportGeneralTypeIssues] + self.previous_distance = self.current_distance.copy() + self.current_distance = np.linalg.norm(separation[0]) + + # compute engagement angles + self.previous_angles = self.current_angles.copy() + self.current_angles = np.arccos( + np.sum(separation * forward_vecs, axis=-1) / self.current_distance + ) + + # compute engagement offsets + self.previous_offsets = self.current_offsets.copy() + self.current_offsets = np.linalg.norm( + np.cross(separation, forward_vecs), axis=-1 + ) + + # whether we're lethal or chasing or have opponent in cone + self.in_cone = self.current_angles < self.lethal_angle + self.in_range = self.current_distance < self.lethal_distance + self.chasing = np.abs(self.current_angles) < (np.pi / 2.0) + + # compute whether anyone hit anyone + self.current_hits = self.in_cone & self.in_range & self.chasing + + # update health based on hits + self.health -= self.damage_per_hit * self.current_hits[::-1] + + """COMPUTE THE STATE VECTOR""" + # form the opponent state matrix + opponent_attitudes = np.zeros_like(self.attitudes) + + # opponent angular rate is unchanged + opponent_attitudes[:, 0] = self.attitudes[::-1, 0] + + # opponent angular position is relative to ours + opponent_attitudes[:, 1] = self.attitudes[::-1, 1] - self.attitudes[:, 1] # pyright: ignore[reportGeneralTypeIssues] + + # opponent velocity is relative to ours in our body frame + ground_velocities: np.ndarray = ( + rotation @ np.expand_dims(self.attitudes[:, -2], axis=-1) + ).reshape(2, 3) + opponent_velocities = ( + np.expand_dims(ground_velocities, axis=1)[::-1] @ rotation + ).reshape(2, 3) + opponent_attitudes[:, 2] = opponent_velocities - self.attitudes[:, 2] # pyright: ignore[reportGeneralTypeIssues] + + # opponent position is relative to ours in our body frame + opponent_attitudes[:, 3] = ( + np.expand_dims(separation, axis=1) @ rotation + ).reshape(2, 3) + + # flatten the attitude and opponent attitude, expand dim of health + flat_attitude = self.attitudes.reshape(2, -1) + flat_opponent_attitude = opponent_attitudes.reshape(2, -1) + health = np.expand_dims(self.health, axis=-1) + + # form the state vector + self.observations = np.concatenate( + [ + flat_attitude, + health, + flat_opponent_attitude, + health[::-1], + self.past_actions, + ], + axis=-1, + ) + + def compute_observation_by_id(self, agent_id: int) -> np.ndarray: + """compute_observation_by_id. + + Args: + ---- + agent_id (int): agent_id + + Returns: + ------- + np.ndarray: + + """ + # don't recompute if we've already done it + if self.last_obs_time != self.aviary.elapsed_time: + self.last_obs_time = self.aviary.elapsed_time + self._compute_agent_states() + return self.observations[agent_id] + + def _compute_engagement_rewards(self) -> None: + """_compute_engagement_rewards.""" + # reset rewards + self.rewards *= 0.0 + + # sparse reward computation + if not self.sparse_reward: + # reward for closing the distance + self.rewards += ( + np.clip( + self.previous_distance - self.current_distance, + a_min=0.0, + a_max=None, + ) + * (~self.in_range & self.chasing) + * 1.0 + ) + + # reward for progressing to engagement + self.rewards += ( + (self.previous_angles - self.current_angles) * self.in_range * 10.0 + ) + + # reward for engaging the enemy + self.rewards += 3.0 / (self.current_angles + 0.1) * self.in_range + + # reward for hits + self.rewards += 30.0 * self.current_hits + + # penalty for being hit + self.rewards -= 20.0 * self.current_hits[::-1] + + def compute_term_trunc_reward_info_by_id( + self, agent_id: int + ) -> tuple[bool, bool, float, dict[str, Any]]: + """Computes the termination, truncation, and reward of the current timestep.""" + term, trunc, info = super().compute_base_term_trunc_info_by_id(agent_id) + + # terminal if other agent is dead + term |= self.num_agents < 2 + + # don't recompute if we've already done it + if self.last_rew_time != self.aviary.elapsed_time: + self.last_rew_time = self.aviary.elapsed_time + self._compute_engagement_rewards() + + reward = self.rewards[agent_id] + reward -= bool(info.get("out_of_bounds")) * 3000.0 + reward -= bool(info.get("collision")) * 3000.0 + + # all the info things + info["wins"] = self.health <= 0.0 + info["healths"] = self.health + + return term, trunc, reward, info + + @staticmethod + def compute_rotation_forward(orn: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + """Computes the rotation matrix and forward vector of an aircraft given its orientation. + + Args: + ---- + orn (np.ndarray): an [n, 3] array of each drone's orientation + + Returns: + ------- + np.ndarray: an [n, 3, 3] rotation matrix of each aircraft + np.ndarray: an [n, 3] forward vector of each aircraft + + """ + c, s = np.cos(orn), np.sin(orn) + eye = np.stack([np.eye(3)] * orn.shape[0], axis=0) + + rx = eye.copy() + rx[:, 1, 1] = c[..., 0] + rx[:, 1, 2] = -s[..., 0] + rx[:, 2, 1] = s[..., 0] + rx[:, 2, 2] = c[..., 0] + ry = eye.copy() + ry[:, 0, 0] = c[..., 1] + ry[:, 0, 2] = s[..., 1] + ry[:, 2, 0] = -s[..., 1] + ry[:, 2, 2] = c[..., 1] + rz = eye.copy() + rz[:, 0, 0] = c[..., 2] + rz[:, 0, 1] = -s[..., 2] + rz[:, 1, 0] = s[..., 2] + rz[:, 1, 1] = c[..., 2] + + forward_vector = np.stack( + [c[..., 2] * c[..., 1], s[..., 2] * c[..., 1], -s[..., 1]], axis=-1 + ) + + # order of operations for multiplication matters here + return rz @ ry @ rx, forward_vector + + def step( + self, actions: dict[str, np.ndarray] + ) -> tuple[ + dict[str, Any], + dict[str, float], + dict[str, bool], + dict[str, bool], + dict[str, dict[str, Any]], + ]: + """step. + + Args: + ---- + actions (dict[str, np.ndarray]): actions + + Returns: + ------- + tuple[ + dict[str, Any], + dict[str, float], + dict[str, bool], + dict[str, bool], + dict[str, dict[str, Any]], + ]: + + """ + returns = super().step(actions=actions) + + # colour the gunsights conditionally + if self.render_mode and not np.all(self.previous_hits == self.current_hits): + self.previous_hits = self.current_hits.copy() + hit_colour = np.array([1.0, 0.0, 0.0, 0.2]) + norm_colour = np.array([0.0, 0.0, 0.0, 0.2]) + for i in range(2): + self.aviary.changeVisualShape( + self.aviary.drones[i].Id, + 7, + rgbaColor=(hit_colour if self.current_hits[i] else norm_colour), + ) + + return returns From fea665b681dc32519da27309ae90f954c0782a0f Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 16 Jul 2024 16:46:41 +0900 Subject: [PATCH 002/146] bump things --- .pre-commit-config.yaml | 9 +++++++-- pyproject.toml | 10 ---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5bcfcfb9..1b8272ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,10 +8,14 @@ repos: - --ignore-words-list=null exclude: docs/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.1 + rev: v0.5.2 hooks: - id: ruff - args: [ --fix ] + args: + - --fix + - --ignore=D401,D404,D203,D213 + - --select=E4,E7,E9,F,I,D + - --per-file-ignores=__init__.py:F401 - id: ruff-format - repo: local hooks: @@ -24,3 +28,4 @@ repos: additional_dependencies: ["pyright"] args: - --project=pyproject.toml + - --reportMissingImports=none diff --git a/pyproject.toml b/pyproject.toml index 73512851..ffd3c133 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,15 +42,5 @@ Documentation = "https://jjshoots.github.io/PyFlyt/documentation.html" ####################################################################################### # linters ####################################################################################### -[tool.pyright] -reportMissingImports = "none" - -[tool.ruff.lint] -ignore = ["D401", "D404", "D203", "D213"] -select = ["E4", "E7", "E9", "F", "I", "D"] - [tool.ruff.lint.pydocstyle] convention = "google" - -[tool.ruff.lint.per-file-ignores] -"__init__.py" = ["F401"] From 0fa17460a35a8a88d3881dab53e0174b0a13e6cf Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 16 Jul 2024 16:51:29 +0900 Subject: [PATCH 003/146] ruff things --- PyFlyt/core/__init__.py | 1 + PyFlyt/core/abstractions/__init__.py | 1 + PyFlyt/core/abstractions/base_controller.py | 1 + PyFlyt/core/abstractions/base_drone.py | 1 + PyFlyt/core/abstractions/base_wind_field.py | 1 + PyFlyt/core/abstractions/boosters.py | 1 + PyFlyt/core/abstractions/boring_bodies.py | 1 + PyFlyt/core/abstractions/camera.py | 1 + PyFlyt/core/abstractions/gimbals.py | 1 + PyFlyt/core/abstractions/lifting_surfaces.py | 1 + PyFlyt/core/abstractions/motors.py | 1 + PyFlyt/core/abstractions/pid.py | 1 + PyFlyt/core/aviary.py | 1 + PyFlyt/core/drones/__init__.py | 1 + PyFlyt/core/drones/fixedwing.py | 1 + PyFlyt/core/drones/quadx.py | 1 + PyFlyt/core/drones/rocket.py | 1 + PyFlyt/core/utils/compile_helpers.py | 1 + PyFlyt/core/utils/load_objs.py | 1 + PyFlyt/gym_envs/__init__.py | 1 + PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py | 3 ++- PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py | 1 + PyFlyt/gym_envs/quadx_envs/quadx_base_env.py | 3 ++- PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py | 1 + PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py | 1 + PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py | 1 + PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py | 1 + PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py | 1 + PyFlyt/gym_envs/rocket_envs/rocket_base_env.py | 3 ++- PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py | 1 + PyFlyt/gym_envs/utils/flatten_waypoint_env.py | 1 + PyFlyt/gym_envs/utils/waypoint_handler.py | 1 + PyFlyt/pz_envs/__init__.py | 1 + PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py | 3 ++- PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py | 1 + .../pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py | 1 + PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py | 3 ++- PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py | 1 + examples/core/01_single_drone.py | 1 + examples/core/02_multi_drone.py | 1 + examples/core/03_control.py | 1 + examples/core/04_camera.py | 1 + examples/core/05_custom_controller.py | 1 + examples/core/06_spawning_objects.py | 1 + examples/core/07_custom_uav.py | 1 + examples/core/08_mixed_drones.py | 1 + examples/core/09_simple_wind.py | 1 + examples/core/10_custom_wind.py | 1 + examples/core/custom_uavs/rocket_brick.py | 1 + tests/test_core.py | 1 + tests/test_gym_envs.py | 1 + tests/test_pz_envs.py | 1 + 52 files changed, 57 insertions(+), 5 deletions(-) diff --git a/PyFlyt/core/__init__.py b/PyFlyt/core/__init__.py index e79803f9..76346815 100644 --- a/PyFlyt/core/__init__.py +++ b/PyFlyt/core/__init__.py @@ -1,3 +1,4 @@ """Class implementations for creating custom UAVs in the PyBullet simulation environment.""" + from .aviary import Aviary from .utils.load_objs import loadOBJ, obj_collision, obj_visual diff --git a/PyFlyt/core/abstractions/__init__.py b/PyFlyt/core/abstractions/__init__.py index 70f87c29..ec1273ae 100644 --- a/PyFlyt/core/abstractions/__init__.py +++ b/PyFlyt/core/abstractions/__init__.py @@ -1,4 +1,5 @@ """Abstractions for PyFlyt drones.""" + from .base_controller import ControlClass from .base_drone import DroneClass from .base_wind_field import WindFieldClass diff --git a/PyFlyt/core/abstractions/base_controller.py b/PyFlyt/core/abstractions/base_controller.py index 0ef49dec..24bd6006 100644 --- a/PyFlyt/core/abstractions/base_controller.py +++ b/PyFlyt/core/abstractions/base_controller.py @@ -1,4 +1,5 @@ """Defines a basic controller class to inherit from when building custom controllers.""" + from abc import ABC, abstractmethod import numpy as np diff --git a/PyFlyt/core/abstractions/base_drone.py b/PyFlyt/core/abstractions/base_drone.py index 48f8b06a..df1cf7e7 100644 --- a/PyFlyt/core/abstractions/base_drone.py +++ b/PyFlyt/core/abstractions/base_drone.py @@ -1,4 +1,5 @@ """Basic Drone class for all drone models to inherit from.""" + from __future__ import annotations import os diff --git a/PyFlyt/core/abstractions/base_wind_field.py b/PyFlyt/core/abstractions/base_wind_field.py index d77bfae5..ab8f697c 100644 --- a/PyFlyt/core/abstractions/base_wind_field.py +++ b/PyFlyt/core/abstractions/base_wind_field.py @@ -1,4 +1,5 @@ """Defines a basic wind field class to inherit from when implementing custom wind field models.""" + from __future__ import annotations from abc import ABC, abstractmethod diff --git a/PyFlyt/core/abstractions/boosters.py b/PyFlyt/core/abstractions/boosters.py index 561f0c39..98703b9b 100644 --- a/PyFlyt/core/abstractions/boosters.py +++ b/PyFlyt/core/abstractions/boosters.py @@ -1,4 +1,5 @@ """A component to simulate an array of boosters on vehicle.""" + from __future__ import annotations import warnings diff --git a/PyFlyt/core/abstractions/boring_bodies.py b/PyFlyt/core/abstractions/boring_bodies.py index 443d45f1..3fbb6f60 100644 --- a/PyFlyt/core/abstractions/boring_bodies.py +++ b/PyFlyt/core/abstractions/boring_bodies.py @@ -1,4 +1,5 @@ """A component to simulate bodies moving through the air.""" + from __future__ import annotations from typing import Sequence diff --git a/PyFlyt/core/abstractions/camera.py b/PyFlyt/core/abstractions/camera.py index 52bd7252..e0efb5d1 100644 --- a/PyFlyt/core/abstractions/camera.py +++ b/PyFlyt/core/abstractions/camera.py @@ -1,4 +1,5 @@ """A component to simulate a camera on a vehicle.""" + from __future__ import annotations import math diff --git a/PyFlyt/core/abstractions/gimbals.py b/PyFlyt/core/abstractions/gimbals.py index f5f04b1d..b2fdebed 100644 --- a/PyFlyt/core/abstractions/gimbals.py +++ b/PyFlyt/core/abstractions/gimbals.py @@ -1,4 +1,5 @@ """A component to simulate an array of gimbals on vehicle.""" + from __future__ import annotations import warnings diff --git a/PyFlyt/core/abstractions/lifting_surfaces.py b/PyFlyt/core/abstractions/lifting_surfaces.py index af39b366..f0ad01ee 100644 --- a/PyFlyt/core/abstractions/lifting_surfaces.py +++ b/PyFlyt/core/abstractions/lifting_surfaces.py @@ -1,4 +1,5 @@ """A component to simulate lifting surfaces vehicle.""" + from __future__ import annotations import warnings diff --git a/PyFlyt/core/abstractions/motors.py b/PyFlyt/core/abstractions/motors.py index eae4bb4b..9483d9e2 100644 --- a/PyFlyt/core/abstractions/motors.py +++ b/PyFlyt/core/abstractions/motors.py @@ -1,4 +1,5 @@ """A component to simulate an array of electric propeller motors on vehicle.""" + from __future__ import annotations import warnings diff --git a/PyFlyt/core/abstractions/pid.py b/PyFlyt/core/abstractions/pid.py index db45369b..3455c123 100644 --- a/PyFlyt/core/abstractions/pid.py +++ b/PyFlyt/core/abstractions/pid.py @@ -1,4 +1,5 @@ """A simple class implementing the PID algorithm that works on numpy arrays.""" + import numba as nb import numpy as np diff --git a/PyFlyt/core/aviary.py b/PyFlyt/core/aviary.py index a487e228..31b8bed5 100644 --- a/PyFlyt/core/aviary.py +++ b/PyFlyt/core/aviary.py @@ -1,4 +1,5 @@ """The Aviary class, the core of how PyFlyt handles UAVs in the PyBullet simulation environment.""" + from __future__ import annotations import time diff --git a/PyFlyt/core/drones/__init__.py b/PyFlyt/core/drones/__init__.py index 0e07c7c2..275689b4 100644 --- a/PyFlyt/core/drones/__init__.py +++ b/PyFlyt/core/drones/__init__.py @@ -1,4 +1,5 @@ """Implementations of default drone models.""" + from .fixedwing import Fixedwing from .quadx import QuadX from .rocket import Rocket diff --git a/PyFlyt/core/drones/fixedwing.py b/PyFlyt/core/drones/fixedwing.py index e18040af..7348992c 100644 --- a/PyFlyt/core/drones/fixedwing.py +++ b/PyFlyt/core/drones/fixedwing.py @@ -1,4 +1,5 @@ """Implementation of a Fixedwing UAV.""" + from __future__ import annotations import numpy as np diff --git a/PyFlyt/core/drones/quadx.py b/PyFlyt/core/drones/quadx.py index cfc44363..95ad404b 100644 --- a/PyFlyt/core/drones/quadx.py +++ b/PyFlyt/core/drones/quadx.py @@ -1,4 +1,5 @@ """Implementation of a CrazyFlie 2.x UAV.""" + from __future__ import annotations import math diff --git a/PyFlyt/core/drones/rocket.py b/PyFlyt/core/drones/rocket.py index 8ba46398..7dee7fac 100644 --- a/PyFlyt/core/drones/rocket.py +++ b/PyFlyt/core/drones/rocket.py @@ -1,4 +1,5 @@ """Implementation of a 1:10 scale SpaceX Rocket UAV.""" + from __future__ import annotations import numpy as np diff --git a/PyFlyt/core/utils/compile_helpers.py b/PyFlyt/core/utils/compile_helpers.py index a05d827d..26e954a5 100644 --- a/PyFlyt/core/utils/compile_helpers.py +++ b/PyFlyt/core/utils/compile_helpers.py @@ -1,4 +1,5 @@ """Common checks.""" + import warnings from typing import Callable diff --git a/PyFlyt/core/utils/load_objs.py b/PyFlyt/core/utils/load_objs.py index c7412112..da0d49f7 100644 --- a/PyFlyt/core/utils/load_objs.py +++ b/PyFlyt/core/utils/load_objs.py @@ -1,4 +1,5 @@ """Convenience function to load an obj into the pybullet environment.""" + from __future__ import annotations import numpy as np diff --git a/PyFlyt/gym_envs/__init__.py b/PyFlyt/gym_envs/__init__.py index ca043110..5b6de613 100644 --- a/PyFlyt/gym_envs/__init__.py +++ b/PyFlyt/gym_envs/__init__.py @@ -1,4 +1,5 @@ """Registers PyFlyt environments into Gymnasium.""" + from gymnasium.envs.registration import register from PyFlyt.gym_envs.utils.flatten_waypoint_env import FlattenWaypointEnv diff --git a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py index caae3c3f..e30aff99 100644 --- a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py +++ b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py @@ -1,4 +1,5 @@ """Base PyFlyt Environment for the Fixedwing model using the Gymnasim API.""" + from __future__ import annotations from typing import Any, Literal @@ -295,7 +296,7 @@ def step(self, action: np.ndarray) -> tuple[Any, float, bool, bool, dict]: return self.state, self.reward, self.termination, self.truncation, self.info def render(self) -> np.ndarray: - """render.""" + """Render.""" check_numpy() if self.render_mode is None: raise ValueError( diff --git a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py index 44a02488..c4ff0a82 100644 --- a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py +++ b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py @@ -1,4 +1,5 @@ """Fixedwing Waypoints Environment.""" + from __future__ import annotations from typing import Any, Literal diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_base_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_base_env.py index fc406705..e54de615 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_base_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_base_env.py @@ -1,4 +1,5 @@ """Base PyFlyt Environment for the QuadX model using the Gymnasim API.""" + from __future__ import annotations from typing import Any, Literal @@ -305,7 +306,7 @@ def step(self, action: np.ndarray) -> tuple[Any, float, bool, bool, dict[str, An return self.state, self.reward, self.termination, self.truncation, self.info def render(self) -> np.ndarray: - """render.""" + """Render.""" check_numpy() if self.render_mode is None: raise ValueError( diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py index 3aebfa22..b2b6c330 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py @@ -1,4 +1,5 @@ """QuadX Gates Environment.""" + from __future__ import annotations import copy diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py index dd805b7d..081be0a0 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py @@ -1,4 +1,5 @@ """QuadX Hover Environment.""" + from __future__ import annotations from typing import Any, Literal diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py index 6d5aaf28..5799fefe 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py @@ -1,4 +1,5 @@ """QuadX Pole Balance Environment.""" + from __future__ import annotations from typing import Any, Literal diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py index 7391d762..33a87c5a 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py @@ -1,4 +1,5 @@ """QuadX Pole Waypoints Environment.""" + from __future__ import annotations from typing import Any, Literal diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py index dd565da7..adc4fd25 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py @@ -1,4 +1,5 @@ """QuadX Waypoints Environment.""" + from __future__ import annotations from typing import Any, Literal diff --git a/PyFlyt/gym_envs/rocket_envs/rocket_base_env.py b/PyFlyt/gym_envs/rocket_envs/rocket_base_env.py index eef15702..9448218b 100644 --- a/PyFlyt/gym_envs/rocket_envs/rocket_base_env.py +++ b/PyFlyt/gym_envs/rocket_envs/rocket_base_env.py @@ -1,4 +1,5 @@ """Base PyFlyt Environment for the Rocket model using the Gymnasim API.""" + from __future__ import annotations from typing import Any, Literal @@ -348,7 +349,7 @@ def step(self, action: np.ndarray): return self.state, self.reward, self.termination, self.truncation, self.info def render(self): - """render.""" + """Render.""" check_numpy() if self.render_mode is None: raise ValueError( diff --git a/PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py b/PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py index bfe96d36..f29b1090 100644 --- a/PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py +++ b/PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py @@ -1,4 +1,5 @@ """Rocket Landing Environment.""" + from __future__ import annotations import os diff --git a/PyFlyt/gym_envs/utils/flatten_waypoint_env.py b/PyFlyt/gym_envs/utils/flatten_waypoint_env.py index 665b3b4a..1e094f9c 100644 --- a/PyFlyt/gym_envs/utils/flatten_waypoint_env.py +++ b/PyFlyt/gym_envs/utils/flatten_waypoint_env.py @@ -1,4 +1,5 @@ """Wrapper class for flattening the waypoint envs to use homogeneous observation spaces.""" + from __future__ import annotations import numpy as np diff --git a/PyFlyt/gym_envs/utils/waypoint_handler.py b/PyFlyt/gym_envs/utils/waypoint_handler.py index cb40deca..522458f7 100644 --- a/PyFlyt/gym_envs/utils/waypoint_handler.py +++ b/PyFlyt/gym_envs/utils/waypoint_handler.py @@ -1,4 +1,5 @@ """Handler for Waypoints in the environments.""" + from __future__ import annotations import math diff --git a/PyFlyt/pz_envs/__init__.py b/PyFlyt/pz_envs/__init__.py index 2686246d..969d12df 100644 --- a/PyFlyt/pz_envs/__init__.py +++ b/PyFlyt/pz_envs/__init__.py @@ -1,3 +1,4 @@ """Imports all PZ envs.""" + from .fixedwing_envs.ma_fixedwing_dogfight_env import MAFixedwingDogfightEnv from .quadx_envs.ma_quadx_hover_env import MAQuadXHoverEnv diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py index b11838dd..7e3191c0 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py @@ -1,4 +1,5 @@ """Base Multiagent Fixedwing Environment.""" + from __future__ import annotations from copy import deepcopy @@ -152,7 +153,7 @@ def action_space(self, agent: Any = None) -> spaces.Box: return self._action_space def close(self) -> None: - """close.""" + """Close.""" if hasattr(self, "aviary"): self.aviary.disconnect() diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py index 348a832f..4ec470a4 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py @@ -1,4 +1,5 @@ """Multiagent Fixedwing Dogfighting Environment.""" + from __future__ import annotations from typing import Any diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py index c87ab602..486ab3f8 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py @@ -1,4 +1,5 @@ """Multiagent Fixedwing Dogfighting Environment.""" + from __future__ import annotations from typing import Any diff --git a/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py b/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py index 07310011..1015cb77 100644 --- a/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py +++ b/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py @@ -1,4 +1,5 @@ """Base Multiagent QuadX Environment.""" + from __future__ import annotations from copy import deepcopy @@ -179,7 +180,7 @@ def action_space(self, agent: Any = None) -> spaces.Box: return self._action_space def close(self) -> None: - """close.""" + """Close.""" if hasattr(self, "aviary"): self.aviary.disconnect() diff --git a/PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py b/PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py index 64569daf..cbe290cf 100644 --- a/PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py +++ b/PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py @@ -1,4 +1,5 @@ """Multiagent QuadX Hover Environment.""" + from __future__ import annotations from typing import Any diff --git a/examples/core/01_single_drone.py b/examples/core/01_single_drone.py index 0d3791bd..d342f632 100644 --- a/examples/core/01_single_drone.py +++ b/examples/core/01_single_drone.py @@ -1,4 +1,5 @@ """Spawn a single drone on x=0, y=0, z=1, with 0 rpy.""" + import numpy as np from PyFlyt.core import Aviary diff --git a/examples/core/02_multi_drone.py b/examples/core/02_multi_drone.py index 93f012e0..d13e8757 100644 --- a/examples/core/02_multi_drone.py +++ b/examples/core/02_multi_drone.py @@ -1,4 +1,5 @@ """Spawns three drones, then sets all drones to have different control looprates.""" + import numpy as np from PyFlyt.core import Aviary diff --git a/examples/core/03_control.py b/examples/core/03_control.py index ec201ff4..f2843709 100644 --- a/examples/core/03_control.py +++ b/examples/core/03_control.py @@ -1,4 +1,5 @@ """Spawn a single drone, then command it to go to two setpoints consecutively, and plots the xyz output.""" + import matplotlib.pyplot as plt import numpy as np diff --git a/examples/core/04_camera.py b/examples/core/04_camera.py index aa00ac8b..ae879a8a 100644 --- a/examples/core/04_camera.py +++ b/examples/core/04_camera.py @@ -1,4 +1,5 @@ """Spawn a single drone and get its camera image.""" + import matplotlib.pyplot as plt import numpy as np diff --git a/examples/core/05_custom_controller.py b/examples/core/05_custom_controller.py index e2f12a99..60177e02 100644 --- a/examples/core/05_custom_controller.py +++ b/examples/core/05_custom_controller.py @@ -1,4 +1,5 @@ """Implement a controller that only wants the drone to be at x=1, y=1, z=1, while constantly spinning at yawrate=0.5, building off mode 6.""" + import numpy as np from PyFlyt.core import Aviary diff --git a/examples/core/06_spawning_objects.py b/examples/core/06_spawning_objects.py index 53a8d774..b727d5e0 100644 --- a/examples/core/06_spawning_objects.py +++ b/examples/core/06_spawning_objects.py @@ -1,4 +1,5 @@ """Spawn a duck object above the drone.""" + import numpy as np from PyFlyt.core import Aviary, loadOBJ, obj_collision, obj_visual diff --git a/examples/core/07_custom_uav.py b/examples/core/07_custom_uav.py index cbb38188..4375d556 100644 --- a/examples/core/07_custom_uav.py +++ b/examples/core/07_custom_uav.py @@ -1,4 +1,5 @@ """Implements a custom UAV in the Aviary.""" + import numpy as np from custom_uavs.rocket_brick import RocketBrick diff --git a/examples/core/08_mixed_drones.py b/examples/core/08_mixed_drones.py index 28ce45e0..ac7d27c6 100644 --- a/examples/core/08_mixed_drones.py +++ b/examples/core/08_mixed_drones.py @@ -1,4 +1,5 @@ """Spawns three different types of drones, then gets all their states.""" + import numpy as np from PyFlyt.core import Aviary diff --git a/examples/core/09_simple_wind.py b/examples/core/09_simple_wind.py index 45fd7a9d..c2900a71 100644 --- a/examples/core/09_simple_wind.py +++ b/examples/core/09_simple_wind.py @@ -1,4 +1,5 @@ """Implements a simple time invariant, stateless wind model.""" + import numpy as np from PyFlyt.core import Aviary diff --git a/examples/core/10_custom_wind.py b/examples/core/10_custom_wind.py index c4ee8a2c..7071f193 100644 --- a/examples/core/10_custom_wind.py +++ b/examples/core/10_custom_wind.py @@ -1,4 +1,5 @@ """Implements a custom stateful wind model.""" + import numpy as np from PyFlyt.core import Aviary diff --git a/examples/core/custom_uavs/rocket_brick.py b/examples/core/custom_uavs/rocket_brick.py index 88026b92..78dfe020 100644 --- a/examples/core/custom_uavs/rocket_brick.py +++ b/examples/core/custom_uavs/rocket_brick.py @@ -1,4 +1,5 @@ """Implements a custom brick with a booster attached.""" + from __future__ import annotations import os diff --git a/tests/test_core.py b/tests/test_core.py index 504872a7..e1a4afaf 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1,4 +1,5 @@ """Tests the the core API functionality.""" + from __future__ import annotations import numpy as np diff --git a/tests/test_gym_envs.py b/tests/test_gym_envs.py index 22265591..df8e6876 100644 --- a/tests/test_gym_envs.py +++ b/tests/test_gym_envs.py @@ -1,4 +1,5 @@ """Tests the API compatibility of all PyFlyt Gymnasium Envs.""" + import itertools import warnings diff --git a/tests/test_pz_envs.py b/tests/test_pz_envs.py index 6db4af4c..58342cbf 100644 --- a/tests/test_pz_envs.py +++ b/tests/test_pz_envs.py @@ -1,4 +1,5 @@ """Tests the API compatibility of all PyFlyt Pettingzoo Environments.""" + from __future__ import annotations import warnings From 029f83e4f25a470141e65a7e734dc23e41e8802f Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 16 Jul 2024 16:57:37 +0900 Subject: [PATCH 004/146] fix thing --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1b8272ff..1a50fe6e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,4 +28,3 @@ repos: additional_dependencies: ["pyright"] args: - --project=pyproject.toml - - --reportMissingImports=none From 32dda552c5913e5e1dfa1802a3495a1f81950b73 Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 16 Jul 2024 17:01:39 +0900 Subject: [PATCH 005/146] fix underline --- PyFlyt/gym_envs/utils/waypoint_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyFlyt/gym_envs/utils/waypoint_handler.py b/PyFlyt/gym_envs/utils/waypoint_handler.py index 522458f7..c5600ce2 100644 --- a/PyFlyt/gym_envs/utils/waypoint_handler.py +++ b/PyFlyt/gym_envs/utils/waypoint_handler.py @@ -114,7 +114,7 @@ def distance_to_next_target(self) -> float: """distance_to_next_target. Returns: - --- + ------- float: """ return self.new_distance From 4d34e65d93c90182ae68cb7b985ff8f99c47f171 Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 16 Jul 2024 17:07:06 +0900 Subject: [PATCH 006/146] fix junk --- PyFlyt/core/abstractions/base_controller.py | 1 - PyFlyt/core/abstractions/base_drone.py | 3 --- PyFlyt/core/abstractions/base_wind_field.py | 1 - PyFlyt/core/abstractions/boosters.py | 6 ------ PyFlyt/core/abstractions/boring_bodies.py | 3 --- PyFlyt/core/abstractions/camera.py | 4 ---- PyFlyt/core/abstractions/gimbals.py | 7 ------- PyFlyt/core/abstractions/lifting_surfaces.py | 17 ----------------- PyFlyt/core/abstractions/motors.py | 6 ------ PyFlyt/core/abstractions/pid.py | 4 ---- PyFlyt/core/aviary.py | 17 ----------------- PyFlyt/core/drones/fixedwing.py | 4 ---- PyFlyt/core/drones/quadx.py | 5 ----- PyFlyt/core/drones/rocket.py | 4 ---- PyFlyt/core/utils/load_objs.py | 3 --- .../fixedwing_envs/fixedwing_base_env.py | 4 ---- .../fixedwing_envs/fixedwing_waypoints_env.py | 3 --- PyFlyt/gym_envs/quadx_envs/quadx_base_env.py | 5 ----- PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py | 4 ---- PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py | 3 --- .../quadx_envs/quadx_pole_balance_env.py | 3 --- .../quadx_envs/quadx_pole_waypoints_env.py | 3 --- .../gym_envs/quadx_envs/quadx_waypoints_env.py | 3 --- PyFlyt/gym_envs/rocket_envs/rocket_base_env.py | 5 ----- .../gym_envs/rocket_envs/rocket_landing_env.py | 3 --- PyFlyt/gym_envs/utils/flatten_waypoint_env.py | 2 -- PyFlyt/gym_envs/utils/pole_handler.py | 4 ---- PyFlyt/gym_envs/utils/waypoint_handler.py | 2 -- .../fixedwing_envs/ma_fixedwing_base_env.py | 11 ----------- .../fixedwing_envs/ma_fixedwing_dogfight_env.py | 15 --------------- .../ma_fixedwing_team_dogfight_env.py | 15 --------------- PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py | 15 --------------- PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py | 7 ------- 33 files changed, 192 deletions(-) diff --git a/PyFlyt/core/abstractions/base_controller.py b/PyFlyt/core/abstractions/base_controller.py index 24bd6006..f2e6fec9 100644 --- a/PyFlyt/core/abstractions/base_controller.py +++ b/PyFlyt/core/abstractions/base_controller.py @@ -18,7 +18,6 @@ def step(self, state: np.ndarray, setpoint: np.ndarray) -> np.ndarray: """Step the controller. Args: - ---- state (np.ndarray): state setpoint (np.ndarray): setpoint diff --git a/PyFlyt/core/abstractions/base_drone.py b/PyFlyt/core/abstractions/base_drone.py index df1cf7e7..dabcc8bb 100644 --- a/PyFlyt/core/abstractions/base_drone.py +++ b/PyFlyt/core/abstractions/base_drone.py @@ -19,7 +19,6 @@ class DroneClass(ABC): Each drone inheriting from this class must have several attributes and methods implemented before they can be considered usable. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. start_pos (np.ndarray): an `(3,)` array for the starting X, Y, Z position for the drone. start_orn (np.ndarray): an `(3,)` array for the starting X, Y, Z orientation for the drone. @@ -83,7 +82,6 @@ def __init__( """Defines the default configuration for UAVs, to be used in conjunction with the Aviary class. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. start_pos (np.ndarray): an `(3,)` array for the starting X, Y, Z position for the drone. start_orn (np.ndarray): an `(3,)` array for the starting X, Y, Z orientation for the drone. @@ -269,7 +267,6 @@ def register_controller( """Default register_controller. Args: - ---- controller_id (int): ID to bind to this controller controller_constructor (type[ControlClass]): A class pointer to the controller implementation, must be subclass of `ControlClass`. base_mode (int): Whether this controller uses outputs of an underlying controller as setpoints. diff --git a/PyFlyt/core/abstractions/base_wind_field.py b/PyFlyt/core/abstractions/base_wind_field.py index ab8f697c..824ef5e6 100644 --- a/PyFlyt/core/abstractions/base_wind_field.py +++ b/PyFlyt/core/abstractions/base_wind_field.py @@ -48,7 +48,6 @@ def __call__(self, time: float, position: np.ndarray) -> np.ndarray: """When given the time float and a position as an (n, 3) array, must return a (n, 3) array representing the local wind velocity. Args: - ---- time (float): float representing the timestep of the simulation in seconds. position (np.ndarray): (n, 3) array representing a series of n positions to sample wind velocites. diff --git a/PyFlyt/core/abstractions/boosters.py b/PyFlyt/core/abstractions/boosters.py index 98703b9b..6b8a454a 100644 --- a/PyFlyt/core/abstractions/boosters.py +++ b/PyFlyt/core/abstractions/boosters.py @@ -17,7 +17,6 @@ class Boosters: Additionally, some boosters, typically of the solid fuel variety, cannot be extinguished and reignited, a property we call reignitability. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -57,7 +56,6 @@ def __init__( """Used for simulating an array of boosters. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -123,7 +121,6 @@ def reset(self, starting_fuel_ratio: float | np.ndarray = 1.0): """Reset the boosters. Args: - ---- starting_fuel_ratio (float | np.ndarray): ratio amount of fuel that the booster is reset to. """ @@ -143,7 +140,6 @@ def get_states(self) -> np.ndarray: - (c0, c1, ..., cn) represent the current throttle state Returns: - ------- np.ndarray: A (3 * num_boosters, ) array """ @@ -165,7 +161,6 @@ def physics_update( """Converts booster settings into forces on the booster and inertia change on fuel tank. Args: - ---- ignition (np.ndarray): (num_boosters,) array of booleans for engine on or off. pwm (np.ndarray): (num_boosters,) array of floats between [0, 1] for min or max thrust. rotation (np.ndarray): (num_boosters, 3, 3) rotation matrices to rotate each booster's thrust axis around, this is readily obtained from the `gimbals` component. @@ -225,7 +220,6 @@ def _compute_thrust_mass_inertia( """_compute_thrust_mass_inertia. Args: - ---- ignition (np.ndarray): (num_boosters,) array of booleans for engine on or off. pwm (np.ndarray): (num_boosters,) array of floats between [0, 1] for min or max thrust. diff --git a/PyFlyt/core/abstractions/boring_bodies.py b/PyFlyt/core/abstractions/boring_bodies.py index 3fbb6f60..ad16586f 100644 --- a/PyFlyt/core/abstractions/boring_bodies.py +++ b/PyFlyt/core/abstractions/boring_bodies.py @@ -14,7 +14,6 @@ class BoringBodies: The `BoringBodies` component is used to represent a normal body moving through the air. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -38,7 +37,6 @@ def __init__( """Used for simulating a body moving through the air. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -81,7 +79,6 @@ def state_update(self, rotation_matrix: np.ndarray): """Updates the local surface velocity of the boring body. Args: - ---- rotation_matrix (np.ndarray): (3, 3) rotation_matrix of the main body """ diff --git a/PyFlyt/core/abstractions/camera.py b/PyFlyt/core/abstractions/camera.py index e0efb5d1..6b8dfb30 100644 --- a/PyFlyt/core/abstractions/camera.py +++ b/PyFlyt/core/abstractions/camera.py @@ -20,7 +20,6 @@ class Camera: On image capture, the camera returns an RGBA image, a depth map, and a segmentation map with pixel values representing the IDs of objects in the environment. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. uav_id (int): ID of the drone. camera_id (int): integer representing the ID of the link that the camera is attached to. @@ -50,7 +49,6 @@ def __init__( """Used for implementing camera modules. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. uav_id (int): ID of the drone. camera_id (int): integer representing the ID of the link that the camera is attached to. @@ -102,7 +100,6 @@ def view_mat(self) -> np.ndarray: """Generates the view matrix for the camera depending on the current orientation and implicit parameters. Returns: - ------- np.ndarray: view matrix. """ @@ -163,7 +160,6 @@ def capture_image(self) -> tuple[np.ndarray, np.ndarray, np.ndarray]: """Captures the 3 relevant images from the camera. Returns: - ------- tuple[np.ndarray, np.ndarray, np.ndarray]: rgbaImg, depthImg, segImg """ diff --git a/PyFlyt/core/abstractions/gimbals.py b/PyFlyt/core/abstractions/gimbals.py index b2fdebed..a46abccf 100644 --- a/PyFlyt/core/abstractions/gimbals.py +++ b/PyFlyt/core/abstractions/gimbals.py @@ -17,7 +17,6 @@ class Gimbals: Each gimbal can rotate about two arbitrary axis that may not be orthogonal to each other. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -41,7 +40,6 @@ def __init__( """Used for simulating an array of gimbals. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -125,7 +123,6 @@ def get_states(self) -> np.ndarray: """Gets the current state of the components. Returns: - ------- np.ndarray: a (2 * num_gimbals, ) array where every pair of values represents the current state of the gimbal """ @@ -149,11 +146,9 @@ def compute_rotation(self, gimbal_command: np.ndarray) -> np.ndarray: """Returns a rotation vector after the gimbal rotation. Args: - ---- gimbal_command (np.ndarray): (num_gimbals, 2) array of floats between [-1, 1]. Returns: - ------- rotation_vector (np.ndarray): (num_gimbals, 3, 3) rotation matrices for all gimbals. """ @@ -192,7 +187,6 @@ def _jitted_compute_rotation( """Compute the rotation matrix given the gimbal action values. Args: - ---- gimbal_angles (np.ndarray): gimbal_angles w1 (np.ndarray): w1 from self w2 (np.ndarray): w2 from self @@ -200,7 +194,6 @@ def _jitted_compute_rotation( w2_squared (np.ndarray): w2_squared from self Returns: - ------- tuple[np.ndarray, np.ndarray]: """ diff --git a/PyFlyt/core/abstractions/lifting_surfaces.py b/PyFlyt/core/abstractions/lifting_surfaces.py index f0ad01ee..e394c9b5 100644 --- a/PyFlyt/core/abstractions/lifting_surfaces.py +++ b/PyFlyt/core/abstractions/lifting_surfaces.py @@ -17,7 +17,6 @@ class LiftingSurfaces: Simply pass it a list of `LiftingSurface` objects. Args: - ---- lifting_surfaces (list[LiftingSurface]): a list of `LiftingSurface` objects. """ @@ -26,7 +25,6 @@ def __init__(self, lifting_surfaces: list[LiftingSurface]): """__init__. Args: - ---- lifting_surfaces (list[LiftingSurface]): a list of `LiftingSurface` objects. """ @@ -49,7 +47,6 @@ def get_states(self) -> np.ndarray: """Gets the current state of the components. Returns: - ------- np.ndarray: a (num_surfaces, ) array representing the actuation state for each surface """ @@ -59,7 +56,6 @@ def physics_update(self, cmd: np.ndarray): """Converts actuation commands into forces on the lifting surfaces. Args: - ---- cmd (np.ndarray): the full command array, command mapping is handled through `command_id` and `command_sign` on each surface, normalized in [-1, 1]. """ @@ -78,7 +74,6 @@ def state_update(self, rotation_matrix: np.ndarray): """Updates all local surface velocities of the lifting surface, place under `update_state`. Args: - ---- rotation_matrix (np.ndarray): (3, 3) OR (num_surfaces, 3, 3) array rotation_matrix """ @@ -121,7 +116,6 @@ class LiftingSurface: The `Lifting Surface` component is used to simulate a single lifting surface based on "Real-time modeling of agile fixed-wing uav aerodynamics, Khan et. al.". Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -167,7 +161,6 @@ def __init__( """Used for simulating a single lifting surface. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -256,7 +249,6 @@ def get_states(self) -> float: """Gets the current state of the components. Returns: - ------- float: the level of deflection of the surface. """ @@ -266,7 +258,6 @@ def state_update(self, surface_velocity: np.ndarray): """Updates the local surface velocity of the lifting surface. Args: - ---- surface_velocity (np.ndarray): surface_velocity. """ @@ -276,11 +267,9 @@ def physics_update(self, cmd: float): """Converts a commanded actuation state into forces on the lifting surface. Args: - ---- cmd (float): normalized actuation in [-1, 1]. Returns: - ------- tuple[np.ndarray, np.ndarray]: vec3 force, vec3 torque """ @@ -342,13 +331,11 @@ def _compute_aoa_freestream( """Computes the angle of attack (alpha) as well as the freestream speed. Args: - ---- local_surface_velocity (np.ndarray): local_surface_velocity from self lift_unit (np.ndarray): lift_unit from self drag_unit (np.ndarray): drag_unit from self Returns: - ------- tuple[float, float]: """ @@ -378,7 +365,6 @@ def _jitted_compute_aero_data( """Computes the relevant aerodynamic data depending on the current state of the lifting surface. Args: - ---- alpha (float): alpha aspect (float): aspect from self flap_to_chord (float): flap_to_chord from self @@ -393,7 +379,6 @@ def _jitted_compute_aero_data( Cd_0 (float): Cd_0 from self Returns: - ------- tuple[float, float, float]: """ @@ -480,7 +465,6 @@ def _jitted_compute_force_torque( """Compute the force and torque vectors on the surface. Args: - ---- alpha (float): alpha freestream_speed (float): freestream_speed Cl (float): Cl @@ -494,7 +478,6 @@ def _jitted_compute_force_torque( torque_unit (np.ndarray): torque_unit from self Returns: - ------- tuple[np.ndarray, np.ndarray]: """ diff --git a/PyFlyt/core/abstractions/motors.py b/PyFlyt/core/abstractions/motors.py index 9483d9e2..189fbda5 100644 --- a/PyFlyt/core/abstractions/motors.py +++ b/PyFlyt/core/abstractions/motors.py @@ -18,7 +18,6 @@ class Motors: The maximum RPM can be easily computed using `max_rpm = max_thrust / thrust_coef`. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -50,7 +49,6 @@ def __init__( """Used for simulating an array of motors. Args: - ---- p (bullet_client.BulletClient): PyBullet physics client ID. physics_period (float): physics period of the simulation. np_random (np.random.RandomState): random number generator of the simulation. @@ -100,7 +98,6 @@ def get_states(self) -> np.ndarray: """Gets the current state of the components. Returns: - ------- np.ndarray: an (num_motors, ) array for the current throttle level of each motor """ @@ -116,7 +113,6 @@ def physics_update( """Converts motor PWM values to forces, this motor allows negative thrust. Args: - ---- pwm (np.ndarray): [num_motors, ] array defining the pwm values of each motor from -1 to 1. rotation (np.ndarray): (num_motors, 3, 3) rotation matrices to rotate each booster's thrust axis around, this is readily obtained from the `gimbals` component. @@ -171,7 +167,6 @@ def _jitted_compute_thrust_torque( """Computes the thrusts and torques for the array of motors. Args: - ---- rotation (None | np.ndarray): rotation throttle (np.ndarray): throttle from self max_rpm (np.ndarray): max_rpm from self @@ -180,7 +175,6 @@ def _jitted_compute_thrust_torque( torque_coef (np.ndarray): torque_coef from self Returns: - ------- tuple[np.ndarray, np.ndarray]: """ diff --git a/PyFlyt/core/abstractions/pid.py b/PyFlyt/core/abstractions/pid.py index 3455c123..98637af9 100644 --- a/PyFlyt/core/abstractions/pid.py +++ b/PyFlyt/core/abstractions/pid.py @@ -32,7 +32,6 @@ def __init__( Because of this, all arguments passed into this function, except `period`, must be a 1D np array and have the same shape. Example: - ------- Invalid implementation: >>> controller = PID(0.5, 0.4, 0.3, 1.0, 0.01) >>> controller.step(5.0, 2.0) @@ -46,7 +45,6 @@ def __init__( >>> controller.step(np.array([5.0]), np.array([2.0])) Args: - ---- kp (np.ndarray): kp ki (np.ndarray): ki kd (np.ndarray): kd @@ -73,12 +71,10 @@ def step(self, state: np.ndarray, setpoint: np.ndarray) -> np.ndarray: """Steps the PID controller. Args: - ---- state (np.ndarray): the state of the system, must be same shape as controller parameters. setpoint (np.ndarray): the setpoint of the system, must be same shape as controller parameters. Returns: - ------- np.ndarray: """ diff --git a/PyFlyt/core/aviary.py b/PyFlyt/core/aviary.py index 31b8bed5..6eded4ce 100644 --- a/PyFlyt/core/aviary.py +++ b/PyFlyt/core/aviary.py @@ -25,11 +25,9 @@ def __init__(self, message: str) -> None: """__init__. Args: - ---- message (str): message Returns: - ------- None: """ @@ -40,7 +38,6 @@ def __str__(self) -> str: """__str__. Returns: - ------- str: """ @@ -54,7 +51,6 @@ class Aviary(bullet_client.BulletClient): It provides a common endpoint from where users may control drones or define tasks. Args: - ---- start_pos (np.ndarray): an `(n, 3)` array for the starting X, Y, Z positions for each drone. start_orn (np.ndarray): an `(n, 3)` array for the starting orientations for each drone, in terms of Euler angles. drone_type (str | Sequence[str]): a _lowercase_ string representing what type of drone to spawn. @@ -89,7 +85,6 @@ def __init__( The Aviary also handles dealing with physics and control looprates, as well as automatic construction of several default UAVs and their corresponding cameras. Args: - ---- start_pos (np.ndarray): an `(n, 3)` array for the starting X, Y, Z positions for each drone. start_orn (np.ndarray): an `(n, 3)` array for the starting orientations for each drone, in terms of Euler angles. drone_type (str | Sequence[str]): a _lowercase_ string representing what type of drone to spawn. @@ -208,7 +203,6 @@ def reset(self, seed: None | int = None) -> None: """Resets the simulation. Args: - ---- seed (None | int): seed """ @@ -319,7 +313,6 @@ def register_wind_field_function(self, wind_field: Callable) -> None: """For less complicated wind field models (time invariant models), this allows the registration of a normal function as a wind field model. Args: - ---- wind_field (Callable): given the time float and a position as an (n, 3) array, must return a (n, 3) array representing the local wind velocity. """ @@ -337,11 +330,9 @@ def state(self, index: DroneIndex) -> np.ndarray: - `state[3, :]` represents ground frame linear position Args: - ---- index (DRONE_INDEX): index Returns: - ------- np.ndarray: state """ @@ -357,11 +348,9 @@ def aux_state(self, index: DroneIndex) -> np.ndarray: - etc... Args: - ---- index (DRONE_INDEX): index Returns: - ------- np.ndarray: auxiliary state """ @@ -382,7 +371,6 @@ def all_states(self) -> list[np.ndarray]: This function is not very optimized, if you want the state of a single drone, do `state(i)`. Returns: - ------- np.ndarray: list of states """ @@ -401,7 +389,6 @@ def all_aux_states(self) -> list[np.ndarray]: This function is not very optimized, if you want the aux state of a single drone, do `aux_state(i)`. Returns: - ------- np.ndarray: list of auxiliary states """ @@ -425,7 +412,6 @@ def set_armed(self, settings: int | bool | list[int] | list[bool]) -> None: """Sets the arming state of each drone in the environment. Unarmed drones won't receive updates and will ragdoll. Args: - ---- settings (int | bool | list[int | bool]): arm setting """ @@ -446,7 +432,6 @@ def set_mode(self, flight_modes: int | list[int]) -> None: When this is a list of integers, sets a different flight mode for each drone depending on the list. Args: - ---- flight_modes (int | list[int]): flight mode """ @@ -464,7 +449,6 @@ def set_setpoint(self, index: DroneIndex, setpoint: np.ndarray) -> None: """Sets the setpoint of one drone in the environment. Args: - ---- index (DRONE_INDEX): index setpoint (np.ndarray): setpoint @@ -475,7 +459,6 @@ def set_all_setpoints(self, setpoints: np.ndarray) -> None: """Sets the setpoints of each drone in the environment. Args: - ---- setpoints (np.ndarray): list of setpoints """ diff --git a/PyFlyt/core/drones/fixedwing.py b/PyFlyt/core/drones/fixedwing.py index 7348992c..a8bba302 100644 --- a/PyFlyt/core/drones/fixedwing.py +++ b/PyFlyt/core/drones/fixedwing.py @@ -37,7 +37,6 @@ def __init__( """Creates a Fixedwing UAV and handles all relevant control and physics. Args: - ---- p (bullet_client.BulletClient): p start_pos (np.ndarray): start_pos start_orn (np.ndarray): start_orn @@ -212,7 +211,6 @@ def set_mode(self, mode) -> None: - 0: Pitch, Roll, Yaw, Thrust Args: - ---- mode (int): flight mode """ @@ -232,7 +230,6 @@ def update_control(self, physics_step: int) -> None: """Runs through controllers. Args: - ---- physics_step (int): the current physics step """ @@ -297,7 +294,6 @@ def update_last(self, physics_step: int) -> None: """Updates things only at the end of `Aviary.step()`. Args: - ---- physics_step (int): the current physics step """ diff --git a/PyFlyt/core/drones/quadx.py b/PyFlyt/core/drones/quadx.py index 95ad404b..782ac508 100644 --- a/PyFlyt/core/drones/quadx.py +++ b/PyFlyt/core/drones/quadx.py @@ -40,7 +40,6 @@ def __init__( """Creates a drone in the QuadX configuration and handles all relevant control and physics. Args: - ---- p (bullet_client.BulletClient): p start_pos (np.ndarray): start_pos start_orn (np.ndarray): start_orn @@ -254,7 +253,6 @@ def set_mode(self, mode: int) -> None: - T = thrust Args: - ---- mode (int): flight mode """ @@ -383,7 +381,6 @@ def register_controller( """Registers a new controller for the UAV. Args: - ---- controller_id (int): controller_id controller_constructor (type[ControlClass]): controller_constructor base_mode (int): base_mode @@ -405,7 +402,6 @@ def update_control(self, physics_step: int) -> None: """Runs through controllers. Args: - ---- physics_step (int): the current physics step """ @@ -542,7 +538,6 @@ def update_last(self, physics_step: int) -> None: """Updates things only at the end of `Aviary.step()`. Args: - ---- physics_step (int): the current physics step """ diff --git a/PyFlyt/core/drones/rocket.py b/PyFlyt/core/drones/rocket.py index 7dee7fac..05809ff4 100644 --- a/PyFlyt/core/drones/rocket.py +++ b/PyFlyt/core/drones/rocket.py @@ -49,7 +49,6 @@ def __init__( """Creates a drone in the QuadX configuration and handles all relevant control and physics. Args: - ---- p (bullet_client.BulletClient): p start_pos (np.ndarray): start_pos start_orn (np.ndarray): start_orn @@ -243,7 +242,6 @@ def set_mode(self, mode) -> None: - 0: finlet x deflection, finlet y deflection, finlet yaw, ignition, throttle, booster gimbal axis 1, booster gimbal axis 2 Args: - ---- mode (int): flight mode """ @@ -253,7 +251,6 @@ def update_control(self, physics_step: int) -> None: """Runs through controllers. Args: - ---- physics_step (int): the current physics step """ @@ -338,7 +335,6 @@ def update_last(self, physics_step: int) -> None: """Updates things only at the end of `Aviary.step()`. Args: - ---- physics_step (int): the current physics step """ diff --git a/PyFlyt/core/utils/load_objs.py b/PyFlyt/core/utils/load_objs.py index da0d49f7..906e885c 100644 --- a/PyFlyt/core/utils/load_objs.py +++ b/PyFlyt/core/utils/load_objs.py @@ -19,7 +19,6 @@ def loadOBJ( """Loads an object into the environment. Args: - ---- env (Aviary): env fileName (str): fileName visualId (int): visualId @@ -57,7 +56,6 @@ def obj_visual( """Loads an object visual model. Args: - ---- env (Aviary): env fileName (str): fileName meshScale (list[float] | np.ndarray): meshScale @@ -81,7 +79,6 @@ def obj_collision( """Loads an object collision model. Args: - ---- env (Aviary): env fileName (str): fileName meshScale (list[float] | np.ndarray): meshScale diff --git a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py index e30aff99..01999f56 100644 --- a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py +++ b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_base_env.py @@ -33,7 +33,6 @@ def __init__( """__init__. Args: - ---- start_pos (np.ndarray): start_pos start_orn (np.ndarray): start_orn flight_mode (int): flight_mode @@ -126,7 +125,6 @@ def reset( """reset. Args: - ---- seed: seed to pass to the base environment. options: None @@ -263,11 +261,9 @@ def step(self, action: np.ndarray) -> tuple[Any, float, bool, bool, dict]: """Steps the environment. Args: - ---- action (np.ndarray): action Returns: - ------- state, reward, termination, truncation, info """ diff --git a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py index c4ff0a82..dad83e2a 100644 --- a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py +++ b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py @@ -18,7 +18,6 @@ class FixedwingWaypointsEnv(FixedwingBaseEnv): The target is a set of `[x, y, z]` targets in space Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. num_targets (int): number of waypoints in the environment. goal_reach_distance (float): distance to the waypoints for it to be considered reached. @@ -48,7 +47,6 @@ def __init__( """__init__. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. num_targets (int): number of waypoints in the environment. goal_reach_distance (float): distance to the waypoints for it to be considered reached. @@ -109,7 +107,6 @@ def reset( """reset. Args: - ---- seed: seed to pass to the base environment. options: None diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_base_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_base_env.py index e54de615..559b4b30 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_base_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_base_env.py @@ -33,7 +33,6 @@ def __init__( """__init__. Args: - ---- start_pos (np.ndarray): start_pos start_orn (np.ndarray): start_orn flight_mode (int): flight_mode @@ -138,12 +137,10 @@ def reset( """reset. Args: - ---- seed (None | int): seed options (dict[str, Any]): options Returns: - ------- tuple[Any, dict[str, Any]]: """ @@ -273,11 +270,9 @@ def step(self, action: np.ndarray) -> tuple[Any, float, bool, bool, dict[str, An """Steps the environment. Args: - ---- action (np.ndarray): action Returns: - ------- state, reward, termination, truncation, info """ diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py index b2b6c330..3d71f161 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_gates_env.py @@ -24,7 +24,6 @@ class QuadXGatesEnv(QuadXBaseEnv): Reward is -(distance from waypoint + angle error) for each timestep, and -100.0 for hitting the ground. Args: - ---- flight_mode (int): the flight mode of the UAV num_targets (int): num_targets goal_reach_distance (float): goal_reach_distance @@ -60,7 +59,6 @@ def __init__( """__init__. Args: - ---- flight_mode (int): the flight mode of the UAV num_targets (int): num_targets goal_reach_distance (float): goal_reach_distance @@ -123,7 +121,6 @@ def reset( """Resets the environment. Args: - ---- seed: seed to pass to the base environment. options: None @@ -207,7 +204,6 @@ def colour_dead_gate(self, gate: int) -> None: """Colours the gates that are done. Args: - ---- gate (int): body ID of the gate """ diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py index 081be0a0..ae535386 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_hover_env.py @@ -16,7 +16,6 @@ class QuadXHoverEnv(QuadXBaseEnv): The target is to not crash for the longest time possible. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. flight_mode (int): the flight mode of the UAV flight_dome_size (float): size of the allowable flying area. @@ -42,7 +41,6 @@ def __init__( """__init__. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. flight_mode (int): the flight mode of the UAV flight_dome_size (float): size of the allowable flying area. @@ -75,7 +73,6 @@ def reset( """reset. Args: - ---- seed: seed to pass to the base environment. options: None diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py index 5799fefe..6c2ec3f7 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_pole_balance_env.py @@ -18,7 +18,6 @@ class QuadXPoleBalanceEnv(QuadXBaseEnv): The target is to not crash and not let the pole hit the ground for the longest time possible. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. flight_mode (int): the flight mode of the UAV flight_dome_size (float): size of the allowable flying area. @@ -44,7 +43,6 @@ def __init__( """__init__. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. flight_mode (int): the flight mode of the UAV. flight_dome_size (float): size of the allowable flying area. @@ -87,7 +85,6 @@ def reset( """reset. Args: - ---- seed: seed to pass to the base environment. options: None diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py index 33a87c5a..953ed24a 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_pole_waypoints_env.py @@ -19,7 +19,6 @@ class QuadXPoleWaypointsEnv(QuadXBaseEnv): The target is to get to a set of `[x, y, z]` waypoints in space without dropping the pole. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. num_targets (int): number of waypoints in the environment. goal_reach_distance (float): distance to the waypoints for it to be considered reached. @@ -49,7 +48,6 @@ def __init__( """__init__. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. num_targets (int): number of waypoints in the environment. goal_reach_distance (float): distance to the waypoints for it to be considered reached. @@ -120,7 +118,6 @@ def reset( """Resets the environment. Args: - ---- seed: seed to pass to the base environment. options: None diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py index adc4fd25..635fe44b 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py @@ -18,7 +18,6 @@ class QuadXWaypointsEnv(QuadXBaseEnv): The target is a set of `[x, y, z, (optional) yaw]` waypoints in space. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. num_targets (int): number of waypoints in the environment. use_yaw_targets (bool): whether to match yaw targets before a waypoint is considered reached. @@ -52,7 +51,6 @@ def __init__( """__init__. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. num_targets (int): number of waypoints in the environment. use_yaw_targets (bool): whether to match yaw targets before a waypoint is considered reached. @@ -115,7 +113,6 @@ def reset( """Resets the environment. Args: - ---- seed: seed to pass to the base environment. options: None diff --git a/PyFlyt/gym_envs/rocket_envs/rocket_base_env.py b/PyFlyt/gym_envs/rocket_envs/rocket_base_env.py index 9448218b..77a2e67e 100644 --- a/PyFlyt/gym_envs/rocket_envs/rocket_base_env.py +++ b/PyFlyt/gym_envs/rocket_envs/rocket_base_env.py @@ -33,7 +33,6 @@ def __init__( """__init__. Args: - ---- start_pos (np.ndarray): start_pos start_orn (np.ndarray): start_orn drone_type (str): drone_type @@ -137,7 +136,6 @@ def reset( """Resets the environment. Args: - ---- seed: int options: None @@ -283,7 +281,6 @@ def compute_base_term_trunc_reward( """compute_base_term_trunc_reward. Args: - ---- collision_ignore_mask (np.ndarray | list[int]): list of ids to ignore collisions between """ @@ -316,11 +313,9 @@ def step(self, action: np.ndarray): """Steps the environment. Args: - ---- action (np.ndarray): action Returns: - ------- state, reward, termination, truncation, info """ diff --git a/PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py b/PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py index f29b1090..23b468ca 100644 --- a/PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py +++ b/PyFlyt/gym_envs/rocket_envs/rocket_landing_env.py @@ -19,7 +19,6 @@ class RocketLandingEnv(RocketBaseEnv): The goal is to land the rocket on the landing pad. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. ceiling (float): the absolute ceiling of the flying area. max_displacement (float): the maximum horizontal distance the rocket can go. @@ -45,7 +44,6 @@ def __init__( """__init__. Args: - ---- sparse_reward (bool): whether to use sparse rewards or not. ceiling (float): the absolute ceiling of the flying area. max_displacement (float): the maximum horizontal distance the rocket can go. @@ -94,7 +92,6 @@ def reset( """Resets the environment. Args: - ---- seed: int options: None diff --git a/PyFlyt/gym_envs/utils/flatten_waypoint_env.py b/PyFlyt/gym_envs/utils/flatten_waypoint_env.py index 1e094f9c..d6b3ec32 100644 --- a/PyFlyt/gym_envs/utils/flatten_waypoint_env.py +++ b/PyFlyt/gym_envs/utils/flatten_waypoint_env.py @@ -16,7 +16,6 @@ def __init__(self, env: Env, context_length=2): """__init__. Args: - ---- env (Env): a PyFlyt Waypoints environment. context_length: how many waypoints should be included in the flattened observation space. @@ -44,7 +43,6 @@ def observation(self, observation) -> np.ndarray: """Flattens an observation from the super env. Args: - ---- observation: a dictionary observation with an "attitude" and "target_deltas" keys. """ diff --git a/PyFlyt/gym_envs/utils/pole_handler.py b/PyFlyt/gym_envs/utils/pole_handler.py index f6a62d4b..5cc7c4d6 100644 --- a/PyFlyt/gym_envs/utils/pole_handler.py +++ b/PyFlyt/gym_envs/utils/pole_handler.py @@ -34,7 +34,6 @@ def reset( """reset. Args: - ---- p (bullet_client.BulletClient): p start_location (np.ndarray): start_location @@ -62,7 +61,6 @@ def leaningness(self) -> float: """The lean of the pole, minimum of 0.0 and maximum of 1.0. Returns: - ------- float: """ @@ -74,13 +72,11 @@ def compute_state( """compute_state. Args: - ---- rotation (np.ndarray): rotation uav_lin_pos (np.ndarray): uav_lin_pos uav_lin_vel (np.ndarray): uav_lin_vel Returns: - ------- tuple[np.ndarray, np.ndarray, np.ndarray]: top_pos, top_vel, bot_pos, bot_vel """ diff --git a/PyFlyt/gym_envs/utils/waypoint_handler.py b/PyFlyt/gym_envs/utils/waypoint_handler.py index c5600ce2..d70fc527 100644 --- a/PyFlyt/gym_envs/utils/waypoint_handler.py +++ b/PyFlyt/gym_envs/utils/waypoint_handler.py @@ -26,7 +26,6 @@ def __init__( """__init__. Args: - ---- enable_render (bool): enable_render num_targets (int): num_targets use_yaw_targets (bool): use_yaw_targets @@ -114,7 +113,6 @@ def distance_to_next_target(self) -> float: """distance_to_next_target. Returns: - ------- float: """ return self.new_distance diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py index 7e3191c0..7f217455 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py @@ -30,7 +30,6 @@ def __init__( """__init__. Args: - ---- start_pos (np.ndarray): start_pos start_orn (np.ndarray): start_orn assisted_flight (bool): assisted_flight @@ -136,7 +135,6 @@ def observation_space(self, agent: Any = None) -> Space: """observation_space. Returns: - ------- Space: """ @@ -146,7 +144,6 @@ def action_space(self, agent: Any = None) -> spaces.Box: """action_space. Returns: - ------- spaces.Box: """ @@ -163,12 +160,10 @@ def reset( """reset. Args: - ---- seed (None | int): seed options (dict | None): options Returns: - ------- tuple[dict[str, Any], dict[str, Any]]: """ @@ -262,11 +257,9 @@ def compute_observation_by_id(self, agent_id: int) -> Any: """compute_observation_by_id. Args: - ---- agent_id (int): agent_id Returns: - ------- Any: """ @@ -302,11 +295,9 @@ def compute_term_trunc_reward_info_by_id( """compute_term_trunc_reward_info_by_id. Args: - ---- agent_id (int): agent_id Returns: - ------- Tuple[bool, bool, float, dict[str, Any]]: """ @@ -324,11 +315,9 @@ def step( """step. Args: - ---- actions (dict[str, np.ndarray]): actions Returns: - ------- tuple[dict[str, Any], dict[str, float], dict[str, bool], dict[str, bool], dict[str, dict[str, Any]]]: """ diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py index 4ec470a4..bd3fd370 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py @@ -14,7 +14,6 @@ class MAFixedwingDogfightEnv(MAFixedwingBaseEnv): """Base Dogfighting Environment for the Acrowing model using the PettingZoo API. Args: - ---- spawn_height (float): how high to spawn the agents at the beginning of the simulation. damage_per_hit (float): how much damage per hit per physics step, each agent starts with a health of 1.0. lethal_distance (float): how close before weapons become effective. @@ -49,7 +48,6 @@ def __init__( """__init__. Args: - ---- spawn_height (float): how high to spawn the agents at the beginning of the simulation. damage_per_hit (float): how much damage per hit per physics step, each agent starts with a health of 1.0. lethal_distance (float): how close before weapons become effective. @@ -92,11 +90,9 @@ def observation_space(self, agent: Any = None) -> spaces.Box: """observation_space. Args: - ---- agent (Any): agent Returns: - ------- spaces.Box: """ @@ -106,11 +102,9 @@ def _get_start_pos_orn(self, seed: None | int) -> tuple[np.ndarray, np.ndarray]: """_get_start_pos_orn. Args: - ---- seed (None | int): seed Returns: - ------- tuple[np.ndarray, np.ndarray]: """ @@ -129,12 +123,10 @@ def reset( """reset. Args: - ---- seed (None | int): seed options (dict[str, Any]): options Returns: - ------- tuple[dict[str, Any], dict[str, Any]]: """ @@ -180,7 +172,6 @@ def _compute_agent_states(self) -> None: """_compute_agent_states. Returns: - ------- None: """ @@ -266,11 +257,9 @@ def compute_observation_by_id(self, agent_id: int) -> np.ndarray: """compute_observation_by_id. Args: - ---- agent_id (int): agent_id Returns: - ------- np.ndarray: """ @@ -341,11 +330,9 @@ def compute_rotation_forward(orn: np.ndarray) -> tuple[np.ndarray, np.ndarray]: """Computes the rotation matrix and forward vector of an aircraft given its orientation. Args: - ---- orn (np.ndarray): an [n, 3] array of each drone's orientation Returns: - ------- np.ndarray: an [n, 3, 3] rotation matrix of each aircraft np.ndarray: an [n, 3] forward vector of each aircraft @@ -388,11 +375,9 @@ def step( """step. Args: - ---- actions (dict[str, np.ndarray]): actions Returns: - ------- tuple[ dict[str, Any], dict[str, float], diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py index 486ab3f8..8295aa33 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py @@ -14,7 +14,6 @@ class MAFixedwingTeamDogfightEnv(MAFixedwingBaseEnv): """Team Dogfighting Environment for the Acrowing model using the PettingZoo API. Args: - ---- spawn_height (float): how high to spawn the agents at the beginning of the simulation. damage_per_hit (float): how much damage per hit per physics step, each agent starts with a health of 1.0. lethal_distance (float): how close before weapons become effective. @@ -50,7 +49,6 @@ def __init__( """__init__. Args: - ---- team_size (int): number of planes that comprises a team. spawn_height (float): how high to spawn the agents at the beginning of the simulation. damage_per_hit (float): how much damage per hit per physics step, each agent starts with a health of 1.0. @@ -94,11 +92,9 @@ def observation_space(self, agent: Any = None) -> spaces.Box: """observation_space. Args: - ---- agent (Any): agent Returns: - ------- spaces.Box: """ @@ -108,11 +104,9 @@ def _get_start_pos_orn(self, seed: None | int) -> tuple[np.ndarray, np.ndarray]: """_get_start_pos_orn. Args: - ---- seed (None | int): seed Returns: - ------- tuple[np.ndarray, np.ndarray]: """ @@ -131,12 +125,10 @@ def reset( """reset. Args: - ---- seed (None | int): seed options (dict[str, Any]): options Returns: - ------- tuple[dict[str, Any], dict[str, Any]]: """ @@ -182,7 +174,6 @@ def _compute_agent_states(self) -> None: """_compute_agent_states. Returns: - ------- None: """ @@ -268,11 +259,9 @@ def compute_observation_by_id(self, agent_id: int) -> np.ndarray: """compute_observation_by_id. Args: - ---- agent_id (int): agent_id Returns: - ------- np.ndarray: """ @@ -343,11 +332,9 @@ def compute_rotation_forward(orn: np.ndarray) -> tuple[np.ndarray, np.ndarray]: """Computes the rotation matrix and forward vector of an aircraft given its orientation. Args: - ---- orn (np.ndarray): an [n, 3] array of each drone's orientation Returns: - ------- np.ndarray: an [n, 3, 3] rotation matrix of each aircraft np.ndarray: an [n, 3] forward vector of each aircraft @@ -390,11 +377,9 @@ def step( """step. Args: - ---- actions (dict[str, np.ndarray]): actions Returns: - ------- tuple[ dict[str, Any], dict[str, float], diff --git a/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py b/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py index 1015cb77..7162aa5c 100644 --- a/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py +++ b/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py @@ -34,7 +34,6 @@ def __init__( """__init__. Args: - ---- start_pos (np.ndarray): start_pos start_orn (np.ndarray): start_orn flight_mode (int): flight_mode @@ -155,11 +154,9 @@ def observation_space(self, agent: Any = None) -> Space: """observation_space. Args: - ---- agent (Any): agent Returns: - ------- Space: """ @@ -169,11 +166,9 @@ def action_space(self, agent: Any = None) -> spaces.Box: """action_space. Args: - ---- agent (Any): agent Returns: - ------- spaces.Box: """ @@ -190,12 +185,10 @@ def reset( """reset. Args: - ---- seed (None | int): seed options (None | dict[str, Any]): options Returns: - ------- tuple[dict[str, Any], dict[str, Any]]: """ @@ -210,13 +203,11 @@ def begin_reset( """The first half of the reset function. Args: - ---- seed (None | int): seed options (None | dict[str, Any]): options drone_options (None | dict[str, Any] | Sequence[dict[str, Any]]): drone_options Returns: - ------- None: """ @@ -283,11 +274,9 @@ def compute_observation_by_id(self, agent_id: int) -> Any: """compute_observation_by_id. Args: - ---- agent_id (int): agent_id Returns: - ------- Any: """ @@ -326,11 +315,9 @@ def compute_term_trunc_reward_info_by_id( """compute_term_trunc_reward_info_by_id. Args: - ---- agent_id (int): agent_id Returns: - ------- Tuple[bool, bool, float, dict[str, Any]]: """ @@ -348,11 +335,9 @@ def step( """step. Args: - ---- actions (dict[str, np.ndarray]): actions Returns: - ------- tuple[dict[str, Any], dict[str, float], dict[str, bool], dict[str, bool], dict[str, dict[str, Any]]]: """ diff --git a/PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py b/PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py index cbe290cf..4f8f26cb 100644 --- a/PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py +++ b/PyFlyt/pz_envs/quadx_envs/ma_quadx_hover_env.py @@ -17,7 +17,6 @@ class MAQuadXHoverEnv(MAQuadXBaseEnv): The target is for each agent to not crash for the longest time possible. Args: - ---- start_pos (np.ndarray): an (num_drones x 3) numpy array specifying the starting positions of each agent. start_orn (np.ndarray): an (num_drones x 3) numpy array specifying the starting orientations of each agent. sparse_reward (bool): whether to use sparse rewards or not. @@ -54,7 +53,6 @@ def __init__( """__init__. Args: - ---- start_pos (np.ndarray): an (num_drones x 3) numpy array specifying the starting positions of each agent. start_orn (np.ndarray): an (num_drones x 3) numpy array specifying the starting orientations of each agent. sparse_reward (bool): whether to use sparse rewards or not. @@ -90,11 +88,9 @@ def observation_space(self, agent: Any = None) -> spaces.Space: """observation_space. Args: - ---- agent (Any): agent Returns: - ------- spaces.Space: """ @@ -106,7 +102,6 @@ def reset( """reset. Args: - ---- seed: seed to pass to the base environment. options: None @@ -125,11 +120,9 @@ def compute_observation_by_id(self, agent_id: int) -> np.ndarray: """compute_observation_by_id. Args: - ---- agent_id (int): agent_id Returns: - ------- np.ndarray: """ From 3cd5678e128f6bc8049e636899781fec007e92a5 Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 16 Jul 2024 17:24:05 +0900 Subject: [PATCH 007/146] stop using ruff --- .gitignore | 1 - .pre-commit-config.yaml | 63 +- PyFlyt/core/abstractions/base_wind_field.py | 9 +- PyFlyt/core/abstractions/boosters.py | 11 +- PyFlyt/core/abstractions/lifting_surfaces.py | 4 +- PyFlyt/core/drones/fixedwing.py | 4 +- PyFlyt/core/drones/quadx.py | 8 +- PyFlyt/core/drones/rocket.py | 4 +- .../fixedwing_envs/fixedwing_waypoints_env.py | 2 +- .../quadx_envs/quadx_waypoints_env.py | 2 +- PyFlyt/gym_envs/utils/flatten_waypoint_env.py | 12 +- PyFlyt/gym_envs/utils/waypoint_handler.py | 1 - .../models/vehicles/quadplane/quadplane.yaml | 10 +- .../fixedwing_envs/ma_fixedwing_base_env.py | 4 +- .../ma_fixedwing_dogfight_env.py | 20 +- .../ma_fixedwing_team_dogfight_env.py | 20 +- .../pz_envs/quadx_envs/ma_quadx_base_env.py | 4 +- docs/.buildinfo | 4 - docs/.nojekyll | 0 docs/_sources/documentation.md.txt | 53 - docs/_sources/documentation/core.md.txt | 80 -- .../documentation/core/abstractions.md.txt | 31 - .../core/abstractions/base_drone.md.txt | 106 -- .../core/abstractions/boosters.md.txt | 34 - .../core/abstractions/boring_bodies.md.txt | 30 - .../core/abstractions/camera.md.txt | 14 - .../core/abstractions/gimbals.md.txt | 15 - .../core/abstractions/lifting_surfaces.md.txt | 16 - .../core/abstractions/motors.md.txt | 26 - .../_sources/documentation/core/aviary.md.txt | 263 ----- .../_sources/documentation/core/drones.md.txt | 12 - .../core/drones/fixedwing.md.txt | 16 - .../documentation/core/drones/quadx.md.txt | 27 - .../documentation/core/drones/rocket.md.txt | 25 - docs/_sources/documentation/core/wind.md.txt | 49 - docs/_sources/documentation/gym_envs.md.txt | 32 - .../gym_envs/fixedwing_waypoints_env.md.txt | 50 - .../gym_envs/quadx_hover_env.md.txt | 29 - .../gym_envs/quadx_pole_balance_env.md.txt | 29 - .../gym_envs/quadx_pole_waypoints_env.md.txt | 50 - .../gym_envs/quadx_waypoints_env.md.txt | 50 - .../gym_envs/rocket_landing_env.md.txt | 29 - docs/_sources/documentation/pz_envs.md.txt | 29 - .../pz_envs/ma_fixedwing_dogfight_env.md.txt | 41 - .../pz_envs/ma_quadx_hover_env.md.txt | 31 - docs/_sources/index.md.txt | 27 - docs/_sources/paper.md.txt | 17 - docs/_sources/tutorials.md.txt | 7 - docs/_static/basic.css | 925 ----------------- docs/_static/doctools.js | 156 --- docs/_static/documentation_options.js | 13 - docs/_static/file.png | Bin 286 -> 0 bytes docs/_static/language_data.js | 199 ---- docs/_static/minus.png | Bin 90 -> 0 bytes docs/_static/plus.png | Bin 90 -> 0 bytes docs/_static/pygments.css | 152 --- docs/_static/scripts/bootstrap.js | 3 - docs/_static/scripts/bootstrap.js.LICENSE.txt | 5 - docs/_static/scripts/bootstrap.js.map | 1 - docs/_static/scripts/pydata-sphinx-theme.js | 2 - .../scripts/pydata-sphinx-theme.js.map | 1 - docs/_static/searchtools.js | 619 ----------- docs/_static/sphinx_highlight.js | 154 --- docs/_static/styles/bootstrap.css | 6 - docs/_static/styles/bootstrap.css.map | 1 - docs/_static/styles/pydata-sphinx-theme.css | 2 - .../styles/pydata-sphinx-theme.css.map | 1 - docs/_static/styles/theme.css | 2 - .../vendor/fontawesome/6.5.2/LICENSE.txt | 165 --- .../vendor/fontawesome/6.5.2/css/all.min.css | 5 - .../vendor/fontawesome/6.5.2/js/all.min.js | 2 - .../6.5.2/js/all.min.js.LICENSE.txt | 5 - .../6.5.2/webfonts/fa-brands-400.ttf | Bin 209128 -> 0 bytes .../6.5.2/webfonts/fa-brands-400.woff2 | Bin 117852 -> 0 bytes .../6.5.2/webfonts/fa-regular-400.ttf | Bin 67860 -> 0 bytes .../6.5.2/webfonts/fa-regular-400.woff2 | Bin 25392 -> 0 bytes .../6.5.2/webfonts/fa-solid-900.ttf | Bin 420332 -> 0 bytes .../6.5.2/webfonts/fa-solid-900.woff2 | Bin 156400 -> 0 bytes .../6.5.2/webfonts/fa-v4compatibility.ttf | Bin 10832 -> 0 bytes .../6.5.2/webfonts/fa-v4compatibility.woff2 | Bin 4792 -> 0 bytes docs/_static/webpack-macros.html | 31 - docs/documentation.html | 540 ---------- docs/documentation/core.html | 553 ---------- docs/documentation/core/abstractions.html | 508 ---------- .../core/abstractions/base_drone.html | 867 ---------------- .../core/abstractions/boosters.html | 602 ----------- .../core/abstractions/boring_bodies.html | 574 ----------- .../core/abstractions/camera.html | 577 ----------- .../core/abstractions/gimbals.html | 578 ----------- .../core/abstractions/lifting_surfaces.html | 650 ------------ .../core/abstractions/motors.html | 580 ----------- docs/documentation/core/aviary.html | 958 ------------------ docs/documentation/core/drones.html | 548 ---------- docs/documentation/core/drones/fixedwing.html | 589 ----------- docs/documentation/core/drones/quadx.html | 626 ------------ docs/documentation/core/drones/rocket.html | 610 ----------- docs/documentation/core/wind.html | 628 ------------ docs/documentation/gym_envs.html | 490 --------- .../gym_envs/fixedwing_waypoints_env.html | 558 ---------- .../gym_envs/quadx_hover_env.html | 535 ---------- .../gym_envs/quadx_pole_balance_env.html | 535 ---------- .../gym_envs/quadx_pole_waypoints_env.html | 558 ---------- .../gym_envs/quadx_waypoints_env.html | 560 ---------- .../gym_envs/rocket_landing_env.html | 535 ---------- docs/documentation/pz_envs.html | 491 --------- .../pz_envs/ma_fixedwing_dogfight_env.html | 550 ---------- .../pz_envs/ma_quadx_hover_env.html | 538 ---------- docs/genindex.html | 795 --------------- docs/index.html | 423 -------- docs/objects.inv | Bin 1875 -> 0 bytes docs/paper.html | 457 --------- docs/search.html | 402 -------- docs/searchindex.js | 1 - docs/tutorials.html | 432 -------- docs_source/conf.py | 1 + examples/core/05_custom_controller.py | 1 - examples/core/09_simple_wind.py | 1 - examples/core/10_custom_wind.py | 2 - examples/core/custom_uavs/rocket_brick.py | 7 +- pyproject.toml | 6 - tests/test_core.py | 3 - 121 files changed, 114 insertions(+), 21606 deletions(-) delete mode 100644 docs/.buildinfo delete mode 100644 docs/.nojekyll delete mode 100644 docs/_sources/documentation.md.txt delete mode 100644 docs/_sources/documentation/core.md.txt delete mode 100644 docs/_sources/documentation/core/abstractions.md.txt delete mode 100644 docs/_sources/documentation/core/abstractions/base_drone.md.txt delete mode 100644 docs/_sources/documentation/core/abstractions/boosters.md.txt delete mode 100644 docs/_sources/documentation/core/abstractions/boring_bodies.md.txt delete mode 100644 docs/_sources/documentation/core/abstractions/camera.md.txt delete mode 100644 docs/_sources/documentation/core/abstractions/gimbals.md.txt delete mode 100644 docs/_sources/documentation/core/abstractions/lifting_surfaces.md.txt delete mode 100644 docs/_sources/documentation/core/abstractions/motors.md.txt delete mode 100644 docs/_sources/documentation/core/aviary.md.txt delete mode 100644 docs/_sources/documentation/core/drones.md.txt delete mode 100644 docs/_sources/documentation/core/drones/fixedwing.md.txt delete mode 100644 docs/_sources/documentation/core/drones/quadx.md.txt delete mode 100644 docs/_sources/documentation/core/drones/rocket.md.txt delete mode 100644 docs/_sources/documentation/core/wind.md.txt delete mode 100644 docs/_sources/documentation/gym_envs.md.txt delete mode 100644 docs/_sources/documentation/gym_envs/fixedwing_waypoints_env.md.txt delete mode 100644 docs/_sources/documentation/gym_envs/quadx_hover_env.md.txt delete mode 100644 docs/_sources/documentation/gym_envs/quadx_pole_balance_env.md.txt delete mode 100644 docs/_sources/documentation/gym_envs/quadx_pole_waypoints_env.md.txt delete mode 100644 docs/_sources/documentation/gym_envs/quadx_waypoints_env.md.txt delete mode 100644 docs/_sources/documentation/gym_envs/rocket_landing_env.md.txt delete mode 100644 docs/_sources/documentation/pz_envs.md.txt delete mode 100644 docs/_sources/documentation/pz_envs/ma_fixedwing_dogfight_env.md.txt delete mode 100644 docs/_sources/documentation/pz_envs/ma_quadx_hover_env.md.txt delete mode 100644 docs/_sources/index.md.txt delete mode 100644 docs/_sources/paper.md.txt delete mode 100644 docs/_sources/tutorials.md.txt delete mode 100644 docs/_static/basic.css delete mode 100644 docs/_static/doctools.js delete mode 100644 docs/_static/documentation_options.js delete mode 100644 docs/_static/file.png delete mode 100644 docs/_static/language_data.js delete mode 100644 docs/_static/minus.png delete mode 100644 docs/_static/plus.png delete mode 100644 docs/_static/pygments.css delete mode 100644 docs/_static/scripts/bootstrap.js delete mode 100644 docs/_static/scripts/bootstrap.js.LICENSE.txt delete mode 100644 docs/_static/scripts/bootstrap.js.map delete mode 100644 docs/_static/scripts/pydata-sphinx-theme.js delete mode 100644 docs/_static/scripts/pydata-sphinx-theme.js.map delete mode 100644 docs/_static/searchtools.js delete mode 100644 docs/_static/sphinx_highlight.js delete mode 100644 docs/_static/styles/bootstrap.css delete mode 100644 docs/_static/styles/bootstrap.css.map delete mode 100644 docs/_static/styles/pydata-sphinx-theme.css delete mode 100644 docs/_static/styles/pydata-sphinx-theme.css.map delete mode 100644 docs/_static/styles/theme.css delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/LICENSE.txt delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/css/all.min.css delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/js/all.min.js delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/js/all.min.js.LICENSE.txt delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.ttf delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2 delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.ttf delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2 delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.ttf delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2 delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/webfonts/fa-v4compatibility.ttf delete mode 100644 docs/_static/vendor/fontawesome/6.5.2/webfonts/fa-v4compatibility.woff2 delete mode 100644 docs/_static/webpack-macros.html delete mode 100644 docs/documentation.html delete mode 100644 docs/documentation/core.html delete mode 100644 docs/documentation/core/abstractions.html delete mode 100644 docs/documentation/core/abstractions/base_drone.html delete mode 100644 docs/documentation/core/abstractions/boosters.html delete mode 100644 docs/documentation/core/abstractions/boring_bodies.html delete mode 100644 docs/documentation/core/abstractions/camera.html delete mode 100644 docs/documentation/core/abstractions/gimbals.html delete mode 100644 docs/documentation/core/abstractions/lifting_surfaces.html delete mode 100644 docs/documentation/core/abstractions/motors.html delete mode 100644 docs/documentation/core/aviary.html delete mode 100644 docs/documentation/core/drones.html delete mode 100644 docs/documentation/core/drones/fixedwing.html delete mode 100644 docs/documentation/core/drones/quadx.html delete mode 100644 docs/documentation/core/drones/rocket.html delete mode 100644 docs/documentation/core/wind.html delete mode 100644 docs/documentation/gym_envs.html delete mode 100644 docs/documentation/gym_envs/fixedwing_waypoints_env.html delete mode 100644 docs/documentation/gym_envs/quadx_hover_env.html delete mode 100644 docs/documentation/gym_envs/quadx_pole_balance_env.html delete mode 100644 docs/documentation/gym_envs/quadx_pole_waypoints_env.html delete mode 100644 docs/documentation/gym_envs/quadx_waypoints_env.html delete mode 100644 docs/documentation/gym_envs/rocket_landing_env.html delete mode 100644 docs/documentation/pz_envs.html delete mode 100644 docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html delete mode 100644 docs/documentation/pz_envs/ma_quadx_hover_env.html delete mode 100644 docs/genindex.html delete mode 100644 docs/index.html delete mode 100644 docs/objects.inv delete mode 100644 docs/paper.html delete mode 100644 docs/search.html delete mode 100644 docs/searchindex.js delete mode 100644 docs/tutorials.html diff --git a/.gitignore b/.gitignore index 8730c7e8..588248a2 100644 --- a/.gitignore +++ b/.gitignore @@ -149,4 +149,3 @@ dmypy.json # Cython debug symbols cython_debug/ - diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1a50fe6e..a2a2a620 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,22 +1,59 @@ ---- +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-symlinks + - id: destroyed-symlinks + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-toml + - id: check-ast + - id: check-executables-have-shebangs + - id: check-shebang-scripts-are-executable + - id: detect-private-key + - id: debug-statements - repo: https://github.com/codespell-project/codespell - rev: v2.2.5 + rev: v2.3.0 hooks: - id: codespell + args: ['--skip=^docs/'] + - repo: https://github.com/PyCQA/flake8 + rev: 7.0.0 + hooks: + - id: flake8 + args: + - '--per-file-ignores=*/__init__.py:F401' + - --max-complexity=30 + - --max-line-length=456 + - --show-source + - --statistics + - repo: https://github.com/asottile/pyupgrade + rev: v3.16.0 + hooks: + - id: pyupgrade + args: ["--py38-plus"] + - repo: https://github.com/PyCQA/isort + rev: 5.13.2 + hooks: + - id: isort args: - - --ignore-words-list=null - exclude: docs/ - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.5.2 + - "--profile=black" + - repo: https://github.com/python/black + rev: 24.4.2 + hooks: + - id: black + - repo: https://github.com/pycqa/pydocstyle + rev: 6.3.0 hooks: - - id: ruff + - id: pydocstyle args: - - --fix - - --ignore=D401,D404,D203,D213 - - --select=E4,E7,E9,F,I,D - - --per-file-ignores=__init__.py:F401 - - id: ruff-format + - --source + - --explain + - --convention=google + additional_dependencies: ["tomli"] - repo: local hooks: - id: pyright @@ -25,6 +62,6 @@ repos: language: node pass_filenames: false types: [python] - additional_dependencies: ["pyright"] + additional_dependencies: ["pyright@1.1.347"] args: - --project=pyproject.toml diff --git a/PyFlyt/core/abstractions/base_wind_field.py b/PyFlyt/core/abstractions/base_wind_field.py index 824ef5e6..8d17f58e 100644 --- a/PyFlyt/core/abstractions/base_wind_field.py +++ b/PyFlyt/core/abstractions/base_wind_field.py @@ -63,10 +63,7 @@ def _check_wind_field_validity(wind_field): assert np.issubdtype( test_velocity.dtype, np.floating ), f"Returned wind velocity must be type float, got {test_velocity.dtype}." - assert ( - test_velocity.shape - == ( - 5, - 3, - ) + assert test_velocity.shape == ( + 5, + 3, ), f"Returned wind velocity must be array of shape (n, 3), got (n+({test_velocity.shape[0] - 5}), {test_velocity.shape[1:]})." diff --git a/PyFlyt/core/abstractions/boosters.py b/PyFlyt/core/abstractions/boosters.py index 6b8a454a..b911915f 100644 --- a/PyFlyt/core/abstractions/boosters.py +++ b/PyFlyt/core/abstractions/boosters.py @@ -173,13 +173,10 @@ def physics_update( pwm <= 1.0 ), f"{pwm=} has values out of bounds of 0.0 and 1.0." if rotation is not None: - assert ( - rotation.shape - == ( - self.num_boosters, - 3, - 3, - ) + assert rotation.shape == ( + self.num_boosters, + 3, + 3, ), f"`rotation` should be of shape (num_boosters, 3, 3), got {rotation.shape}" # compute thrust mass inertia diff --git a/PyFlyt/core/abstractions/lifting_surfaces.py b/PyFlyt/core/abstractions/lifting_surfaces.py index e394c9b5..ab5ca3a5 100644 --- a/PyFlyt/core/abstractions/lifting_surfaces.py +++ b/PyFlyt/core/abstractions/lifting_surfaces.py @@ -60,8 +60,8 @@ def physics_update(self, cmd: np.ndarray): """ assert len(cmd.shape) == 1, f"`{cmd=}` must be 1D array." - assert ( - cmd.shape[0] == len(self.surfaces) + assert cmd.shape[0] == len( + self.surfaces ), f"`{cmd=}` must have same number of elements as surfaces ({len(self.surfaces)})." assert np.all(cmd >= -1.0) and np.all( cmd <= 1.0 diff --git a/PyFlyt/core/drones/fixedwing.py b/PyFlyt/core/drones/fixedwing.py index a8bba302..edd073e6 100644 --- a/PyFlyt/core/drones/fixedwing.py +++ b/PyFlyt/core/drones/fixedwing.py @@ -185,8 +185,8 @@ def __init__( # compute camera fps parameters if camera_fps: assert ( - (physics_hz / camera_fps) % 1 == 0 - ), f"Expected `camera_fps` to roundly divide `physics_hz`, got {camera_fps=} and {physics_hz=}." + physics_hz / camera_fps + ) % 1 == 0, f"Expected `camera_fps` to roundly divide `physics_hz`, got {camera_fps=} and {physics_hz=}." self.physics_camera_ratio = int(physics_hz / camera_fps) else: self.physics_camera_ratio = 1 diff --git a/PyFlyt/core/drones/quadx.py b/PyFlyt/core/drones/quadx.py index 782ac508..65d47cd8 100644 --- a/PyFlyt/core/drones/quadx.py +++ b/PyFlyt/core/drones/quadx.py @@ -213,8 +213,8 @@ def __init__( # compute camera fps parameters if camera_fps: assert ( - (physics_hz / camera_fps) % 1 == 0 - ), f"Expected `camera_fps` to roundly divide `physics_hz`, got {camera_fps=} and {physics_hz=}." + physics_hz / camera_fps + ) % 1 == 0, f"Expected `camera_fps` to roundly divide `physics_hz`, got {camera_fps=} and {physics_hz=}." self.physics_camera_ratio = int(physics_hz / camera_fps) else: self.physics_camera_ratio = 1 @@ -419,8 +419,8 @@ def update_control(self, physics_step: int) -> None: custom_output = self.instanced_controllers[self.mode].step( self.state, self.setpoint ) - assert ( - custom_output.shape == (4,) + assert custom_output.shape == ( + 4, ), f"custom controller outputting wrong shape, expected (4, ) but got {custom_output.shape}." # splice things out to be passed along diff --git a/PyFlyt/core/drones/rocket.py b/PyFlyt/core/drones/rocket.py index 05809ff4..6a8cac7e 100644 --- a/PyFlyt/core/drones/rocket.py +++ b/PyFlyt/core/drones/rocket.py @@ -216,8 +216,8 @@ def __init__( # compute camera fps parameters if camera_fps: assert ( - (physics_hz / camera_fps) % 1 == 0 - ), f"Expected `camera_fps` to roundly divide `physics_hz`, got {camera_fps=} and {physics_hz=}." + physics_hz / camera_fps + ) % 1 == 0, f"Expected `camera_fps` to roundly divide `physics_hz`, got {camera_fps=} and {physics_hz=}." self.physics_camera_ratio = int(physics_hz / camera_fps) else: self.physics_camera_ratio = 1 diff --git a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py index dad83e2a..dc97c9b2 100644 --- a/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py +++ b/PyFlyt/gym_envs/fixedwing_envs/fixedwing_waypoints_env.py @@ -169,7 +169,7 @@ def compute_state(self) -> None: self.state: dict[Literal["attitude", "target_deltas"], np.ndarray] = new_state def compute_term_trunc_reward(self) -> None: - """Computes the termination, trunction, and reward of the current timestep.""" + """Computes the termination, truncation, and reward of the current timestep.""" super().compute_base_term_trunc_reward() # bonus reward if we are not sparse diff --git a/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py b/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py index 635fe44b..3e633cdc 100644 --- a/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py +++ b/PyFlyt/gym_envs/quadx_envs/quadx_waypoints_env.py @@ -175,7 +175,7 @@ def compute_state(self) -> None: self.state: dict[Literal["attitude", "target_deltas"], np.ndarray] = new_state def compute_term_trunc_reward(self) -> None: - """Computes the termination, trunction, and reward of the current timestep.""" + """Computes the termination, truncation, and reward of the current timestep.""" super().compute_base_term_trunc_reward() # bonus reward if we are not sparse diff --git a/PyFlyt/gym_envs/utils/flatten_waypoint_env.py b/PyFlyt/gym_envs/utils/flatten_waypoint_env.py index d6b3ec32..79b1b4e8 100644 --- a/PyFlyt/gym_envs/utils/flatten_waypoint_env.py +++ b/PyFlyt/gym_envs/utils/flatten_waypoint_env.py @@ -46,11 +46,17 @@ def observation(self, observation) -> np.ndarray: observation: a dictionary observation with an "attitude" and "target_deltas" keys. """ - num_targets = min(self.context_length, observation["target_deltas"].shape[0]) # pyright: ignore[reportGeneralTypeIssues] + num_targets = min( + self.context_length, observation["target_deltas"].shape[0] + ) # pyright: ignore[reportGeneralTypeIssues] targets = np.zeros((self.context_length, self.target_shape)) - targets[:num_targets] = observation["target_deltas"][:num_targets] # pyright: ignore[reportGeneralTypeIssues] + targets[:num_targets] = observation["target_deltas"][ + :num_targets + ] # pyright: ignore[reportGeneralTypeIssues] - new_obs = np.concatenate([observation["attitude"], *targets]) # pyright: ignore[reportGeneralTypeIssues] + new_obs = np.concatenate( + [observation["attitude"], *targets] + ) # pyright: ignore[reportGeneralTypeIssues] return new_obs diff --git a/PyFlyt/gym_envs/utils/waypoint_handler.py b/PyFlyt/gym_envs/utils/waypoint_handler.py index d70fc527..5e2b1ff9 100644 --- a/PyFlyt/gym_envs/utils/waypoint_handler.py +++ b/PyFlyt/gym_envs/utils/waypoint_handler.py @@ -126,7 +126,6 @@ def distance_to_targets( """distance_to_targets. Args: - --- ang_pos (np.ndarray): ang_pos lin_pos (np.ndarray): lin_pos quaternion (np.ndarray): quaternion diff --git a/PyFlyt/models/vehicles/quadplane/quadplane.yaml b/PyFlyt/models/vehicles/quadplane/quadplane.yaml index 1b90a392..8b8e7ce6 100644 --- a/PyFlyt/models/vehicles/quadplane/quadplane.yaml +++ b/PyFlyt/models/vehicles/quadplane/quadplane.yaml @@ -14,7 +14,7 @@ quad_motor_params: torque_const: 7.94e-12 motor_noise_ratio: 0.02 -main_wing_params: +main_wing_params: Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.3 # meters span: 1.6 @@ -25,7 +25,7 @@ main_wing_params: alpha_stall_N_base: -9 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient -left_wing_flapped_params: +left_wing_flapped_params: Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 @@ -37,7 +37,7 @@ left_wing_flapped_params: Cd_0: 0.01 # Skin friction coefficient defl_lim: 30 # Control surface deflection limit in degrees -right_wing_flapped_params: +right_wing_flapped_params: Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 @@ -49,7 +49,7 @@ right_wing_flapped_params: Cd_0: 0.01 # Skin friction coefficient defl_lim: 30 # Control surface deflection limit in degrees -horizontal_tail_params: +horizontal_tail_params: Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.2 # meters span: 0.625 @@ -61,7 +61,7 @@ horizontal_tail_params: Cd_0: 0.01 # Skin friction coefficient defl_lim: 20 # Control surface deflection limit in degrees -vertical_tail_params: +vertical_tail_params: Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.2 # meters span: 0.312 diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py index 7f217455..9eaa01a8 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py @@ -303,9 +303,7 @@ def compute_term_trunc_reward_info_by_id( """ raise NotImplementedError - def step( - self, actions: dict[str, np.ndarray] - ) -> tuple[ + def step(self, actions: dict[str, np.ndarray]) -> tuple[ dict[str, Any], dict[str, float], dict[str, bool], diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py index bd3fd370..adc8a603 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py @@ -182,10 +182,14 @@ def _compute_agent_states(self) -> None: # get the rotation matrices and forward vectors # offset the position to be on top of the main wing rotation, forward_vecs = self.compute_rotation_forward(self.attitudes[:, 1]) - self.attitudes[:, -1] = self.attitudes[:, -1] - (forward_vecs * 0.35) # pyright: ignore[reportGeneralTypeIssues] + self.attitudes[:, -1] = self.attitudes[:, -1] - ( + forward_vecs * 0.35 + ) # pyright: ignore[reportGeneralTypeIssues] # compute the vectors of each drone to each drone - separation = self.attitudes[::-1, -1] - self.attitudes[:, -1] # pyright: ignore[reportGeneralTypeIssues] + separation = ( + self.attitudes[::-1, -1] - self.attitudes[:, -1] + ) # pyright: ignore[reportGeneralTypeIssues] self.previous_distance = self.current_distance.copy() self.current_distance = np.linalg.norm(separation[0]) @@ -220,7 +224,9 @@ def _compute_agent_states(self) -> None: opponent_attitudes[:, 0] = self.attitudes[::-1, 0] # opponent angular position is relative to ours - opponent_attitudes[:, 1] = self.attitudes[::-1, 1] - self.attitudes[:, 1] # pyright: ignore[reportGeneralTypeIssues] + opponent_attitudes[:, 1] = ( + self.attitudes[::-1, 1] - self.attitudes[:, 1] + ) # pyright: ignore[reportGeneralTypeIssues] # opponent velocity is relative to ours in our body frame ground_velocities: np.ndarray = ( @@ -229,7 +235,9 @@ def _compute_agent_states(self) -> None: opponent_velocities = ( np.expand_dims(ground_velocities, axis=1)[::-1] @ rotation ).reshape(2, 3) - opponent_attitudes[:, 2] = opponent_velocities - self.attitudes[:, 2] # pyright: ignore[reportGeneralTypeIssues] + opponent_attitudes[:, 2] = ( + opponent_velocities - self.attitudes[:, 2] + ) # pyright: ignore[reportGeneralTypeIssues] # opponent position is relative to ours in our body frame opponent_attitudes[:, 3] = ( @@ -363,9 +371,7 @@ def compute_rotation_forward(orn: np.ndarray) -> tuple[np.ndarray, np.ndarray]: # order of operations for multiplication matters here return rz @ ry @ rx, forward_vector - def step( - self, actions: dict[str, np.ndarray] - ) -> tuple[ + def step(self, actions: dict[str, np.ndarray]) -> tuple[ dict[str, Any], dict[str, float], dict[str, bool], diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py index 8295aa33..50a2a098 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_team_dogfight_env.py @@ -184,10 +184,14 @@ def _compute_agent_states(self) -> None: # get the rotation matrices and forward vectors # offset the position to be on top of the main wing rotation, forward_vecs = self.compute_rotation_forward(self.attitudes[:, 1]) - self.attitudes[:, -1] = self.attitudes[:, -1] - (forward_vecs * 0.35) # pyright: ignore[reportGeneralTypeIssues] + self.attitudes[:, -1] = self.attitudes[:, -1] - ( + forward_vecs * 0.35 + ) # pyright: ignore[reportGeneralTypeIssues] # compute the vectors of each drone to each drone - separation = self.attitudes[::-1, -1] - self.attitudes[:, -1] # pyright: ignore[reportGeneralTypeIssues] + separation = ( + self.attitudes[::-1, -1] - self.attitudes[:, -1] + ) # pyright: ignore[reportGeneralTypeIssues] self.previous_distance = self.current_distance.copy() self.current_distance = np.linalg.norm(separation[0]) @@ -222,7 +226,9 @@ def _compute_agent_states(self) -> None: opponent_attitudes[:, 0] = self.attitudes[::-1, 0] # opponent angular position is relative to ours - opponent_attitudes[:, 1] = self.attitudes[::-1, 1] - self.attitudes[:, 1] # pyright: ignore[reportGeneralTypeIssues] + opponent_attitudes[:, 1] = ( + self.attitudes[::-1, 1] - self.attitudes[:, 1] + ) # pyright: ignore[reportGeneralTypeIssues] # opponent velocity is relative to ours in our body frame ground_velocities: np.ndarray = ( @@ -231,7 +237,9 @@ def _compute_agent_states(self) -> None: opponent_velocities = ( np.expand_dims(ground_velocities, axis=1)[::-1] @ rotation ).reshape(2, 3) - opponent_attitudes[:, 2] = opponent_velocities - self.attitudes[:, 2] # pyright: ignore[reportGeneralTypeIssues] + opponent_attitudes[:, 2] = ( + opponent_velocities - self.attitudes[:, 2] + ) # pyright: ignore[reportGeneralTypeIssues] # opponent position is relative to ours in our body frame opponent_attitudes[:, 3] = ( @@ -365,9 +373,7 @@ def compute_rotation_forward(orn: np.ndarray) -> tuple[np.ndarray, np.ndarray]: # order of operations for multiplication matters here return rz @ ry @ rx, forward_vector - def step( - self, actions: dict[str, np.ndarray] - ) -> tuple[ + def step(self, actions: dict[str, np.ndarray]) -> tuple[ dict[str, Any], dict[str, float], dict[str, bool], diff --git a/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py b/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py index 7162aa5c..8ebc4643 100644 --- a/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py +++ b/PyFlyt/pz_envs/quadx_envs/ma_quadx_base_env.py @@ -323,9 +323,7 @@ def compute_term_trunc_reward_info_by_id( """ raise NotImplementedError - def step( - self, actions: dict[str, np.ndarray] - ) -> tuple[ + def step(self, actions: dict[str, np.ndarray]) -> tuple[ dict[str, Any], dict[str, float], dict[str, bool], diff --git a/docs/.buildinfo b/docs/.buildinfo deleted file mode 100644 index 3bd4f4d6..00000000 --- a/docs/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 7e9afbe000cfd96055e2d1927d41bb4e -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/_sources/documentation.md.txt b/docs/_sources/documentation.md.txt deleted file mode 100644 index c2bb2b30..00000000 --- a/docs/_sources/documentation.md.txt +++ /dev/null @@ -1,53 +0,0 @@ -# Documentation - -```{toctree} -:hidden: -documentation/core -documentation/gym_envs -documentation/pz_envs -``` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/pyflyt_cover_photo.png - :width: 80% -``` - -## Installation - -We recommend installations using Python [virtual environments](https://docs.python.org/3/library/venv.html). -It is possible to install PyFlyt using [`conda`](https://docs.conda.io/en/latest/), but YMMV. - -### Linux and MacOS - -Installation on _Linux_ and _MacOS_ is simple: -```sh -pip3 install wheel numpy -pip3 install pyflyt -``` -> `numpy` and `wheel` must be installed prior to `pyflyt` such that `pybullet` is built with `numpy` support. - -### Windows - -1. First, install Microsoft Visual Studio Build Tools. - - Go [here](https://visualstudio.microsoft.com/downloads/), scroll down to **All Downloads**, expand **Tools for Visual Studio**, download **Build Tools for Visual Studio 20XX**, where XX is just the latest year available. - - Run the installer. - - Select **Desktop development with C++**, then click **Install while downloading** or the alternate option if you wish. -2. Now, you can install `PyFlyt` as usual: - ```sh - pip3 install wheel numpy - pip3 install pyflyt - ``` - -## Gymnasium Environments - -If all you want are the Gymnasium environments, you can skip everything and go straight to the [Gymnasium Environments](documentation/gym_envs) section. - - -## PettingZoo Environments - -Similarly, if all you want are the PettingZoo environments, you can skip everything and go straight to the [PettingZoo Environments](documentation/pz_envs) section. - -## I want to do more! - -A set of helpful examples are provided in [the source repository](https://github.com/jjshoots/PyFlyt/tree/master/examples/core). -While this documentation provides a detailed overview of PyFlyt, the examples can bring you 80% of the way to a fully fledged user in a couple hours. -New users are highly encouraged to go through them first. diff --git a/docs/_sources/documentation/core.md.txt b/docs/_sources/documentation/core.md.txt deleted file mode 100644 index 9df28310..00000000 --- a/docs/_sources/documentation/core.md.txt +++ /dev/null @@ -1,80 +0,0 @@ -# Core - -```{toctree} -:hidden: -core/aviary -core/wind -core/drones -core/abstractions -``` - -## Core API - -The core API of PyFlyt looks something like the following: - -```python -"""Spawn a single drone on x=0, y=0, z=1, with 0 rpy.""" -# Step 1: import things -import numpy as np -from PyFlyt.core import Aviary - -# Step 2: define starting positions and orientations -start_pos = np.array([[0.0, 0.0, 1.0]]) -start_orn = np.array([[0.0, 0.0, 0.0]]) - -# Step 3: instantiate aviary -env = Aviary(start_pos=start_pos, start_orn=start_orn, render=True, drone_type="quadx") - -# Step 4: (Optional) define control mode to use for drone -env.set_mode(7) - -# Step 5: (Optional) define a setpoint for the first drone (at index 0) in the aviary -setpoint = np.array([1.0, 0.0, 0.0, 1.0]) -env.set_setpoint(0, setpoint) - -# Step 6: step the physics -for i in range(1000): - env.step() - -# Gracefully close -env.close() -``` - -1. At the start, we import `numpy` and the `Aviary`. -2. Then, we define the starting positions and orientations as an `[n, 3]` array each, for `n` number of drones. -3. The `Aviary` is instantiated by passing the starting positions and orientations, as well as a string representing the drone type to use. -4. It is possible to define base flight modes for the drones, this is elaborated in the [drone](core/abstractions/base_drone.md) section. -5. We set a setpoint for the drone to reach, in this case it is `(x, y, yaw, z) = (1 meter, 0, 1 radian, 0)`. -6. Finally, we step through the physics. - -Drone setpoints are __persistent__ attributes - you don't have to repeatedly set them at every step if there is no desire to change setpoints. - -The `Aviary` itself is a highly flexible multi-drone handling environment. -The extent of its capabilities are elaborated in [its relevant section](core/aviary.md). - -## General Architecture - -Loosely put, PyFlyt has the following architecture: - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/pyflyt_architecture.png - :width: 70% -``` - -At the core lies the [`Aviary`](core/aviary), serving as a domain for all [`drones`](core/drones). -Each drone is defined by its own Python class, allowing for user-defined drones to be built. -Drones can be built from the ground up, or can be an amalgamation of various component [`abstractions`](core/abstractions). - -## Axis Conventions - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/duck_frame.png - :width: 70% -``` - -Frame conventions are essential for describing the orientation and movement of objects in space. -PyFlyt uses two reference frames, the ground frame (subscript `G`) and the body frame (subscript `B`), shown above. -The ground frame defines three axes relative to the local horizontal plane and the direction of gravity. -The body frame defines the axes relative to the body of the drone. - -We utilize the [ENU](https://en.wikipedia.org/wiki/Axes_conventions) frame convention, where for the ground frame, -the X-axis points East, Y-axis points North, and Z-axis points Up (East and North are just cardinal references). -On the body frame, this convention defines the X, Y, and Z axes to point out the front, left, and upward direction from the drone. diff --git a/docs/_sources/documentation/core/abstractions.md.txt b/docs/_sources/documentation/core/abstractions.md.txt deleted file mode 100644 index 3e404f66..00000000 --- a/docs/_sources/documentation/core/abstractions.md.txt +++ /dev/null @@ -1,31 +0,0 @@ -# Abstractions - -```{toctree} -:hidden: -abstractions/base_drone -abstractions/boosters -abstractions/boring_bodies -abstractions/camera -abstractions/gimbals -abstractions/lifting_surfaces -abstractions/motors -``` - -## Description - -The `abstractions` submodule is, as the name suggests, a set of abstractions that allow easier construction of drones. -It implements various basic components, such as [motors](abstractions/motors) or [lifting surfaces](abstractions/lifting_surfaces) that allow construction of complicated configurations of drones without requiring reimplementation of all relevant mathematical models. - -> **Custom Drone Example** -> -> While this section of the documentation serves as the Rosetta stone for all abstracted components, a very comprehensive tutorial on constructing your own drone can be found in the [tutorials section](../../tutorials). - -## Usage - -For all abstracted components, these methods are implemented and must be called within their designated methods for each drone class. -Some components may have special functions that need to be called elsewhere, refer to their relevant documentation for more information. - -- `reset`: called on `drone.reset()`. -- `state_update`: called on `drone.update_state()`. -- (Optional) `get_states`: called on `drone.state_update()`, this returns the state of the component as a flattened `np.ndarray`. -- `physics_update`: called on `drone.update_physics()`. diff --git a/docs/_sources/documentation/core/abstractions/base_drone.md.txt b/docs/_sources/documentation/core/abstractions/base_drone.md.txt deleted file mode 100644 index 804773cd..00000000 --- a/docs/_sources/documentation/core/abstractions/base_drone.md.txt +++ /dev/null @@ -1,106 +0,0 @@ -# Base Drone Class - -> **Custom Drone Example** -> -> While this section of the documentation serves as the Rosetta stone for all abstracted components, a very comprehensive tutorial on constructing your own drone can be found in the [tutorials section](../../../tutorials). - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.DroneClass -``` - -### Default Attributes -```{eval-rst} -.. property:: PyFlyt.core.abstractions.DroneClass.np_random - - **dtype** - `np.random.RandomState` - -.. property:: PyFlyt.core.abstractions.DroneClass.physics_period - - **dtype** - `float` - -.. property:: PyFlyt.core.abstractions.DroneClass.control_period - - **dtype** - `float` - -.. property:: PyFlyt.core.abstractions.DroneClass.drone_path - - Path to the drone's URDF file. - - **dtype** - `str` - -.. property:: PyFlyt.core.abstractions.DroneClass.param_path - - Path to the drone's YAML parameters file. - - **dtype** - `str` - -.. property:: PyFlyt.core.abstractions.DroneClass.Id - - PyBullet ID of the drone itself. - - **dtype** - `int` -``` - -### Required Attributes -```{eval-rst} -.. property:: PyFlyt.core.abstractions.DroneClass.state - - **dtype** - `np.ndarray` - -.. property:: PyFlyt.core.abstractions.DroneClass.aux_state - - **dtype** - `np.ndarray` - -.. property:: PyFlyt.core.abstractions.DroneClass.setpoint - - **dtype** - `np.ndarray` -``` - -### Optional Attributes -```{eval-rst} -.. property:: PyFlyt.core.abstractions.DroneClass.rgbaImg - - **dtype** - `np.ndarray` - -.. property:: PyFlyt.core.abstractions.DroneClass.depthImg - - **dtype** - `np.ndarray` - -.. property:: PyFlyt.core.abstractions.DroneClass.segImg - - **dtype** - `np.ndarray` - -.. property:: PyFlyt.core.abstractions.DroneClass.registered_controllers - - **dtype** - `dict[int, type[ControlClass]]` - -.. property:: PyFlyt.core.abstractions.DroneClass.instanced_controllers - - **dtype** - `dict[int, ControlClass]` - -.. property:: PyFlyt.core.abstractions.DroneClass.registered_base_controllers - - **dtype** - `dict[int, int]` -``` - -### Default Methods -```{eval-rst} -.. autofunction:: PyFlyt.core.abstractions.DroneClass.set_mode -.. autofunction:: PyFlyt.core.abstractions.DroneClass.get_joint_info -.. autofunction:: PyFlyt.core.abstractions.DroneClass.disable_artificial_damping -``` - -### Required Methods -```{eval-rst} -.. autofunction:: PyFlyt.core.abstractions.DroneClass.reset -.. autofunction:: PyFlyt.core.abstractions.DroneClass.update_control -.. autofunction:: PyFlyt.core.abstractions.DroneClass.update_physics -.. autofunction:: PyFlyt.core.abstractions.DroneClass.update_state -.. autofunction:: PyFlyt.core.abstractions.DroneClass.update_last -``` - -### Optional Methods -```{eval-rst} -.. autofunction:: PyFlyt.core.abstractions.DroneClass.register_controller -``` diff --git a/docs/_sources/documentation/core/abstractions/boosters.md.txt b/docs/_sources/documentation/core/abstractions/boosters.md.txt deleted file mode 100644 index e732e00c..00000000 --- a/docs/_sources/documentation/core/abstractions/boosters.md.txt +++ /dev/null @@ -1,34 +0,0 @@ -# Boosters - -## Description - -The `Boosters` component is used to simulate a list of fueled boosters. -Fueled boosters are propulsion units that rely on the presence of available fuel from a fuel tank in order to generate thrust. -They generate no torque around the thrust axis. - -The booster is parameterized with `booster_ids` and `fueltank_ids`, where the thrust acts on the links indicated by `booster_ids` and the mass properties of the fuel tanks are modified according to the indices specified in `fueltank_ids`. -Additionally, the boosters have a `reignitable` option, specifying whether the booster can be extinguished and then reignited or not --- a trait unique to liquid fuel boosters. - -It takes several steps for the `ignition` and `pwm` command to be transformed into a thrust value: - -1. If there is no fuel remaining, the `target_duty_cycle` is always 0. -Likewise, if the booster is not ignited, `target_duty_cycle` is also 0. -If the booster is lit and there is available fuel, `target_duty_cycle = min_thrust + (min_thrust / max_thrust) * pwm`. - -2. The actual duty cycle of the rocket depends on the ramp up time constant, `actual_duty_cycle += 1 / physics_hz / tau * (target_duty_cycle - actual_duty_cycle)`. - -3. The thrust of the rocket then depends on the actual duty cycle plus some noise, `thrust = (actual_duty_cycle * max_thrust) * (1 + noise * noise_ratio)`. -`noise` is sampled from a standard Normal. - -Fuel burn is calculated proportional to the amount of thrust relative to maximum thrust, `fuel_burn = thrust / max_thrust * max_fuel_burn`. -The mass and inertia properties of the fuel tank are then proportional to the amount of fuel remaining. - -The booster additionally accepts a `rotation` matrix argument in `physics_update`. -This allows the thrust of the booster to be redirected. -Conveniently, the `Gimbals` component outputs this exact rotation matrix. - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.Boosters - :members: -``` diff --git a/docs/_sources/documentation/core/abstractions/boring_bodies.md.txt b/docs/_sources/documentation/core/abstractions/boring_bodies.md.txt deleted file mode 100644 index ff5c3cd7..00000000 --- a/docs/_sources/documentation/core/abstractions/boring_bodies.md.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Boring Bodies - -## Description - -The `BoringBodies` component represents a list of bodies falling through air, experiencing drag in all three axes as a primary result. - -As aerodynamics of arbitrary bodies is difficult to simulate accurately, `BoringBodies` simulates them by assuming that the velocities experienced any body can be resolved into the three principled axes (X, Y, Z), which then cause individual drag forces on the body in the same three axes (X, Y, Z). -The following figure illustrates this idea in 2D. - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/boring_bodies.png - :width: 70% -``` - -More concisely, the figure shows two reference frames --- a ground frame {math}`XZ_G` and a body frame {math}`XZ_B`. -The velocity {math}`\mathbf{v}` is resolved into body frame components {math}`v_x`, {math}`v_y` (not shown in figure) and {math}`v_z`. -The drag on the body itself is then computed using the familiar drag equation: -```{math} -F_i = - \text{sign}(v_i) \cdot \frac{1}{2} \cdot \rho \cdot A \cdot C_d \cdot v_i^2 -``` -where: -- {math}`i \in \{x, y, z\}` -- {math}`\rho` is the density of air, uniformly assumed to be 1.225 kg/m^3 -- {math}`A` is the frontal area in the direction of {math}`i` -- {math}`C_d` is the drag coefficient in the direction of {math}`i` - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.BoringBodies - :members: -``` diff --git a/docs/_sources/documentation/core/abstractions/camera.md.txt b/docs/_sources/documentation/core/abstractions/camera.md.txt deleted file mode 100644 index 36d7a3d7..00000000 --- a/docs/_sources/documentation/core/abstractions/camera.md.txt +++ /dev/null @@ -1,14 +0,0 @@ -# Camera - -## Description - -The `Camera` component simulates a camera attached to a link on the drone. -The camera itself can be gimballed to achieve a horizon lock effect. -In addition, the field-of-view (FOV), tilt angle, resolution, and offset distance from the main link can be adjusted. -On image capture, the camera returns an RGBA image, a depth map, and a segmentation map with pixel values representing the IDs of objects in the environment. - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.Camera - :members: -``` diff --git a/docs/_sources/documentation/core/abstractions/gimbals.md.txt b/docs/_sources/documentation/core/abstractions/gimbals.md.txt deleted file mode 100644 index 92de5fa1..00000000 --- a/docs/_sources/documentation/core/abstractions/gimbals.md.txt +++ /dev/null @@ -1,15 +0,0 @@ -# Gimbals - -## Description - -The `Gimbals` component simulates a series of servo actuated gimbals. -This is useful for redirecting the thrust from the `Motors` or `Boosters` components. - -This component represents rotation about two different, arbitrary axes on a link, represented as `gimbal_unit_1` and `gimbal_unit_2`. -Rotation follows the right handed rotation rule. - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.Gimbals - :members: -``` diff --git a/docs/_sources/documentation/core/abstractions/lifting_surfaces.md.txt b/docs/_sources/documentation/core/abstractions/lifting_surfaces.md.txt deleted file mode 100644 index e7e5624a..00000000 --- a/docs/_sources/documentation/core/abstractions/lifting_surfaces.md.txt +++ /dev/null @@ -1,16 +0,0 @@ -# Lifting Surfaces - -## Description - -## Mathematical Model - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.LiftingSurface - :members: -``` - -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.LiftingSurfaces - :members: -``` diff --git a/docs/_sources/documentation/core/abstractions/motors.md.txt b/docs/_sources/documentation/core/abstractions/motors.md.txt deleted file mode 100644 index 44ec3aa3..00000000 --- a/docs/_sources/documentation/core/abstractions/motors.md.txt +++ /dev/null @@ -1,26 +0,0 @@ -# Motors - -## Description - -The `Motors` component is used to simulate a series of brushless electric motor driven propellers. -The do not have a fuel requirement, but generate a net torque around their thrust axis. - -More concisely, the `Motors` component is similar to the `Boosters` component, except with more linear dynamics and the ability to have reversed thrust. -Similar to `Boosters`, the thrust generated depends on a ramp up time constant plus some noise: - -1. The actual duty cycle depends on the `pwm` command and the ramp up time constant, `actual_duty_cycle += 1 / physics_hz / tau * (target_duty_cycle - actual_duty_cycle)`. - -2. The RPM of the motor then depends on the actual duty cycle plus some noise, `rpm = (actual_duty_cycle * max_rpm) * (1 + noise * noise_ratio)`. -`noise` is sampled from a standard Normal. - -3. Thrust and torque then depend on the RPM value and the propeller coefficients, `thrust = thrust_coef * rpm` and `torque = torque_coef * rpm`. - -The motor additionally accepts a `rotation` matrix argument in `physics_update`. -This allows the thrust of the motor to be redirected. -Conveniently, the `Gimbals` component outputs this exact rotation matrix. - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.motors.Motors - :members: -``` diff --git a/docs/_sources/documentation/core/aviary.md.txt b/docs/_sources/documentation/core/aviary.md.txt deleted file mode 100644 index 1415d167..00000000 --- a/docs/_sources/documentation/core/aviary.md.txt +++ /dev/null @@ -1,263 +0,0 @@ -# Aviary - -## Description - -The `aviary` is a handler for physics stepping, setpoint handling, collisions tracking, and much more. -It provides a common endpoint from where users may control drones or define tasks. -This page briefly goes through the key usage traits, -although more experienced users may wish to consult the whole class description at the bottom of this page, -or even (oh shit!) consult [the source code](https://github.com/jjshoots/PyFlyt/blob/master/PyFlyt/core/aviary.py). - -## Usage - -### Core API Example - -```python -"""Spawn a single drone on x=0, y=0, z=1, with 0 rpy.""" -# Step 1: import things -import numpy as np -from PyFlyt.core import Aviary - -# Step 2: define starting positions and orientations -start_pos = np.array([[0.0, 0.0, 1.0]]) -start_orn = np.array([[0.0, 0.0, 0.0]]) - -# Step 3: instantiate aviary -env = Aviary(start_pos=start_pos, start_orn=start_orn, render=True, drone_type="quadx") - -# Step 4: (Optional) define control mode to use for drone -env.set_mode(7) - -# Step 5: (Optional) define a setpoint for the first drone (at index 0) in the aviary -setpoint = np.array([1.0, 0.0, 0.0, 1.0]) -env.set_setpoint(0, setpoint) - -# Step 6: step the physics -for i in range(1000): - env.step() - -# Gracefully close -env.close() -``` - -### Controlling Drone Types - -The `drone_type` is a _lowercase_ string that defines the type of drone(s) to spawn in the `aviary`. -By default, PyFlyt ships with three different drones, listed under the [drones](../core/drones) section. -These are: - -1. `Fixedwing` -2. `Rocket` -3. `QuadX` - -So, for example, to spawn the `Fixedwing` drone instead of the `QuadX`, simply do: - -```python -... -env = Aviary(..., drone_type="fixedwing") -... -``` - -### Spawning Custom Drones - -For custom drones not shipped in PyFlyt (such as the [`RocketBrick`](https://github.com/jjshoots/PyFlyt/tree/master/examples/core/custom_uavs)), you can call them into the `aviary` by setting custom `drone_type_mappings`, and then calling them using `drone_type`: - -```python -... -# import the drone class so it's callable -from ... import MyCustomDrone - -# define a new drone so the aviary can call it -# note we do not instantiate the object, this is only a class pointer -drone_type_mappings = dict() -drone_type_mappings["mycustomdrone"] = MyCustomDrone - -# pass the relevant arguments to the `aviary` -env = Aviary(..., drone_type="mycustomdrone", drone_type_mappings=drone_type_mappings) -... -``` - -### Setting Drone Options - -Various drones can have different instantiation parameters, for example, the `Fixedwing` drone has a configurable starting velocity which the `QuadX` drone does not have. - -To define these custom parameters, use the `drone_options` argument like so: - -```python -... -# define the parameters for the underlying drone -drone_options = dict() -drone_options["starting_velocity"] = np.array([3.0, 0.0, 3.0]) - -# pass the relevant arguments to the `aviary` -env = Aviary(..., drone_type="fixedwing", drone_options=drone_options) -... -``` - -### Multi Drone Setup - -To spawn multiple drones with different types and parameters for each, lists of `drone_type` and `drone_options` can be used instead to give each drone a unique set of parameters. -For example: - -```python -... -# the starting position and orientations -start_pos = np.array([[0.0, 5.0, 5.0], [3.0, 3.0, 1.0], [5.0, 0.0, 1.0]]) -start_orn = np.zeros_like(start_pos) - -# spawn different types of drones -drone_type = ["rocket", "quadx", "fixedwing"] - -# individual spawn options for each drone -rocket_options = dict() -quadx_options = dict(use_camera=True, drone_model="primitive_drone") -fixedwing_options = dict(starting_velocity=np.array([0.0, 0.0, 0.0])) -drone_options = [rocket_options, quadx_options, fixedwing_options] - -# environment setup -env = Aviary( - start_pos=start_pos, - start_orn=start_orn, - render=True, - drone_type=drone_type, - drone_options=drone_options, -) - -# set quadx to position control, rocket and fixedwing as nothing -env.set_mode([0, 7, 0]) - -# simulate for 1000 steps (1000/120 ~= 8 seconds) -for i in range(1000): - env.step() -``` - -Here, we spawn three drones, a `Rocket`, a `QuadX` and a `Fixedwing`, at three different positions. -Each drone has different spawn options. - -### Accessing Individual Drones - -All drones are stored within a (very creatively named) `drones` attribute. -This allows raw access for any `drone` from outside the `aviary`. - -```python -... -# instantiate the aviary -env = Aviary(...) - -# we can get the camera image of the last drone -rgbImg = env.drones[-1].rgbImg -``` - -### Looprates - -By default, PyFlyt steps physics at 240 Hz - the default for a PyBullet environment. -This can be changed via the `physics_hz` argument, although this is not recommended as it can lead to unstable simulation. - -The various drones within the environment can also be configured to have a control looprate different to the physics looprate. -This is configured through the `drone_options` argument, like so: - -```python -... -# define a control looprate -drone_options = dict() -drone_options["control_hz"] = 120 - -# pass the relevant arguments to the `aviary` -env = Aviary(..., drone_type="quadx", drone_options=drone_options) -... -``` - -__All control looprates must be a common denominator of the physics looprate.__ -For instance, for a physics looprate of 240 Hz, a control looprate of 60 Hz is valid, but 50 is not since `240 % 50 != 0`. - -#### Single Drone Physics Stepping - -Every call to `step` of the `aviary` steps the simulation enough times for one control loop to elapse. -For example, if the physics looprate is 240 Hz and the control looprate is 120 Hz, each call to `step` steps the physics in the environment 2 times. - -#### Multi Drone Physics Stepping - -In a multi drone setting, it is possible for various drones to have various looprates. -The caveat here is that, when control looprates are arranged in ascending order, the `i+1`th looprate must be a round multiple of the `i`th looprate. -For instance, this is a valid set of looprates: - -```python -... -drone_options = [] -drone_options.append(dict(control_hz=60)) -drone_options.append(dict(control_hz=30)) -drone_options.append(dict(control_hz=120)) -... -``` - -... but this is not: - -```python -... -drone_options = [] -drone_options.append(dict(control_hz=40)) -drone_options.append(dict(control_hz=30)) -drone_options.append(dict(control_hz=120)) -... -``` - -In the first sample, when arranged in ascending order, we get a list of `looprates = [30, 60, 120]`. -When we do `looprate[1:] / looprate[:-1]`, we get `[2, 2]`, which is all integers. -This is valid. - -In the second sample, when arranged in ascending order, this list is `looprates = [30, 40, 120]`. -Similarly, when we do `looprate[1:] / looprate[:-1]`, we get `[1.25, 3]`, which is __not__ all integers. -This is __invalid__. - -## Class Description - -```{eval-rst} -.. autoclass:: PyFlyt.core.Aviary -``` - -### Attributes -```{eval-rst} -.. autoproperty:: PyFlyt.core.Aviary.all_states - -.. autoproperty:: PyFlyt.core.Aviary.all_aux_states - -.. property:: PyFlyt.core.Aviary.drones - - A list of all drones that the Aviary is currently handling. - -.. property:: PyFlyt.core.Aviary.contact_array - - A numpy array of collisions between entities. - Query whether an object with id `n` has contacted an object with id `m` via `contact_array[n, m]` or `contact_array[m, n]`. - It is also possible to do `np.any(contact_array)` to check for all collisions. - -.. property:: PyFlyt.core.Aviary.elapsed_ime - - A float representing the amount of time that has passed. - -.. property:: PyFlyt.core.Aviary.physics_steps - - An integer representing the number of times the physics engine has been stepped. - -.. property:: PyFlyt.core.Aviary.aviary_steps - - An integer representing the number of times `step` has been called. -``` - -### Methods -```{eval-rst} -.. autofunction:: PyFlyt.core.Aviary.print_all_bodies - -.. autofunction:: PyFlyt.core.Aviary.reset -.. autofunction:: PyFlyt.core.Aviary.register_all_new_bodies - -.. autofunction:: PyFlyt.core.Aviary.state -.. autofunction:: PyFlyt.core.Aviary.aux_state - -.. autofunction:: PyFlyt.core.Aviary.set_armed -.. autofunction:: PyFlyt.core.Aviary.set_mode -.. autofunction:: PyFlyt.core.Aviary.set_setpoint -.. autofunction:: PyFlyt.core.Aviary.set_all_setpoints - -.. autofunction:: PyFlyt.core.Aviary.step -``` diff --git a/docs/_sources/documentation/core/drones.md.txt b/docs/_sources/documentation/core/drones.md.txt deleted file mode 100644 index 30547fcb..00000000 --- a/docs/_sources/documentation/core/drones.md.txt +++ /dev/null @@ -1,12 +0,0 @@ -# Drones - -## Overview - -Several default UAV platforms are offered in PyFlyt. -These are: - -```{toctree} -drones/fixedwing -drones/rocket -drones/quadx -``` diff --git a/docs/_sources/documentation/core/drones/fixedwing.md.txt b/docs/_sources/documentation/core/drones/fixedwing.md.txt deleted file mode 100644 index 84c536d0..00000000 --- a/docs/_sources/documentation/core/drones/fixedwing.md.txt +++ /dev/null @@ -1,16 +0,0 @@ -# Fixedwing - -## Model Description - -Small tube-and-wing fixed wing UAV with a single motor (~2.5 Kg). - -## Control Mode - -Only one control mode is provided. -Setpoints are mapped directly to `[pitch, roll, yaw, thrust]` actuator commands. - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.drones.Fixedwing - :members: -``` diff --git a/docs/_sources/documentation/core/drones/quadx.md.txt b/docs/_sources/documentation/core/drones/quadx.md.txt deleted file mode 100644 index 6151bb76..00000000 --- a/docs/_sources/documentation/core/drones/quadx.md.txt +++ /dev/null @@ -1,27 +0,0 @@ -# QuadX - -## Model Description - -The QuadX UAV describes a multirotor UAV in the Quad-X configuration as described by [ArduPilot](https://ardupilot.org/copter/docs/connect-escs-and-motors.html) and [PX4](https://docs.px4.io/main/en/airframes/airframe_reference.html#quadrotor-x). -It consists of four motors with implementations for cascaded PID controllers. - -## Variants - -Two different models of the QuadX drone are provided. -This option can be selected through the `drone_model` parameter. -The available models are: - -- `cf2x` (default) -- `primitive_drone` - -## Control Modes - -The control mode of the QuadX can be changed using the [`Aviary.set_mode`](https://taijunjet.com/PyFlyt/documentation/core/aviary.html#PyFlyt.core.Aviary.set_mode) or specifically calling [`set_mode`](https://taijunjet.com/PyFlyt/documentation/core/drones/quadx.html#PyFlyt.core.drones.QuadX.set_mode) on the drone instance itself. -Inspired by [pybullet drones by University of Toronto's Dynamic Systems Lab](https://github.com/utiasDSL/gym-pybullet-drones). -The various modes available are documented [below](https://taijunjet.com/PyFlyt/documentation/core/drones/quadx.html#PyFlyt.core.drones.QuadX.set_mode). - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.drones.QuadX - :members: -``` diff --git a/docs/_sources/documentation/core/drones/rocket.md.txt b/docs/_sources/documentation/core/drones/rocket.md.txt deleted file mode 100644 index eb4f80b9..00000000 --- a/docs/_sources/documentation/core/drones/rocket.md.txt +++ /dev/null @@ -1,25 +0,0 @@ -# Rocket - -## Model Description - -The rocket describes a 1:10th scale SpaceX Falcon 9 v1.2 first stage and interstage. -Mass and geometry properties were extracted from [Space Launch Report datasheet](https://web.archive.org/web/20170825204357/spacelaunchreport.com/falcon9ft.html). - -## Control Mode - -Only one control mode is provided. -Setpoints correspond to: - -- finlet x deflection -- finlet y deflection -- finlet yaw -- ignition -- throttle -- booster gimbal axis 1 -- booster gimbal axis 2 - -## Class Description -```{eval-rst} -.. autoclass:: PyFlyt.core.drones.Rocket - :members: -``` diff --git a/docs/_sources/documentation/core/wind.md.txt b/docs/_sources/documentation/core/wind.md.txt deleted file mode 100644 index bda3e19b..00000000 --- a/docs/_sources/documentation/core/wind.md.txt +++ /dev/null @@ -1,49 +0,0 @@ -# Wind - -## Overview - -PyFlyt supports various wind field models, as well as provides the capability for users to define their own wind field models. - -## Preimplemented Wind Models - -Several popular wind models are provided: - -1. Lorem Ipsum - -They can be initialized in the `aviary` like so: - -```python -env = Aviary(..., wind_type="Lorem Ipsum") -``` - -## Simple Custom Wind Modelling - -For simple, stateless wind models (models that do not have state variables), it is possible to simply define the wind model as a Python method. -Then, the wind model can be hooked to the `aviary` using the `register_wind_field_function` method. -The following is an example: - -```{eval-rst} -.. literalinclude:: ../../../examples/core/09_simple_wind.py - :language: python -``` - -## More Complex Custom Wind Modelling - -To define custom wind models, refer the the example provided by the `WindFieldClass` below: - -```{eval-rst} -.. autoclass:: PyFlyt.core.abstractions.WindFieldClass -``` - -### Default Attributes -```{eval-rst} -.. property:: PyFlyt.core.abstractions.WindFieldClass.np_random - - **dtype** - `np.random.RandomState` -``` - -### Required Methods -```{eval-rst} -.. autofunction:: PyFlyt.core.abstractions.WindFieldClass.__init__ -.. autofunction:: PyFlyt.core.abstractions.DroneClass.__call__ -``` diff --git a/docs/_sources/documentation/gym_envs.md.txt b/docs/_sources/documentation/gym_envs.md.txt deleted file mode 100644 index 4a6eb1fa..00000000 --- a/docs/_sources/documentation/gym_envs.md.txt +++ /dev/null @@ -1,32 +0,0 @@ -# Gymnasium Environments - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_waypoint.gif - :width: 65% -``` - -Natively, PyFlyt provides various default [Gymnasium](https://gymnasium.farama.org/) environments for testing reinforcement learning algorithms. -Usage is no different to how Gymnasium environments are initialized: - -```python -import gymnasium -import PyFlyt.gym_envs # noqa - -env = gymnasium.make("PyFlyt/QuadX-Hover-v2", render_mode="human") -obs = env.reset() - -termination = False -truncation = False - -while not termination or truncation: - observation, reward, termination, truncation, info = env.step(env.action_space.sample()) -``` - -```{toctree} -:hidden: -gym_envs/quadx_hover_env -gym_envs/quadx_pole_balance_env -gym_envs/quadx_waypoints_env -gym_envs/quadx_pole_waypoints_env -gym_envs/fixedwing_waypoints_env -gym_envs/rocket_landing_env -``` diff --git a/docs/_sources/documentation/gym_envs/fixedwing_waypoints_env.md.txt b/docs/_sources/documentation/gym_envs/fixedwing_waypoints_env.md.txt deleted file mode 100644 index f338544e..00000000 --- a/docs/_sources/documentation/gym_envs/fixedwing_waypoints_env.md.txt +++ /dev/null @@ -1,50 +0,0 @@ -# `PyFlyt/Fixedwing-Waypoints-v2` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/fixedwing_waypoint.gif - :width: 50% -``` - -## Task Description - -The goal of this environment is to fly a fixedwing aircraft towards a set of waypoints as fast as possible. - -## Usage - -```python -import gymnasium -import PyFlyt.gym_envs - -env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v2", render_mode="human") - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Flattening the Environment - -This environment uses the [`Dict`](https://gymnasium.farama.org/api/spaces/composite/#dict) and [`Sequence`](https://gymnasium.farama.org/api/spaces/composite/#sequence) spaces from `Gymnasium`, which are spaces with non-constant sizes. -This allows them to have complete observability without observation padding while making (human-)readability easier. -However, this results in them not being compatible with most popular reinforcement learning libraries like [Stable Baselines 3](https://stable-baselines3.readthedocs.io/en/master/) without custom wrappers. -If you would like to use this environment with those libraries, you can flatten the environment using the `FlattenWaypointEnv` wrapper, where the argument `context_length` specifies how many immediate targets are included in the observation. - -```python -import gymnasium -import PyFlyt.gym_envs -from PyFlyt.gym_envs import FlattenWaypointEnv - -env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v2", render_mode="human") -env = FlattenWaypointEnv(env, context_length=2) - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Environment Options - -```{eval-rst} -.. autoclass:: PyFlyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env.FixedwingWaypointsEnv -``` diff --git a/docs/_sources/documentation/gym_envs/quadx_hover_env.md.txt b/docs/_sources/documentation/gym_envs/quadx_hover_env.md.txt deleted file mode 100644 index 7fb3df7f..00000000 --- a/docs/_sources/documentation/gym_envs/quadx_hover_env.md.txt +++ /dev/null @@ -1,29 +0,0 @@ -# `PyFlyt/QuadX-Hover-v2` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_hover.gif - :width: 50% -``` - -## Task Description - -The goal of this environment is to hover a quadrotor drone for as long as possible. - -## Usage - -```python -import gymnasium -import PyFlyt.gym_envs - -env = gymnasium.make("PyFlyt/QuadX-Hover-v2", render_mode="human") - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Environment Options - -```{eval-rst} -.. autoclass:: PyFlyt.gym_envs.quadx_envs.quadx_hover_env.QuadXHoverEnv -``` diff --git a/docs/_sources/documentation/gym_envs/quadx_pole_balance_env.md.txt b/docs/_sources/documentation/gym_envs/quadx_pole_balance_env.md.txt deleted file mode 100644 index be13772a..00000000 --- a/docs/_sources/documentation/gym_envs/quadx_pole_balance_env.md.txt +++ /dev/null @@ -1,29 +0,0 @@ -# `PyFlyt/QuadX-Pole-Balance-v2` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_pole_balance.gif - :width: 50% -``` - -## Task Description - -The goal of this environment is to hover a quadrotor drone for as long as possible while balancing a 1 meter long pole. - -## Usage - -```python -import gymnasium -import PyFlyt.gym_envs - -env = gymnasium.make("PyFlyt/QuadX-Pole-Balance-v2", render_mode="human") - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Environment Options - -```{eval-rst} -.. autoclass:: PyFlyt.gym_envs.quadx_envs.quadx_pole_balance_env.QuadXPoleBalanceEnv -``` diff --git a/docs/_sources/documentation/gym_envs/quadx_pole_waypoints_env.md.txt b/docs/_sources/documentation/gym_envs/quadx_pole_waypoints_env.md.txt deleted file mode 100644 index aa196539..00000000 --- a/docs/_sources/documentation/gym_envs/quadx_pole_waypoints_env.md.txt +++ /dev/null @@ -1,50 +0,0 @@ -# `PyFlyt/QuadX-Pole-Waypoints-v2` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_pole_waypoint.gif - :width: 50% -``` - -## Task Description - -The goal of this environment is to fly a quadrotor aircraft towards a set of waypoints as fast as possible while balancing a 1 meter long pole. - -## Usage - -```python -import gymnasium -import PyFlyt.gym_envs - -env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v2", render_mode="human") - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Flattening the Environment - -This environment uses the [`Dict`](https://gymnasium.farama.org/api/spaces/composite/#dict) and [`Sequence`](https://gymnasium.farama.org/api/spaces/composite/#sequence) spaces from `Gymnasium`, which are spaces with non-constant sizes. -This allows them to have complete observability without observation padding while making (human-)readability easier. -However, this results in them not being compatible with most popular reinforcement learning libraries like [Stable Baselines 3](https://stable-baselines3.readthedocs.io/en/master/) without custom wrappers. -If you would like to use this environment with those libraries, you can flatten the environment using the `FlattenWaypointEnv` wrapper, where the argument `context_length` specifies how many immediate targets are included in the observation. - -```python -import gymnasium -import PyFlyt.gym_envs -from PyFlyt.gym_envs import FlattenWaypointEnv - -env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v2", render_mode="human") -env = FlattenWaypointEnv(env, context_length=2) - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Environment Options - -```{eval-rst} -.. autoclass:: PyFlyt.gym_envs.quadx_envs.quadx_pole_waypoints_env.QuadXPoleWaypointsEnv -``` diff --git a/docs/_sources/documentation/gym_envs/quadx_waypoints_env.md.txt b/docs/_sources/documentation/gym_envs/quadx_waypoints_env.md.txt deleted file mode 100644 index 10f66ead..00000000 --- a/docs/_sources/documentation/gym_envs/quadx_waypoints_env.md.txt +++ /dev/null @@ -1,50 +0,0 @@ -# `PyFlyt/QuadX-Waypoints-v2` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_waypoint.gif - :width: 50% -``` - -## Task Description - -The goal of this environment is to fly a quadrotor aircraft towards a set of waypoints as fast as possible. - -## Usage - -```python -import gymnasium -import PyFlyt.gym_envs - -env = gymnasium.make("PyFlyt/QuadX-Waypoints-v2", render_mode="human") - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Flattening the Environment - -This environment uses the [`Dict`](https://gymnasium.farama.org/api/spaces/composite/#dict) and [`Sequence`](https://gymnasium.farama.org/api/spaces/composite/#sequence) spaces from `Gymnasium`, which are spaces with non-constant sizes. -This allows them to have complete observability without observation padding while making (human-)readability easier. -However, this results in them not being compatible with most popular reinforcement learning libraries like [Stable Baselines 3](https://stable-baselines3.readthedocs.io/en/master/) without custom wrappers. -If you would like to use this environment with those libraries, you can flatten the environment using the `FlattenWaypointEnv` wrapper, where the argument `context_length` specifies how many immediate targets are included in the observation. - -```python -import gymnasium -import PyFlyt.gym_envs -from PyFlyt.gym_envs import FlattenWaypointEnv - -env = gymnasium.make("PyFlyt/QuadX-Waypoints-v2", render_mode="human") -env = FlattenWaypointEnv(env, context_length=2) - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Environment Options - -```{eval-rst} -.. autoclass:: PyFlyt.gym_envs.quadx_envs.quadx_waypoints_env.QuadXWaypointsEnv -``` diff --git a/docs/_sources/documentation/gym_envs/rocket_landing_env.md.txt b/docs/_sources/documentation/gym_envs/rocket_landing_env.md.txt deleted file mode 100644 index 3a2c956d..00000000 --- a/docs/_sources/documentation/gym_envs/rocket_landing_env.md.txt +++ /dev/null @@ -1,29 +0,0 @@ -# `PyFlyt/Rocket-Landing-v2` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/rocket_landing.gif - :width: 50% -``` - -## Task Description - -The goal of this environment is to land a rocket falling at terminal velocity on a landing pad, with only 1% of fuel remaining. - -## Usage - -```python -import gymnasium -import PyFlyt.gym_envs - -env = gymnasium.make("PyFlyt/Rocket-Landing-v2", render_mode="human") - -term, trunc = False, False -obs, _ = env.reset() -while not (term or trunc): - obs, rew, term, trunc, _ = env.step(env.action_space.sample()) -``` - -## Environment Options - -```{eval-rst} -.. autoclass:: PyFlyt.gym_envs.rocket_envs.rocket_landing_env.RocketLandingEnv -``` diff --git a/docs/_sources/documentation/pz_envs.md.txt b/docs/_sources/documentation/pz_envs.md.txt deleted file mode 100644 index 9df55c64..00000000 --- a/docs/_sources/documentation/pz_envs.md.txt +++ /dev/null @@ -1,29 +0,0 @@ -# PettingZoo Environments - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/fixedwing_dogfight.gif - :width: 65% -``` - -While PettingZoo may not provide the fastest API for multi agent reinforcement learning environments, it is the most widely supported and well maintained API. -For that reason, PyFlyt provides various default [PettingZoo](https://pettingzoo.farama.org/) environments for testing reinforcement learning algorithms. -All environments are by default [ParallelEnv](https://pettingzoo.farama.org/api/parallel/)s. -Usage is no different to how PettingZoo environments are initialized: - -```python -from PyFlyt.pz_envs import MAQuadXHoverEnv -env = MAQuadXHoverEnv(render_mode="human") -observations, infos = env.reset(seed=42) - -while env.agents: - # this is where you would insert your policy - actions = {agent: env.action_space(agent).sample() for agent in env.agents} - - observations, rewards, terminations, truncations, infos = env.step(actions) -env.close() -``` - -```{toctree} -:hidden: -pz_envs/ma_quadx_hover_env -pz_envs/ma_fixedwing_dogfight_env -``` diff --git a/docs/_sources/documentation/pz_envs/ma_fixedwing_dogfight_env.md.txt b/docs/_sources/documentation/pz_envs/ma_fixedwing_dogfight_env.md.txt deleted file mode 100644 index 32e4015e..00000000 --- a/docs/_sources/documentation/pz_envs/ma_fixedwing_dogfight_env.md.txt +++ /dev/null @@ -1,41 +0,0 @@ -# `MAFixedwingDogfightEnv` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/fixedwing_dogfight.gif - :width: 50% -``` - -## Task Description - -This is a reinforcement learning environment for training AI agents to perform aerial dogfighting. - -## Usage - -```python -from PyFlyt.pz_envs import MAFixedwingDogfightEnv - -env = MAFixedwingDogfightEnv(render_mode="human") -observations, infos = env.reset() - -while env.agents: - # this is where you would insert your policy - actions = {agent: env.action_space(agent).sample() for agent in env.agents} - - observations, rewards, terminations, truncations, infos = env.step(actions) -env.close() -``` - -## Environment Rules - -- This is a cannons only environment. Meaning there are no missiles. An agent has to point its nose directly at the enemy for it to be considered a hit. -- The gun is only effective within `lethal range`. Outside of this range, the gun deals no damage. -- The gun automatically fires when it can, there is no action for the agent to fire the weapon. This is similar to many [fire control systems](https://en.wikipedia.org/wiki/Fire-control_system) on modern aircraft. -- An agent loses if it: - a) Hits anything - b) Flies out of bounds - c) Loses all its health - -## Environment Options - -```{eval-rst} -.. autoclass:: PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env.MAFixedwingDogfightEnv -``` diff --git a/docs/_sources/documentation/pz_envs/ma_quadx_hover_env.md.txt b/docs/_sources/documentation/pz_envs/ma_quadx_hover_env.md.txt deleted file mode 100644 index 6820c061..00000000 --- a/docs/_sources/documentation/pz_envs/ma_quadx_hover_env.md.txt +++ /dev/null @@ -1,31 +0,0 @@ -# `MAQuadXHoverEnv` - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_hover.gif - :width: 50% -``` - -## Task Description - -The goal of this environment is for all agents to hover at their starting positions for as long as possible. - -## Usage - -```python -from PyFlyt.pz_envs import MAQuadXHoverEnv - -env = MAQuadXHoverEnv(render_mode="human") -observations, infos = env.reset() - -while env.agents: - # this is where you would insert your policy - actions = {agent: env.action_space(agent).sample() for agent in env.agents} - - observations, rewards, terminations, truncations, infos = env.step(actions) -env.close() -``` - -## Environment Options - -```{eval-rst} -.. autoclass:: PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env.MAQuadXHoverEnv -``` diff --git a/docs/_sources/index.md.txt b/docs/_sources/index.md.txt deleted file mode 100644 index 24e6ff0d..00000000 --- a/docs/_sources/index.md.txt +++ /dev/null @@ -1,27 +0,0 @@ ---- -hide-toc: true -firstpage: -lastpage: ---- - -```{toctree} -:hidden: -documentation -tutorials -paper -``` - -# PyFlyt - UAV Simulation Environments for Reinforcement Learning Research - -```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/pyflyt_cover_photo.png - :width: 80% -``` - -# Description - -PyFlyt is a library for testing reinforcement learning algorithms on UAVs. - -It is built on the [Bullet](https://pybullet.org/wordpress/) physics engine, offers flexible rendering options, -time-discrete steppable physics, Python bindings, and support for custom drones of any configuration, be it biplanes, quadcopters, rockets, and anything you can think of. - -To get started, visit the [documentation](documentation)! diff --git a/docs/_sources/paper.md.txt b/docs/_sources/paper.md.txt deleted file mode 100644 index 3799dcbb..00000000 --- a/docs/_sources/paper.md.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Paper Publication - -## Preprint - -A preprint of our paper is available [here](https://arxiv.org/abs/2304.01305). - -## Citation - -If you wish to cite our work: -```bibtex -@article{tai2023pyflyt, - title={PyFlyt--UAV Simulation Environments for Reinforcement Learning Research}, - author={Tai, Jun Jet and Wong, Jim and Innocente, Mauro and Horri, Nadjim and Brusey, James and Phang, Swee King}, - journal={arXiv preprint arXiv:2304.01305}, - year={2023} -} -``` diff --git a/docs/_sources/tutorials.md.txt b/docs/_sources/tutorials.md.txt deleted file mode 100644 index b1a8165e..00000000 --- a/docs/_sources/tutorials.md.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Tutorials - -```{toctree} -:hidden: -``` - -Kindly refer to [here](https://github.com/jjshoots/PyFlyt/tree/master/examples/core). diff --git a/docs/_static/basic.css b/docs/_static/basic.css deleted file mode 100644 index 2af6139e..00000000 --- a/docs/_static/basic.css +++ /dev/null @@ -1,925 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 270px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a:visited { - color: #551A8B; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -nav.contents, -aside.topic, -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -nav.contents, -aside.topic, -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -.sig dd { - margin-top: 0px; - margin-bottom: 0px; -} - -.sig dl { - margin-top: 0px; - margin-bottom: 0px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -.translated { - background-color: rgba(207, 255, 207, 0.2) -} - -.untranslated { - background-color: rgba(255, 207, 207, 0.2) -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js deleted file mode 100644 index 4d67807d..00000000 --- a/docs/_static/doctools.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", -]); - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js deleted file mode 100644 index 7e4c114f..00000000 --- a/docs/_static/documentation_options.js +++ /dev/null @@ -1,13 +0,0 @@ -const DOCUMENTATION_OPTIONS = { - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/docs/_static/file.png b/docs/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/docs/_static/language_data.js b/docs/_static/language_data.js deleted file mode 100644 index 367b8ed8..00000000 --- a/docs/_static/language_data.js +++ /dev/null @@ -1,199 +0,0 @@ -/* - * language_data.js - * ~~~~~~~~~~~~~~~~ - * - * This script contains the language-specific data used by searchtools.js, - * namely the list of stopwords, stemmer, scorer and splitter. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; - - -/* Non-minified version is copied as a separate JS file, if available */ - -/** - * Porter Stemmer - */ -var Stemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' - }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} - diff --git a/docs/_static/minus.png b/docs/_static/minus.png deleted file mode 100644 index d96755fdaf8bb2214971e0db9c1fd3077d7c419d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK diff --git a/docs/_static/plus.png b/docs/_static/plus.png deleted file mode 100644 index 7107cec93a979b9a5f64843235a16651d563ce2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css deleted file mode 100644 index 012e6a00..00000000 --- a/docs/_static/pygments.css +++ /dev/null @@ -1,152 +0,0 @@ -html[data-theme="light"] .highlight pre { line-height: 125%; } -html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -html[data-theme="light"] .highlight .hll { background-color: #fae4c2 } -html[data-theme="light"] .highlight { background: #fefefe; color: #080808 } -html[data-theme="light"] .highlight .c { color: #515151 } /* Comment */ -html[data-theme="light"] .highlight .err { color: #a12236 } /* Error */ -html[data-theme="light"] .highlight .k { color: #6730c5 } /* Keyword */ -html[data-theme="light"] .highlight .l { color: #7f4707 } /* Literal */ -html[data-theme="light"] .highlight .n { color: #080808 } /* Name */ -html[data-theme="light"] .highlight .o { color: #00622f } /* Operator */ -html[data-theme="light"] .highlight .p { color: #080808 } /* Punctuation */ -html[data-theme="light"] .highlight .ch { color: #515151 } /* Comment.Hashbang */ -html[data-theme="light"] .highlight .cm { color: #515151 } /* Comment.Multiline */ -html[data-theme="light"] .highlight .cp { color: #515151 } /* Comment.Preproc */ -html[data-theme="light"] .highlight .cpf { color: #515151 } /* Comment.PreprocFile */ -html[data-theme="light"] .highlight .c1 { color: #515151 } /* Comment.Single */ -html[data-theme="light"] .highlight .cs { color: #515151 } /* Comment.Special */ -html[data-theme="light"] .highlight .gd { color: #005b82 } /* Generic.Deleted */ -html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ -html[data-theme="light"] .highlight .gh { color: #005b82 } /* Generic.Heading */ -html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ -html[data-theme="light"] .highlight .gu { color: #005b82 } /* Generic.Subheading */ -html[data-theme="light"] .highlight .kc { color: #6730c5 } /* Keyword.Constant */ -html[data-theme="light"] .highlight .kd { color: #6730c5 } /* Keyword.Declaration */ -html[data-theme="light"] .highlight .kn { color: #6730c5 } /* Keyword.Namespace */ -html[data-theme="light"] .highlight .kp { color: #6730c5 } /* Keyword.Pseudo */ -html[data-theme="light"] .highlight .kr { color: #6730c5 } /* Keyword.Reserved */ -html[data-theme="light"] .highlight .kt { color: #7f4707 } /* Keyword.Type */ -html[data-theme="light"] .highlight .ld { color: #7f4707 } /* Literal.Date */ -html[data-theme="light"] .highlight .m { color: #7f4707 } /* Literal.Number */ -html[data-theme="light"] .highlight .s { color: #00622f } /* Literal.String */ -html[data-theme="light"] .highlight .na { color: #912583 } /* Name.Attribute */ -html[data-theme="light"] .highlight .nb { color: #7f4707 } /* Name.Builtin */ -html[data-theme="light"] .highlight .nc { color: #005b82 } /* Name.Class */ -html[data-theme="light"] .highlight .no { color: #005b82 } /* Name.Constant */ -html[data-theme="light"] .highlight .nd { color: #7f4707 } /* Name.Decorator */ -html[data-theme="light"] .highlight .ni { color: #00622f } /* Name.Entity */ -html[data-theme="light"] .highlight .ne { color: #6730c5 } /* Name.Exception */ -html[data-theme="light"] .highlight .nf { color: #005b82 } /* Name.Function */ -html[data-theme="light"] .highlight .nl { color: #7f4707 } /* Name.Label */ -html[data-theme="light"] .highlight .nn { color: #080808 } /* Name.Namespace */ -html[data-theme="light"] .highlight .nx { color: #080808 } /* Name.Other */ -html[data-theme="light"] .highlight .py { color: #005b82 } /* Name.Property */ -html[data-theme="light"] .highlight .nt { color: #005b82 } /* Name.Tag */ -html[data-theme="light"] .highlight .nv { color: #a12236 } /* Name.Variable */ -html[data-theme="light"] .highlight .ow { color: #6730c5 } /* Operator.Word */ -html[data-theme="light"] .highlight .pm { color: #080808 } /* Punctuation.Marker */ -html[data-theme="light"] .highlight .w { color: #080808 } /* Text.Whitespace */ -html[data-theme="light"] .highlight .mb { color: #7f4707 } /* Literal.Number.Bin */ -html[data-theme="light"] .highlight .mf { color: #7f4707 } /* Literal.Number.Float */ -html[data-theme="light"] .highlight .mh { color: #7f4707 } /* Literal.Number.Hex */ -html[data-theme="light"] .highlight .mi { color: #7f4707 } /* Literal.Number.Integer */ -html[data-theme="light"] .highlight .mo { color: #7f4707 } /* Literal.Number.Oct */ -html[data-theme="light"] .highlight .sa { color: #00622f } /* Literal.String.Affix */ -html[data-theme="light"] .highlight .sb { color: #00622f } /* Literal.String.Backtick */ -html[data-theme="light"] .highlight .sc { color: #00622f } /* Literal.String.Char */ -html[data-theme="light"] .highlight .dl { color: #00622f } /* Literal.String.Delimiter */ -html[data-theme="light"] .highlight .sd { color: #00622f } /* Literal.String.Doc */ -html[data-theme="light"] .highlight .s2 { color: #00622f } /* Literal.String.Double */ -html[data-theme="light"] .highlight .se { color: #00622f } /* Literal.String.Escape */ -html[data-theme="light"] .highlight .sh { color: #00622f } /* Literal.String.Heredoc */ -html[data-theme="light"] .highlight .si { color: #00622f } /* Literal.String.Interpol */ -html[data-theme="light"] .highlight .sx { color: #00622f } /* Literal.String.Other */ -html[data-theme="light"] .highlight .sr { color: #a12236 } /* Literal.String.Regex */ -html[data-theme="light"] .highlight .s1 { color: #00622f } /* Literal.String.Single */ -html[data-theme="light"] .highlight .ss { color: #005b82 } /* Literal.String.Symbol */ -html[data-theme="light"] .highlight .bp { color: #7f4707 } /* Name.Builtin.Pseudo */ -html[data-theme="light"] .highlight .fm { color: #005b82 } /* Name.Function.Magic */ -html[data-theme="light"] .highlight .vc { color: #a12236 } /* Name.Variable.Class */ -html[data-theme="light"] .highlight .vg { color: #a12236 } /* Name.Variable.Global */ -html[data-theme="light"] .highlight .vi { color: #a12236 } /* Name.Variable.Instance */ -html[data-theme="light"] .highlight .vm { color: #7f4707 } /* Name.Variable.Magic */ -html[data-theme="light"] .highlight .il { color: #7f4707 } /* Literal.Number.Integer.Long */ -html[data-theme="dark"] .highlight pre { line-height: 125%; } -html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } -html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } -html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ -html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ -html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ -html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ -html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ -html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ -html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ -html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ -html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ -html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ -html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ -html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ -html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ -html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ -html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ -html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ -html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ -html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ -html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ -html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ -html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ -html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ -html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ -html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ -html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ -html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ -html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ -html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ -html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ -html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ -html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ -html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ -html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ -html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ -html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ -html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ -html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ -html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ -html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ -html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ -html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ -html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ -html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ -html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ -html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ -html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ -html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ -html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ -html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ -html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ -html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ -html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ -html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ -html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ -html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ -html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ -html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ -html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ -html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ -html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ -html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ -html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ -html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ -html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ -html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ -html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ -html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ -html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ -html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_static/scripts/bootstrap.js b/docs/_static/scripts/bootstrap.js deleted file mode 100644 index c8178deb..00000000 --- a/docs/_static/scripts/bootstrap.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see bootstrap.js.LICENSE.txt */ -(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>E,afterRead:()=>v,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>J,auto:()=>a,basePlacements:()=>l,beforeMain:()=>y,beforeRead:()=>_,beforeWrite:()=>A,bottom:()=>s,clippingParents:()=>d,computeStyles:()=>it,createPopper:()=>Dt,createPopperBase:()=>St,createPopperLite:()=>$t,detectOverflow:()=>_t,end:()=>h,eventListeners:()=>st,flip:()=>bt,hide:()=>wt,left:()=>r,main:()=>w,modifierPhases:()=>O,offset:()=>Et,placements:()=>g,popper:()=>f,popperGenerator:()=>Lt,popperOffsets:()=>At,preventOverflow:()=>Tt,read:()=>b,reference:()=>p,right:()=>o,start:()=>c,top:()=>n,variationPlacements:()=>m,viewport:()=>u,write:()=>T});var i={};t.r(i),t.d(i,{Alert:()=>Oe,Button:()=>ke,Carousel:()=>li,Collapse:()=>Ei,Dropdown:()=>Ki,Modal:()=>Ln,Offcanvas:()=>Kn,Popover:()=>bs,ScrollSpy:()=>Ls,Tab:()=>Js,Toast:()=>po,Tooltip:()=>fs});var n="top",s="bottom",o="right",r="left",a="auto",l=[n,s,o,r],c="start",h="end",d="clippingParents",u="viewport",f="popper",p="reference",m=l.reduce((function(t,e){return t.concat([e+"-"+c,e+"-"+h])}),[]),g=[].concat(l,[a]).reduce((function(t,e){return t.concat([e,e+"-"+c,e+"-"+h])}),[]),_="beforeRead",b="read",v="afterRead",y="beforeMain",w="main",E="afterMain",A="beforeWrite",T="write",C="afterWrite",O=[_,b,v,y,w,E,A,T,C];function x(t){return t?(t.nodeName||"").toLowerCase():null}function k(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function L(t){return t instanceof k(t).Element||t instanceof Element}function S(t){return t instanceof k(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof k(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];S(s)&&x(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});S(n)&&x(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var N=Math.max,P=Math.min,M=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function F(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&S(t)&&(s=t.offsetWidth>0&&M(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&M(n.height)/t.offsetHeight||1);var r=(L(t)?k(t):window).visualViewport,a=!F()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function B(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function W(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function z(t){return k(t).getComputedStyle(t)}function R(t){return["table","td","th"].indexOf(x(t))>=0}function q(t){return((L(t)?t.ownerDocument:t.document)||window.document).documentElement}function V(t){return"html"===x(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function Y(t){return S(t)&&"fixed"!==z(t).position?t.offsetParent:null}function K(t){for(var e=k(t),i=Y(t);i&&R(i)&&"static"===z(i).position;)i=Y(i);return i&&("html"===x(i)||"body"===x(i)&&"static"===z(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&S(t)&&"fixed"===z(t).position)return null;var i=V(t);for(D(i)&&(i=i.host);S(i)&&["html","body"].indexOf(x(i))<0;){var n=z(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return N(t,P(e,i))}function U(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function G(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const J={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,c=t.options,h=i.elements.arrow,d=i.modifiersData.popperOffsets,u=I(i.placement),f=Q(u),p=[r,o].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return U("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:G(t,l))}(c.padding,i),g=B(h),_="y"===f?n:r,b="y"===f?s:o,v=i.rects.reference[p]+i.rects.reference[f]-d[f]-i.rects.popper[p],y=d[f]-i.rects.reference[f],w=K(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=X(T,O,C),k=f;i.modifiersData[a]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&W(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,l=t.placement,c=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=r,C=n,O=window;if(p){var x=K(i),L="clientHeight",S="clientWidth";x===k(i)&&"static"!==z(x=q(i)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===n||(l===r||l===o)&&c===h)&&(C=s,y-=(g&&x===O&&O.visualViewport?O.visualViewport.height:x[L])-a.height,y*=f?1:-1),l!==r&&(l!==n&&l!==s||c!==h)||(T=o,b-=(g&&x===O&&O.visualViewport?O.visualViewport.width:x[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&tt),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:M(i*s)/s||0,y:M(n*s)/s||0}}({x:b,y},k(i)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:I(e.placement),variation:Z(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var nt={passive:!0};const st={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=k(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&l.addEventListener("resize",i.update,nt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&l.removeEventListener("resize",i.update,nt)}},data:{}};var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function lt(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t){var e=k(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ht(t){return H(q(t)).left+ct(t).scrollLeft}function dt(t){var e=z(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(x(t))>=0?t.ownerDocument.body:S(t)&&dt(t)?t:ut(V(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=k(n),r=s?[o].concat(o.visualViewport||[],dt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ft(V(r)))}function pt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function mt(t,e,i){return e===u?pt(function(t,e){var i=k(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=F();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ht(t),y:l}}(t,i)):L(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):pt(function(t){var e,i=q(t),n=ct(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=N(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=N(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ht(t),l=-n.scrollTop;return"rtl"===z(s||i).direction&&(a+=N(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,i=t.reference,a=t.element,l=t.placement,d=l?I(l):null,u=l?Z(l):null,f=i.x+i.width/2-a.width/2,p=i.y+i.height/2-a.height/2;switch(d){case n:e={x:f,y:i.y-a.height};break;case s:e={x:f,y:i.y+i.height};break;case o:e={x:i.x+i.width,y:p};break;case r:e={x:i.x-a.width,y:p};break;default:e={x:i.x,y:i.y}}var m=d?Q(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case c:e[m]=e[m]-(i[g]/2-a[g]/2);break;case h:e[m]=e[m]+(i[g]/2-a[g]/2)}}return e}function _t(t,e){void 0===e&&(e={});var i=e,r=i.placement,a=void 0===r?t.placement:r,c=i.strategy,h=void 0===c?t.strategy:c,m=i.boundary,g=void 0===m?d:m,_=i.rootBoundary,b=void 0===_?u:_,v=i.elementContext,y=void 0===v?f:v,w=i.altBoundary,E=void 0!==w&&w,A=i.padding,T=void 0===A?0:A,C=U("number"!=typeof T?T:G(T,l)),O=y===f?p:f,k=t.rects.popper,D=t.elements[E?O:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ft(V(t)),i=["absolute","fixed"].indexOf(z(t).position)>=0&&S(t)?K(t):t;return L(i)?e.filter((function(t){return L(t)&&W(t,i)&&"body"!==x(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=mt(t,i,n);return e.top=N(s.top,e.top),e.right=P(s.right,e.right),e.bottom=P(s.bottom,e.bottom),e.left=N(s.left,e.left),e}),mt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(L(D)?D:D.contextElement||q(t.elements.popper),g,b,h),I=H(t.elements.reference),M=gt({reference:I,element:k,strategy:"absolute",placement:a}),j=pt(Object.assign({},k,M)),F=y===f?j:I,B={top:$.top-F.top+C.top,bottom:F.bottom-$.bottom+C.bottom,left:$.left-F.left+C.left,right:F.right-$.right+C.right},R=t.modifiersData.offset;if(y===f&&R){var Y=R[a];Object.keys(B).forEach((function(t){var e=[o,s].indexOf(t)>=0?1:-1,i=[n,s].indexOf(t)>=0?"y":"x";B[t]+=Y[i]*e}))}return B}const bt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=i.mainAxis,u=void 0===d||d,f=i.altAxis,p=void 0===f||f,_=i.fallbackPlacements,b=i.padding,v=i.boundary,y=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,A=void 0===E||E,T=i.allowedAutoPlacements,C=e.options.placement,O=I(C),x=_||(O!==C&&A?function(t){if(I(t)===a)return[];var e=rt(t);return[lt(t),e,lt(e)]}(C):[rt(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,d=Z(n),u=d?a?m:m.filter((function(t){return Z(t)===d})):l,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var p=f.reduce((function(e,i){return e[i]=_t(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[I(i)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,$=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=_t(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?o:r:F?s:n;L[B]>S[B]&&(z=rt(z));var R=rt(z),q=[];if(u&&q.push(W[j]<=0),p&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,$=!1;break}D.set(M,q)}if($)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function vt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function yt(t){return[n,o,s,r].some((function(e){return t[e]>=0}))}const wt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=_t(e,{elementContext:"reference"}),a=_t(e,{altBoundary:!0}),l=vt(r,n),c=vt(a,s,o),h=yt(l),d=yt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,s=t.name,a=i.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,i){return t[i]=function(t,e,i){var s=I(t),a=[r,n].indexOf(s)>=0?-1:1,l="function"==typeof i?i(Object.assign({},e,{placement:t})):i,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[r,o].indexOf(s)>=0?{x:h,y:c}:{x:c,y:h}}(i,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[s]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Tt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,l=i.mainAxis,h=void 0===l||l,d=i.altAxis,u=void 0!==d&&d,f=i.boundary,p=i.rootBoundary,m=i.altBoundary,g=i.padding,_=i.tether,b=void 0===_||_,v=i.tetherOffset,y=void 0===v?0:v,w=_t(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=I(e.placement),A=Z(e.placement),T=!A,C=Q(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),$=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?n:r,H="y"===C?s:o,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[H],V=b?-L[W]/2:0,Y=A===c?k[W]:L[W],U=A===c?-L[W]:-k[W],G=e.elements.arrow,J=b&&G?B(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[H],nt=X(0,k[W],J[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:Y-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==$?void 0:$[C])?j:0,ct=z+ot-lt,ht=X(b?P(R,z+st-lt-at):R,z,b?N(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?n:r,ft="x"===C?s:o,pt=x[O],mt="y"===O?"height":"width",gt=pt+w[ut],bt=pt-w[ft],vt=-1!==[n,r].indexOf(E),yt=null!=(dt=null==$?void 0:$[O])?dt:0,wt=vt?gt:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,Et):X(b?wt:gt,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=S(e),r=S(e)&&function(t){var e=t.getBoundingClientRect(),i=M(e.width)/t.offsetWidth||1,n=M(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==x(e)||dt(a))&&(c=(n=e)!==k(n)&&S(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ct(n)),S(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ht(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ot(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var xt={placement:"bottom",modifiers:[],strategy:"absolute"};function kt(){for(var t=arguments.length,e=new Array(t),i=0;iIt.has(t)&&It.get(t).get(e)||null,remove(t,e){if(!It.has(t))return;const i=It.get(t);i.delete(e),0===i.size&&It.delete(t)}},Pt="transitionend",Mt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),jt=t=>{t.dispatchEvent(new Event(Pt))},Ft=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Ft(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Mt(t)):null,Bt=t=>{if(!Ft(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Wt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),zt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?zt(t.parentNode):null},Rt=()=>{},qt=t=>{t.offsetHeight},Vt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Yt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Vt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Yt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Yt)t()})),Yt.push(e)):e()},Xt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Ut=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Pt,o),Xt(t))};e.addEventListener(Pt,o),setTimeout((()=>{s||jt(e)}),n)},Gt=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Jt=/[^.]*(?=\..*)\.|.*/,Zt=/\..*/,te=/::\d+$/,ee={};let ie=1;const ne={mouseenter:"mouseover",mouseleave:"mouseout"},se=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function oe(t,e){return e&&`${e}::${ie++}`||t.uidEvent||ie++}function re(t){const e=oe(t);return t.uidEvent=e,ee[e]=ee[e]||{},ee[e]}function ae(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function le(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return se.has(o)||(o=t),[n,s,o]}function ce(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=le(e,i,n);if(e in ne){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=re(t),c=l[a]||(l[a]={}),h=ae(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=oe(r,e.replace(Jt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return pe(s,{delegateTarget:r}),n.oneOff&&fe.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return pe(n,{delegateTarget:t}),i.oneOff&&fe.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function he(t,e,i,n,s){const o=ae(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function de(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&he(t,e,i,r.callable,r.delegationSelector)}function ue(t){return t=t.replace(Zt,""),ne[t]||t}const fe={on(t,e,i,n){ce(t,e,i,n,!1)},one(t,e,i,n){ce(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=le(e,i,n),a=r!==e,l=re(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))de(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(te,"");a&&!e.includes(s)||he(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;he(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Vt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=pe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function pe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function ge(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const _e={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${ge(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${ge(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${ge(e)}`))};class be{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Ft(e)?_e.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Ft(e)?_e.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=Ft(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class ve extends be{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),Nt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Nt.remove(this._element,this.constructor.DATA_KEY),fe.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Ut(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Nt.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ye=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>Mt(t))).join(","):null},we={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Wt(t)&&Bt(t)))},getSelectorFromElement(t){const e=ye(t);return e&&we.findOne(e)?e:null},getElementFromSelector(t){const e=ye(t);return e?we.findOne(e):null},getMultipleElementsFromSelector(t){const e=ye(t);return e?we.find(e):[]}},Ee=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;fe.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Wt(this))return;const s=we.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Te=`close${Ae}`,Ce=`closed${Ae}`;class Oe extends ve{static get NAME(){return"alert"}close(){if(fe.trigger(this._element,Te).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),fe.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Oe.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}Ee(Oe,"close"),Qt(Oe);const xe='[data-bs-toggle="button"]';class ke extends ve{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=ke.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}fe.on(document,"click.bs.button.data-api",xe,(t=>{t.preventDefault();const e=t.target.closest(xe);ke.getOrCreateInstance(e).toggle()})),Qt(ke);const Le=".bs.swipe",Se=`touchstart${Le}`,De=`touchmove${Le}`,$e=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},Me={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class je extends be{constructor(t,e){super(),this._element=t,t&&je.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return Me}static get NAME(){return"swipe"}dispose(){fe.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(fe.on(this._element,Ie,(t=>this._start(t))),fe.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(fe.on(this._element,Se,(t=>this._start(t))),fe.on(this._element,De,(t=>this._move(t))),fe.on(this._element,$e,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Fe=".bs.carousel",He=".data-api",Be="ArrowLeft",We="ArrowRight",ze="next",Re="prev",qe="left",Ve="right",Ye=`slide${Fe}`,Ke=`slid${Fe}`,Qe=`keydown${Fe}`,Xe=`mouseenter${Fe}`,Ue=`mouseleave${Fe}`,Ge=`dragstart${Fe}`,Je=`load${Fe}${He}`,Ze=`click${Fe}${He}`,ti="carousel",ei="active",ii=".active",ni=".carousel-item",si=ii+ni,oi={[Be]:Ve,[We]:qe},ri={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ai={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class li extends ve{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=we.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===ti&&this.cycle()}static get Default(){return ri}static get DefaultType(){return ai}static get NAME(){return"carousel"}next(){this._slide(ze)}nextWhenVisible(){!document.hidden&&Bt(this._element)&&this.next()}prev(){this._slide(Re)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?fe.one(this._element,Ke,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void fe.one(this._element,Ke,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ze:Re;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&fe.on(this._element,Qe,(t=>this._keydown(t))),"hover"===this._config.pause&&(fe.on(this._element,Xe,(()=>this.pause())),fe.on(this._element,Ue,(()=>this._maybeEnableCycle()))),this._config.touch&&je.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of we.find(".carousel-item img",this._element))fe.on(t,Ge,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(qe)),rightCallback:()=>this._slide(this._directionToOrder(Ve)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new je(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=oi[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=we.findOne(ii,this._indicatorsElement);e.classList.remove(ei),e.removeAttribute("aria-current");const i=we.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(ei),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===ze,s=e||Gt(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>fe.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Ye).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(ei),i.classList.remove(ei,c,l),this._isSliding=!1,r(Ke)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return we.findOne(si,this._element)}_getItems(){return we.find(ni,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===qe?Re:ze:t===qe?ze:Re}_orderToDirection(t){return Kt()?t===Re?qe:Ve:t===Re?Ve:qe}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}fe.on(document,Ze,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=we.getElementFromSelector(this);if(!e||!e.classList.contains(ti))return;t.preventDefault();const i=li.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===_e.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),fe.on(window,Je,(()=>{const t=we.find('[data-bs-ride="carousel"]');for(const e of t)li.getOrCreateInstance(e)})),Qt(li);const ci=".bs.collapse",hi=`show${ci}`,di=`shown${ci}`,ui=`hide${ci}`,fi=`hidden${ci}`,pi=`click${ci}.data-api`,mi="show",gi="collapse",_i="collapsing",bi=`:scope .${gi} .${gi}`,vi='[data-bs-toggle="collapse"]',yi={parent:null,toggle:!0},wi={parent:"(null|element)",toggle:"boolean"};class Ei extends ve{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=we.find(vi);for(const t of i){const e=we.getSelectorFromElement(t),i=we.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return yi}static get DefaultType(){return wi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Ei.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(fe.trigger(this._element,hi).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(gi),this._element.classList.add(_i),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi,mi),this._element.style[e]="",fe.trigger(this._element,di)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(fe.trigger(this._element,ui).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(_i),this._element.classList.remove(gi,mi);for(const t of this._triggerArray){const e=we.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi),fe.trigger(this._element,fi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(mi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(vi);for(const e of t){const t=we.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=we.find(bi,this._config.parent);return we.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Ei.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}fe.on(document,pi,vi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of we.getMultipleElementsFromSelector(this))Ei.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(Ei);const Ai="dropdown",Ti=".bs.dropdown",Ci=".data-api",Oi="ArrowUp",xi="ArrowDown",ki=`hide${Ti}`,Li=`hidden${Ti}`,Si=`show${Ti}`,Di=`shown${Ti}`,$i=`click${Ti}${Ci}`,Ii=`keydown${Ti}${Ci}`,Ni=`keyup${Ti}${Ci}`,Pi="show",Mi='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ji=`${Mi}.${Pi}`,Fi=".dropdown-menu",Hi=Kt()?"top-end":"top-start",Bi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",zi=Kt()?"bottom-start":"bottom-end",Ri=Kt()?"left-start":"right-start",qi=Kt()?"right-start":"left-start",Vi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Yi={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Ki extends ve{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=we.next(this._element,Fi)[0]||we.prev(this._element,Fi)[0]||we.findOne(Fi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Vi}static get DefaultType(){return Yi}static get NAME(){return Ai}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Wt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!fe.trigger(this._element,Si,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Pi),this._element.classList.add(Pi),fe.trigger(this._element,Di,t)}}hide(){if(Wt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!fe.trigger(this._element,ki,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Pi),this._element.classList.remove(Pi),this._element.setAttribute("aria-expanded","false"),_e.removeDataAttribute(this._menu,"popper"),fe.trigger(this._element,Li,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Ft(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ai.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Ft(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Pi)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Ri;if(t.classList.contains("dropstart"))return qi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Bi:Hi:e?zi:Wi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(_e.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Xt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=we.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Bt(t)));i.length&&Gt(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ki.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=we.find(ji);for(const i of e){const e=Ki.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Mi)?this:we.prev(this,Mi)[0]||we.next(this,Mi)[0]||we.findOne(Mi,t.delegateTarget.parentNode),o=Ki.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}fe.on(document,Ii,Mi,Ki.dataApiKeydownHandler),fe.on(document,Ii,Fi,Ki.dataApiKeydownHandler),fe.on(document,$i,Ki.clearMenus),fe.on(document,Ni,Ki.clearMenus),fe.on(document,$i,Mi,(function(t){t.preventDefault(),Ki.getOrCreateInstance(this).toggle()})),Qt(Ki);const Qi="backdrop",Xi="show",Ui=`mousedown.bs.${Qi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends be{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Qi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Xi),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Xi),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(fe.off(this._element,Ui),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),fe.on(t,Ui,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Ut(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends be{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),fe.off(document,tn),fe.on(document,en,(t=>this._handleFocusin(t))),fe.on(document,nn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,fe.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=we.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,hn,(e=>e+t)),this._setElementAttributes(ln,hn,(e=>e+t)),this._setElementAttributes(cn,dn,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&_e.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=_e.getDataAttribute(t,e);null!==i?(_e.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Ft(t))e(t);else for(const i of we.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,En=`keydown.dismiss${fn}`,An=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends ve{constructor(t,e){super(t,e),this._dialog=we.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||fe.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(fe.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){fe.off(window,fn),fe.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=we.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(Cn),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,fe.trigger(this._element,bn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){fe.on(this._element,En,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),fe.on(window,vn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),fe.on(this._element,wn,(t=>{fe.one(this._element,yn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Tn),this._resetAdjustments(),this._scrollBar.reset(),fe.trigger(this._element,gn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(fe.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback((()=>{this._element.classList.remove(On),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}fe.on(document,An,'[data-bs-toggle="modal"]',(function(t){const e=we.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),fe.one(e,_n,(t=>{t.defaultPrevented||fe.one(e,gn,(()=>{Bt(this)&&this.focus()}))}));const i=we.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)})),Ee(Ln),Qt(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",Mn=".offcanvas.show",jn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Bn=`hidePrevented${Sn}`,Wn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Yn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Kn extends ve{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Yn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||fe.trigger(this._element,jn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),fe.trigger(this._element,Fn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(fe.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),fe.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():fe.trigger(this._element,Bn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){fe.on(this._element,qn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():fe.trigger(this._element,Bn))}))}static jQueryInterface(t){return this.each((function(){const e=Kn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}fe.on(document,Rn,'[data-bs-toggle="offcanvas"]',(function(t){const e=we.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this))return;fe.one(e,Wn,(()=>{Bt(this)&&this.focus()}));const i=we.findOne(Mn);i&&i!==e&&Kn.getInstance(i).hide(),Kn.getOrCreateInstance(e).toggle(this)})),fe.on(window,$n,(()=>{for(const t of we.find(Mn))Kn.getOrCreateInstance(t).show()})),fe.on(window,zn,(()=>{for(const t of we.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Kn.getOrCreateInstance(t).hide()})),Ee(Kn),Qt(Kn);const Qn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Xn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Jn={allowList:Qn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends be{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},ts)}_setContent(t,e,i){const n=we.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Ft(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Xt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},ds={allowList:Qn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},us={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class fs extends ve{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return ds}static get DefaultType(){return us}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),fe.off(this._element.closest(rs),as,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=fe.trigger(this._element,this.constructor.eventName("show")),e=(zt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),fe.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._queueCallback((()=>{fe.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!fe.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._activeTrigger.click=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),fe.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ns,ss),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=Xt(this._config.placement,[this,t,this._element]),i=hs[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Xt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Xt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)fe.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");fe.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()})),fe.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},fe.on(this._element.closest(rs),as,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=_e.getDataAttributes(this._element);for(const t of Object.keys(e))is.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(fs);const ps=".popover-header",ms=".popover-body",gs={...fs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},_s={...fs.DefaultType,content:"(null|string|element|function)"};class bs extends fs{static get Default(){return gs}static get DefaultType(){return _s}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ps]:this._getTitle(),[ms]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=bs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(bs);const vs=".bs.scrollspy",ys=`activate${vs}`,ws=`click${vs}`,Es=`load${vs}.data-api`,As="active",Ts="[href]",Cs=".nav-link",Os=`${Cs}, .nav-item > ${Cs}, .list-group-item`,xs={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},ks={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ls extends ve{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return xs}static get DefaultType(){return ks}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(fe.off(this._config.target,ws),fe.on(this._config.target,ws,Ts,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=we.find(Ts,this._config.target);for(const e of t){if(!e.hash||Wt(e))continue;const t=we.findOne(decodeURI(e.hash),this._element);Bt(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(As),this._activateParents(t),fe.trigger(this._element,ys,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))we.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(As);else for(const e of we.parents(t,".nav, .list-group"))for(const t of we.prev(e,Os))t.classList.add(As)}_clearActiveClass(t){t.classList.remove(As);const e=we.find(`${Ts}.${As}`,t);for(const t of e)t.classList.remove(As)}static jQueryInterface(t){return this.each((function(){const e=Ls.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(window,Es,(()=>{for(const t of we.find('[data-bs-spy="scroll"]'))Ls.getOrCreateInstance(t)})),Qt(Ls);const Ss=".bs.tab",Ds=`hide${Ss}`,$s=`hidden${Ss}`,Is=`show${Ss}`,Ns=`shown${Ss}`,Ps=`click${Ss}`,Ms=`keydown${Ss}`,js=`load${Ss}`,Fs="ArrowLeft",Hs="ArrowRight",Bs="ArrowUp",Ws="ArrowDown",zs="Home",Rs="End",qs="active",Vs="fade",Ys="show",Ks=".dropdown-toggle",Qs=`:not(${Ks})`,Xs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Us=`.nav-link${Qs}, .list-group-item${Qs}, [role="tab"]${Qs}, ${Xs}`,Gs=`.${qs}[data-bs-toggle="tab"], .${qs}[data-bs-toggle="pill"], .${qs}[data-bs-toggle="list"]`;class Js extends ve{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),fe.on(this._element,Ms,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?fe.trigger(e,Ds,{relatedTarget:t}):null;fe.trigger(t,Is,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(qs),this._activate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),fe.trigger(t,Ns,{relatedTarget:e})):t.classList.add(Ys)}),t,t.classList.contains(Vs)))}_deactivate(t,e){t&&(t.classList.remove(qs),t.blur(),this._deactivate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),fe.trigger(t,$s,{relatedTarget:e})):t.classList.remove(Ys)}),t,t.classList.contains(Vs)))}_keydown(t){if(![Fs,Hs,Bs,Ws,zs,Rs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Wt(t)));let i;if([zs,Rs].includes(t.key))i=e[t.key===zs?0:e.length-1];else{const n=[Hs,Ws].includes(t.key);i=Gt(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Js.getOrCreateInstance(i).show())}_getChildren(){return we.find(Us,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=we.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=we.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ks,qs),n(".dropdown-menu",Ys),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(qs)}_getInnerElement(t){return t.matches(Us)?t:we.findOne(Us,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Js.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(document,Ps,Xs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this)||Js.getOrCreateInstance(this).show()})),fe.on(window,js,(()=>{for(const t of we.find(Gs))Js.getOrCreateInstance(t)})),Qt(Js);const Zs=".bs.toast",to=`mouseover${Zs}`,eo=`mouseout${Zs}`,io=`focusin${Zs}`,no=`focusout${Zs}`,so=`hide${Zs}`,oo=`hidden${Zs}`,ro=`show${Zs}`,ao=`shown${Zs}`,lo="hide",co="show",ho="showing",uo={animation:"boolean",autohide:"boolean",delay:"number"},fo={animation:!0,autohide:!0,delay:5e3};class po extends ve{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return fo}static get DefaultType(){return uo}static get NAME(){return"toast"}show(){fe.trigger(this._element,ro).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(lo),qt(this._element),this._element.classList.add(co,ho),this._queueCallback((()=>{this._element.classList.remove(ho),fe.trigger(this._element,ao),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(fe.trigger(this._element,so).defaultPrevented||(this._element.classList.add(ho),this._queueCallback((()=>{this._element.classList.add(lo),this._element.classList.remove(ho,co),fe.trigger(this._element,oo)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(co),super.dispose()}isShown(){return this._element.classList.contains(co)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){fe.on(this._element,to,(t=>this._onInteraction(t,!0))),fe.on(this._element,eo,(t=>this._onInteraction(t,!1))),fe.on(this._element,io,(t=>this._onInteraction(t,!0))),fe.on(this._element,no,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=po.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function mo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}Ee(po),Qt(po),mo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new fs(t,{delay:{show:500,hide:100}})}))})),mo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),mo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))})),window.bootstrap=i})(); -//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/docs/_static/scripts/bootstrap.js.LICENSE.txt b/docs/_static/scripts/bootstrap.js.LICENSE.txt deleted file mode 100644 index 28755c2c..00000000 --- a/docs/_static/scripts/bootstrap.js.LICENSE.txt +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ diff --git a/docs/_static/scripts/bootstrap.js.map b/docs/_static/scripts/bootstrap.js.map deleted file mode 100644 index e9e81589..00000000 --- a/docs/_static/scripts/bootstrap.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' + '
' + '
' + '
',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' + '
' + '

' + '
' + '
',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
diff --git a/docs/documentation/core.html b/docs/documentation/core.html index ce4a5e43..0f91a0c3 100644 --- a/docs/documentation/core.html +++ b/docs/documentation/core.html @@ -314,17 +314,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/abstractions.html b/docs/documentation/core/abstractions.html index 96db5b21..2ba42251 100644 --- a/docs/documentation/core/abstractions.html +++ b/docs/documentation/core/abstractions.html @@ -314,17 +314,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/abstractions/base_drone.html b/docs/documentation/core/abstractions/base_drone.html index d3241a6c..5b4ffaac 100644 --- a/docs/documentation/core/abstractions/base_drone.html +++ b/docs/documentation/core/abstractions/base_drone.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/abstractions/boosters.html b/docs/documentation/core/abstractions/boosters.html index 7a253886..3cbddbd7 100644 --- a/docs/documentation/core/abstractions/boosters.html +++ b/docs/documentation/core/abstractions/boosters.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/abstractions/boring_bodies.html b/docs/documentation/core/abstractions/boring_bodies.html index 44c83413..0156fd45 100644 --- a/docs/documentation/core/abstractions/boring_bodies.html +++ b/docs/documentation/core/abstractions/boring_bodies.html @@ -314,17 +314,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/abstractions/camera.html b/docs/documentation/core/abstractions/camera.html index d2934f3b..3a081d0a 100644 --- a/docs/documentation/core/abstractions/camera.html +++ b/docs/documentation/core/abstractions/camera.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/abstractions/gimbals.html b/docs/documentation/core/abstractions/gimbals.html index 3ab3c243..5290c7ef 100644 --- a/docs/documentation/core/abstractions/gimbals.html +++ b/docs/documentation/core/abstractions/gimbals.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/abstractions/lifting_surfaces.html b/docs/documentation/core/abstractions/lifting_surfaces.html index 84233d19..85bfe90d 100644 --- a/docs/documentation/core/abstractions/lifting_surfaces.html +++ b/docs/documentation/core/abstractions/lifting_surfaces.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/abstractions/motors.html b/docs/documentation/core/abstractions/motors.html index 5892d46a..9aa7654a 100644 --- a/docs/documentation/core/abstractions/motors.html +++ b/docs/documentation/core/abstractions/motors.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/aviary.html b/docs/documentation/core/aviary.html index b4483efe..54fb8739 100644 --- a/docs/documentation/core/aviary.html +++ b/docs/documentation/core/aviary.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/drones.html b/docs/documentation/core/drones.html index 8cedbad5..6b36581b 100644 --- a/docs/documentation/core/drones.html +++ b/docs/documentation/core/drones.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/drones/fixedwing.html b/docs/documentation/core/drones/fixedwing.html index 1ed7f78f..a721aa6e 100644 --- a/docs/documentation/core/drones/fixedwing.html +++ b/docs/documentation/core/drones/fixedwing.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/drones/quadx.html b/docs/documentation/core/drones/quadx.html index 94eab92c..394b4400 100644 --- a/docs/documentation/core/drones/quadx.html +++ b/docs/documentation/core/drones/quadx.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/drones/rocket.html b/docs/documentation/core/drones/rocket.html index d95477c4..0377467d 100644 --- a/docs/documentation/core/drones/rocket.html +++ b/docs/documentation/core/drones/rocket.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/core/wind.html b/docs/documentation/core/wind.html index a6b5c1a7..b28dbebf 100644 --- a/docs/documentation/core/wind.html +++ b/docs/documentation/core/wind.html @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/gym_envs.html b/docs/documentation/gym_envs.html index f9eda9d7..69825c22 100644 --- a/docs/documentation/gym_envs.html +++ b/docs/documentation/gym_envs.html @@ -41,7 +41,7 @@ - + @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/gym_envs/fixedwing_waypoints_env.html b/docs/documentation/gym_envs/fixedwing_waypoints_env.html index 19152acb..157c81dc 100644 --- a/docs/documentation/gym_envs/fixedwing_waypoints_env.html +++ b/docs/documentation/gym_envs/fixedwing_waypoints_env.html @@ -8,7 +8,7 @@ - PyFlyt/Fixedwing-Waypoints-v2 — PyFlyt + PyFlyt/Fixedwing-Waypoints-v3 — PyFlyt @@ -41,8 +41,8 @@ - - + + @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • @@ -386,8 +386,8 @@
    -
    -

    PyFlyt/Fixedwing-Waypoints-v2#

    +
    +

    PyFlyt/Fixedwing-Waypoints-v3#

    https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/fixedwing_waypoint.gif @@ -401,7 +401,7 @@

    Usage#<
    import gymnasium
     import PyFlyt.gym_envs
     
    -env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v2", render_mode="human")
    +env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v3", render_mode="human")
     
     term, trunc = False, False
     obs, _ = env.reset()
    @@ -420,7 +420,7 @@ 

    Flattening the Environmentimport PyFlyt.gym_envs from PyFlyt.gym_envs import FlattenWaypointEnv -env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v3", render_mode="human") env = FlattenWaypointEnv(env, context_length=2) term, trunc = False, False diff --git a/docs/documentation/gym_envs/quadx_hover_env.html b/docs/documentation/gym_envs/quadx_hover_env.html index ed63868f..2bc51d27 100644 --- a/docs/documentation/gym_envs/quadx_hover_env.html +++ b/docs/documentation/gym_envs/quadx_hover_env.html @@ -8,7 +8,7 @@ - PyFlyt/QuadX-Hover-v2 — PyFlyt + PyFlyt/QuadX-Hover-v3 — PyFlyt @@ -41,7 +41,7 @@ - + @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • @@ -386,8 +386,8 @@
    -
    -

    PyFlyt/QuadX-Hover-v2#

    +
    +

    PyFlyt/QuadX-Hover-v3#

    https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_hover.gif diff --git a/docs/documentation/gym_envs/quadx_pole_balance_env.html b/docs/documentation/gym_envs/quadx_pole_balance_env.html index 1c0ded01..bc406457 100644 --- a/docs/documentation/gym_envs/quadx_pole_balance_env.html +++ b/docs/documentation/gym_envs/quadx_pole_balance_env.html @@ -8,7 +8,7 @@ - PyFlyt/QuadX-Pole-Balance-v2 — PyFlyt + PyFlyt/QuadX-Pole-Balance-v3 — PyFlyt @@ -41,8 +41,8 @@ - - + + @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • @@ -386,8 +386,8 @@
    -
    -

    PyFlyt/QuadX-Pole-Balance-v2#

    +
    +

    PyFlyt/QuadX-Pole-Balance-v3#

    https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_pole_balance.gif @@ -401,7 +401,7 @@

    Usage#<
    import gymnasium
     import PyFlyt.gym_envs
     
    -env = gymnasium.make("PyFlyt/QuadX-Pole-Balance-v2", render_mode="human")
    +env = gymnasium.make("PyFlyt/QuadX-Pole-Balance-v3", render_mode="human")
     
     term, trunc = False, False
     obs, _ = env.reset()
    diff --git a/docs/documentation/gym_envs/quadx_pole_waypoints_env.html b/docs/documentation/gym_envs/quadx_pole_waypoints_env.html
    index 602d0b0b..d7d6896c 100644
    --- a/docs/documentation/gym_envs/quadx_pole_waypoints_env.html
    +++ b/docs/documentation/gym_envs/quadx_pole_waypoints_env.html
    @@ -8,7 +8,7 @@
         
         
     
    -    PyFlyt/QuadX-Pole-Waypoints-v2 — PyFlyt
    +    PyFlyt/QuadX-Pole-Waypoints-v3 — PyFlyt
       
       
       
    @@ -41,8 +41,8 @@
         
         
         
    -    
    -    
    +    
    +    
       
       
       
    @@ -313,17 +313,17 @@
     
     
     
  • Gymnasium Environments
  • PettingZoo Environments
  • @@ -386,8 +386,8 @@
    -
    -

    PyFlyt/QuadX-Pole-Waypoints-v2#

    +
    +

    PyFlyt/QuadX-Pole-Waypoints-v3#

    https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_pole_waypoint.gif @@ -401,7 +401,7 @@

    Usage#<
    import gymnasium
     import PyFlyt.gym_envs
     
    -env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v2", render_mode="human")
    +env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v3", render_mode="human")
     
     term, trunc = False, False
     obs, _ = env.reset()
    @@ -420,7 +420,7 @@ 

    Flattening the Environmentimport PyFlyt.gym_envs from PyFlyt.gym_envs import FlattenWaypointEnv -env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v3", render_mode="human") env = FlattenWaypointEnv(env, context_length=2) term, trunc = False, False diff --git a/docs/documentation/gym_envs/quadx_waypoints_env.html b/docs/documentation/gym_envs/quadx_waypoints_env.html index ab005923..903d5c16 100644 --- a/docs/documentation/gym_envs/quadx_waypoints_env.html +++ b/docs/documentation/gym_envs/quadx_waypoints_env.html @@ -8,7 +8,7 @@ - PyFlyt/QuadX-Waypoints-v2 — PyFlyt + PyFlyt/QuadX-Waypoints-v3 — PyFlyt @@ -41,8 +41,8 @@ - - + + @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • @@ -386,8 +386,8 @@
    -
    -

    PyFlyt/QuadX-Waypoints-v2#

    +
    +

    PyFlyt/QuadX-Waypoints-v3#

    https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_waypoint.gif @@ -401,7 +401,7 @@

    Usage#<
    import gymnasium
     import PyFlyt.gym_envs
     
    -env = gymnasium.make("PyFlyt/QuadX-Waypoints-v2", render_mode="human")
    +env = gymnasium.make("PyFlyt/QuadX-Waypoints-v3", render_mode="human")
     
     term, trunc = False, False
     obs, _ = env.reset()
    @@ -420,7 +420,7 @@ 

    Flattening the Environmentimport PyFlyt.gym_envs from PyFlyt.gym_envs import FlattenWaypointEnv -env = gymnasium.make("PyFlyt/QuadX-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/QuadX-Waypoints-v3", render_mode="human") env = FlattenWaypointEnv(env, context_length=2) term, trunc = False, False diff --git a/docs/documentation/gym_envs/rocket_landing_env.html b/docs/documentation/gym_envs/rocket_landing_env.html index db7df86f..e8b2220c 100644 --- a/docs/documentation/gym_envs/rocket_landing_env.html +++ b/docs/documentation/gym_envs/rocket_landing_env.html @@ -8,7 +8,7 @@ - PyFlyt/Rocket-Landing-v2 — PyFlyt + PyFlyt/Rocket-Landing-v3 — PyFlyt @@ -42,7 +42,7 @@ - + @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • @@ -386,8 +386,8 @@
    -
    -

    PyFlyt/Rocket-Landing-v2#

    +
    +

    PyFlyt/Rocket-Landing-v3#

    https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/rocket_landing.gif @@ -401,7 +401,7 @@

    Usage#<
    import gymnasium
     import PyFlyt.gym_envs
     
    -env = gymnasium.make("PyFlyt/Rocket-Landing-v2", render_mode="human")
    +env = gymnasium.make("PyFlyt/Rocket-Landing-v3", render_mode="human")
     
     term, trunc = False, False
     obs, _ = env.reset()
    diff --git a/docs/documentation/pz_envs.html b/docs/documentation/pz_envs.html
    index 304f188b..e2a6fbc4 100644
    --- a/docs/documentation/pz_envs.html
    +++ b/docs/documentation/pz_envs.html
    @@ -41,8 +41,8 @@
         
         
         
    -    
    -    
    +    
    +    
       
       
       
    @@ -313,17 +313,17 @@
     
     
     
  • Gymnasium Environments
  • PettingZoo Environments
  • diff --git a/docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html b/docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html index d9f3438b..42cf8df0 100644 --- a/docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html +++ b/docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html @@ -8,7 +8,7 @@ - MAFixedwingDogfightEnv — PyFlyt + MAFixedwingDogfightEnvV2 — PyFlyt @@ -42,7 +42,7 @@ - + @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • @@ -386,8 +386,8 @@
    -
    -

    MAFixedwingDogfightEnv#

    +
    +

    MAFixedwingDogfightEnvV2#

    https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/fixedwing_dogfight.gif @@ -398,9 +398,9 @@

    Task Description

    Usage#

    -
    from PyFlyt.pz_envs import MAFixedwingDogfightEnv
    +
    from PyFlyt.pz_envs import MAFixedwingDogfightEnvV2
     
    -env = MAFixedwingDogfightEnv(render_mode="human")
    +env = MAFixedwingDogfightEnvV2(render_mode="human")
     observations, infos = env.reset()
     
     while env.agents:
    @@ -428,7 +428,7 @@ 

    Environment Rules#

    -class PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env.MAFixedwingDogfightEnv(team_size: int = 2, spawn_radius: float = 10.0, spawn_height: float = 20.0, damage_per_hit: float = 0.02, lethal_distance: float = 15.0, lethal_angle_radians: float = 0.1, assisted_flight: bool = True, sparse_reward: bool = False, flatten_observation: bool = True, flight_dome_size: float = 500.0, max_duration_seconds: float = 60.0, agent_hz: int = 30, render_mode: None | str = None)#
    +class PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env.MAFixedwingDogfightEnv(team_size: int = 2, spawn_radius: float = 10.0, spawn_height: float = 20.0, damage_per_hit: float = 0.01, lethal_distance: float = 20.0, lethal_angle_radians: float = 0.07, assisted_flight: bool = True, aggressiveness: float = 0.8, cooperativeness: float = 0.5, sparse_reward: bool = False, flatten_observation: bool = True, flight_dome_size: float = 500.0, max_duration_seconds: float = 60.0, agent_hz: int = 30, render_mode: None | str = None)#

    Team Dogfighting Environment for the Acrowing model using the PettingZoo API.

    Parameters:
    @@ -438,6 +438,8 @@

    Environment Options - MAQuadXHoverEnv — PyFlyt + MAQuadXHoverEnvV2 — PyFlyt @@ -41,7 +41,7 @@ - + @@ -313,17 +313,17 @@
  • Gymnasium Environments
  • PettingZoo Environments
  • @@ -386,8 +386,8 @@
    -
    -

    MAQuadXHoverEnv#

    +
    +

    MAQuadXHoverEnvV2#

    https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_hover.gif @@ -398,9 +398,9 @@

    Task Description

    Usage#

    -
    from PyFlyt.pz_envs import MAQuadXHoverEnv
    +
    from PyFlyt.pz_envs import MAQuadXHoverEnvV2
     
    -env = MAQuadXHoverEnv(render_mode="human")
    +env = MAQuadXHoverEnvV2(render_mode="human")
     observations, infos = env.reset()
     
     while env.agents:
    @@ -416,7 +416,7 @@ 

    Usage#<

    Environment Options#

    -class PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env.MAQuadXHoverEnv(start_pos: ndarray = array([[-1., -1., 1.], [1., -1., 1.], [-1., 1., 1.], [1., 1., 1.]]), start_orn: ndarray = array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]), sparse_reward: bool = False, flight_mode: int = 0, flight_dome_size: float = 10.0, max_duration_seconds: float = 30.0, angle_representation: str = 'quaternion', agent_hz: int = 40, render_mode: None | str = None)#
    +class PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env.MAQuadXHoverEnv(start_pos: ndarray = array([[-1., -1., 1.], [1., -1., 1.], [-1., 1., 1.], [1., 1., 1.]]), start_orn: ndarray = array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]), sparse_reward: bool = False, flight_mode: int = 0, flight_dome_size: float = 10.0, max_duration_seconds: float = 30.0, angle_representation: Literal['euler', 'quaternion'] = 'quaternion', agent_hz: int = 40, render_mode: None | str = None)#

    Simple Multiagent Hover Environment.

    Actions are vp, vq, vr, T, ie: angular rates and thrust. The target is for each agent to not crash for the longest time possible.

    @@ -429,7 +429,7 @@

    Environment OptionsPyFlyt/Fixedwing-Waypoints-v2", "PyFlyt/QuadX-Hover-v2", "PyFlyt/QuadX-Pole-Balance-v2", "PyFlyt/QuadX-Pole-Waypoints-v2", "PyFlyt/QuadX-Waypoints-v2", "PyFlyt/Rocket-Landing-v2", "PettingZoo Environments", "MAFixedwingDogfightEnv", "MAQuadXHoverEnv", "PyFlyt - UAV Simulation Environments for Reinforcement Learning Research", "Paper Publication", "Tutorials"], "titleterms": {"abstract": 2, "access": 10, "api": [1, 10], "architectur": 1, "attribut": [3, 10, 15], "aviari": 10, "axi": 1, "balanc": 19, "base": 3, "bodi": 5, "booster": 4, "bore": 5, "camera": [6, 10], "citat": 27, "class": [3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14], "complex": 15, "control": [10, 12, 13, 14], "convent": 1, "core": [1, 10], "custom": [10, 15], "default": [3, 15], "descript": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 24, 25, 26], "do": 0, "document": 0, "drone": [3, 10, 11], "environ": [0, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "exampl": 10, "fixedw": [12, 17], "flatten": [17, 20, 21], "fp": [6, 10], "gener": 1, "gimbal": 7, "gymnasium": [0, 16], "hover": 18, "i": 0, "individu": 10, "instal": 0, "land": 22, "learn": 26, "lift": 8, "linux": 0, "looprat": 10, "maco": 0, "mafixedwingdogfightenv": 24, "maquadxhoverenv": 25, "mathemat": 8, "method": [3, 10, 15], "mode": [12, 13, 14], "model": [8, 12, 13, 14, 15], "more": [0, 15], "motor": 9, "multi": 10, "option": [3, 10, 17, 18, 19, 20, 21, 22, 24, 25], "overview": [11, 15], "paper": 27, "pettingzoo": [0, 23], "physic": 10, "pole": [19, 20], "preimplement": 15, "preprint": 27, "public": 27, "pyflyt": [17, 18, 19, 20, 21, 22, 26], "quadx": [13, 18, 19, 20, 21], "reinforc": 26, "requir": [3, 15], "research": 26, "rocket": [14, 22], "rule": 24, "set": 10, "setup": 10, "simpl": 15, "simul": 26, "singl": 10, "spawn": 10, "step": 10, "surfac": 8, "task": [17, 18, 19, 20, 21, 22, 24, 25], "tutori": 28, "type": 10, "uav": 26, "usag": [2, 10, 17, 18, 19, 20, 21, 22, 24, 25], "v2": [17, 18, 19, 20, 21, 22], "variant": 13, "want": 0, "waypoint": [17, 20, 21], "wind": 15, "window": 0}}) \ No newline at end of file +Search.setIndex({"alltitles": {"Abstractions": [[2, null]], "Accessing Individual Drones": [[10, "accessing-individual-drones"]], "Attributes": [[10, "attributes"]], "Aviary": [[10, null]], "Axis Conventions": [[1, "axis-conventions"]], "Base Drone Class": [[3, null]], "Boosters": [[4, null]], "Boring Bodies": [[5, null]], "Camera": [[6, null]], "Camera FPS": [[6, "camera-fps"], [10, "camera-fps"]], "Citation": [[27, "citation"]], "Class Description": [[3, "class-description"], [4, "class-description"], [5, "class-description"], [6, "class-description"], [7, "class-description"], [8, "class-description"], [9, "class-description"], [10, "class-description"], [12, "class-description"], [13, "class-description"], [14, "class-description"]], "Control Mode": [[12, "control-mode"], [14, "control-mode"]], "Control Modes": [[13, "control-modes"]], "Controlling Drone Types": [[10, "controlling-drone-types"]], "Core": [[1, null]], "Core API": [[1, "core-api"]], "Core API Example": [[10, "core-api-example"]], "Default Attributes": [[3, "default-attributes"], [15, "default-attributes"]], "Default Methods": [[3, "default-methods"]], "Description": [[2, "description"], [4, "description"], [5, "description"], [6, "description"], [7, "description"], [8, "description"], [9, "description"], [10, "description"], [26, "description"]], "Documentation": [[0, null]], "Drones": [[11, null]], "Environment Options": [[17, "environment-options"], [18, "environment-options"], [19, "environment-options"], [20, "environment-options"], [21, "environment-options"], [22, "environment-options"], [24, "environment-options"], [25, "environment-options"]], "Environment Rules": [[24, "environment-rules"]], "Fixedwing": [[12, null]], "Flattening the Environment": [[17, "flattening-the-environment"], [20, "flattening-the-environment"], [21, "flattening-the-environment"]], "General Architecture": [[1, "general-architecture"]], "Gimbals": [[7, null]], "Gymnasium Environments": [[0, "gymnasium-environments"], [16, null]], "I want to do more!": [[0, "i-want-to-do-more"]], "Installation": [[0, "installation"]], "Lifting Surfaces": [[8, null]], "Linux and MacOS": [[0, "linux-and-macos"]], "Looprates": [[10, "looprates"]], "MAFixedwingDogfightEnvV2": [[24, null]], "MAQuadXHoverEnvV2": [[25, null]], "Mathematical Model": [[8, "mathematical-model"]], "Methods": [[10, "methods"]], "Model Description": [[12, "model-description"], [13, "model-description"], [14, "model-description"]], "More Complex Custom Wind Modelling": [[15, "more-complex-custom-wind-modelling"]], "Motors": [[9, null]], "Multi Drone Physics Stepping": [[10, "multi-drone-physics-stepping"]], "Multi Drone Setup": [[10, "multi-drone-setup"]], "Optional Attributes": [[3, "optional-attributes"]], "Optional Methods": [[3, "optional-methods"]], "Overview": [[11, "overview"], [15, "overview"]], "Paper Publication": [[27, null]], "PettingZoo Environments": [[0, "pettingzoo-environments"], [23, null]], "Preimplemented Wind Models": [[15, "preimplemented-wind-models"]], "Preprint": [[27, "preprint"]], "PyFlyt - UAV Simulation Environments for Reinforcement Learning Research": [[26, null]], "PyFlyt/Fixedwing-Waypoints-v3": [[17, null]], "PyFlyt/QuadX-Hover-v3": [[18, null]], "PyFlyt/QuadX-Pole-Balance-v3": [[19, null]], "PyFlyt/QuadX-Pole-Waypoints-v3": [[20, null]], "PyFlyt/QuadX-Waypoints-v3": [[21, null]], "PyFlyt/Rocket-Landing-v3": [[22, null]], "QuadX": [[13, null]], "Required Attributes": [[3, "required-attributes"]], "Required Methods": [[3, "required-methods"], [15, "required-methods"]], "Rocket": [[14, null]], "Setting Drone Options": [[10, "setting-drone-options"]], "Simple Custom Wind Modelling": [[15, "simple-custom-wind-modelling"]], "Single Drone Physics Stepping": [[10, "single-drone-physics-stepping"]], "Spawning Custom Drones": [[10, "spawning-custom-drones"]], "Task Description": [[17, "task-description"], [18, "task-description"], [19, "task-description"], [20, "task-description"], [21, "task-description"], [22, "task-description"], [24, "task-description"], [25, "task-description"]], "Tutorials": [[28, null]], "Usage": [[2, "usage"], [10, "usage"], [17, "usage"], [18, "usage"], [19, "usage"], [20, "usage"], [21, "usage"], [22, "usage"], [24, "usage"], [25, "usage"]], "Variants": [[13, "variants"]], "Wind": [[15, null]], "Windows": [[0, "windows"]]}, "docnames": ["documentation", "documentation/core", "documentation/core/abstractions", "documentation/core/abstractions/base_drone", "documentation/core/abstractions/boosters", "documentation/core/abstractions/boring_bodies", "documentation/core/abstractions/camera", "documentation/core/abstractions/gimbals", "documentation/core/abstractions/lifting_surfaces", "documentation/core/abstractions/motors", "documentation/core/aviary", "documentation/core/drones", "documentation/core/drones/fixedwing", "documentation/core/drones/quadx", "documentation/core/drones/rocket", "documentation/core/wind", "documentation/gym_envs", "documentation/gym_envs/fixedwing_waypoints_env", "documentation/gym_envs/quadx_hover_env", "documentation/gym_envs/quadx_pole_balance_env", "documentation/gym_envs/quadx_pole_waypoints_env", "documentation/gym_envs/quadx_waypoints_env", "documentation/gym_envs/rocket_landing_env", "documentation/pz_envs", "documentation/pz_envs/ma_fixedwing_dogfight_env", "documentation/pz_envs/ma_quadx_hover_env", "index", "paper", "tutorials"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["documentation.md", "documentation/core.md", "documentation/core/abstractions.md", "documentation/core/abstractions/base_drone.md", "documentation/core/abstractions/boosters.md", "documentation/core/abstractions/boring_bodies.md", "documentation/core/abstractions/camera.md", "documentation/core/abstractions/gimbals.md", "documentation/core/abstractions/lifting_surfaces.md", "documentation/core/abstractions/motors.md", "documentation/core/aviary.md", "documentation/core/drones.md", "documentation/core/drones/fixedwing.md", "documentation/core/drones/quadx.md", "documentation/core/drones/rocket.md", "documentation/core/wind.md", "documentation/gym_envs.md", "documentation/gym_envs/fixedwing_waypoints_env.md", "documentation/gym_envs/quadx_hover_env.md", "documentation/gym_envs/quadx_pole_balance_env.md", "documentation/gym_envs/quadx_pole_waypoints_env.md", "documentation/gym_envs/quadx_waypoints_env.md", "documentation/gym_envs/rocket_landing_env.md", "documentation/pz_envs.md", "documentation/pz_envs/ma_fixedwing_dogfight_env.md", "documentation/pz_envs/ma_quadx_hover_env.md", "index.md", "paper.md", "tutorials.md"], "indexentries": {"__call__() (in module pyflyt.core.abstractions.droneclass)": [[15, "PyFlyt.core.abstractions.DroneClass.__call__", false]], "__init__() (in module pyflyt.core.abstractions.windfieldclass)": [[15, "PyFlyt.core.abstractions.WindFieldClass.__init__", false]], "all_aux_states (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.all_aux_states", false]], "all_states (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.all_states", false]], "aux_state (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.aux_state", false]], "aux_state() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.aux_state", false]], "aviary (class in pyflyt.core)": [[10, "PyFlyt.core.Aviary", false]], "aviary_steps (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.aviary_steps", false]], "boosters (class in pyflyt.core.abstractions)": [[4, "PyFlyt.core.abstractions.Boosters", false]], "boringbodies (class in pyflyt.core.abstractions)": [[5, "PyFlyt.core.abstractions.BoringBodies", false]], "camera (class in pyflyt.core.abstractions)": [[6, "PyFlyt.core.abstractions.Camera", false]], "capture_image() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.capture_image", false]], "compute_rotation() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.compute_rotation", false]], "contact_array (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.contact_array", false]], "control_period (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.control_period", false]], "depthimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.depthImg", false]], "disable_artificial_damping() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.disable_artificial_damping", false]], "drone_path (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.drone_path", false]], "droneclass (class in pyflyt.core.abstractions)": [[3, "PyFlyt.core.abstractions.DroneClass", false]], "drones (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.drones", false]], "elapsed_ime (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.elapsed_ime", false]], "fixedwing (class in pyflyt.core.drones)": [[12, "PyFlyt.core.drones.Fixedwing", false]], "fixedwingwaypointsenv (class in pyflyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env)": [[17, "PyFlyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env.FixedwingWaypointsEnv", false]], "get_joint_info() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.get_joint_info", false]], "get_states() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.get_states", false]], "get_states() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.get_states", false]], "get_states() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.get_states", false]], "get_states() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.get_states", false]], "get_states() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.get_states", false]], "get_states() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.get_states", false]], "get_states() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.get_states", false]], "gimbals (class in pyflyt.core.abstractions)": [[7, "PyFlyt.core.abstractions.Gimbals", false]], "id (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.Id", false]], "instanced_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.instanced_controllers", false]], "liftingsurface (class in pyflyt.core.abstractions)": [[8, "PyFlyt.core.abstractions.LiftingSurface", false]], "liftingsurfaces (class in pyflyt.core.abstractions)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces", false]], "mafixedwingdogfightenv (class in pyflyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env)": [[24, "PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env.MAFixedwingDogfightEnv", false]], "maquadxhoverenv (class in pyflyt.pz_envs.quadx_envs.ma_quadx_hover_env)": [[25, "PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env.MAQuadXHoverEnv", false]], "motors (class in pyflyt.core.abstractions.motors)": [[9, "PyFlyt.core.abstractions.motors.Motors", false]], "np_random (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.np_random", false]], "np_random (pyflyt.core.abstractions.windfieldclass property)": [[15, "PyFlyt.core.abstractions.WindFieldClass.np_random", false]], "param_path (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.param_path", false]], "physics_period (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.physics_period", false]], "physics_steps (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.physics_steps", false]], "physics_update() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.physics_update", false]], "physics_update() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.physics_update", false]], "physics_update() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.physics_update", false]], "physics_update() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.physics_update", false]], "physics_update() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.physics_update", false]], "physics_update() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.physics_update", false]], "physics_update() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.physics_update", false]], "print_all_bodies() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.print_all_bodies", false]], "quadx (class in pyflyt.core.drones)": [[13, "PyFlyt.core.drones.QuadX", false]], "quadxhoverenv (class in pyflyt.gym_envs.quadx_envs.quadx_hover_env)": [[18, "PyFlyt.gym_envs.quadx_envs.quadx_hover_env.QuadXHoverEnv", false]], "quadxpolebalanceenv (class in pyflyt.gym_envs.quadx_envs.quadx_pole_balance_env)": [[19, "PyFlyt.gym_envs.quadx_envs.quadx_pole_balance_env.QuadXPoleBalanceEnv", false]], "quadxpolewaypointsenv (class in pyflyt.gym_envs.quadx_envs.quadx_pole_waypoints_env)": [[20, "PyFlyt.gym_envs.quadx_envs.quadx_pole_waypoints_env.QuadXPoleWaypointsEnv", false]], "quadxwaypointsenv (class in pyflyt.gym_envs.quadx_envs.quadx_waypoints_env)": [[21, "PyFlyt.gym_envs.quadx_envs.quadx_waypoints_env.QuadXWaypointsEnv", false]], "register_all_new_bodies() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.register_all_new_bodies", false]], "register_controller() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.register_controller", false]], "register_controller() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.register_controller", false]], "registered_base_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.registered_base_controllers", false]], "registered_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.registered_controllers", false]], "reset() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.reset", false]], "reset() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.reset", false]], "reset() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.reset", false]], "reset() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.reset", false]], "reset() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.reset", false]], "reset() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.reset", false]], "reset() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.reset", false]], "reset() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.reset", false]], "reset() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.reset", false]], "reset() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.reset", false]], "reset() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.reset", false]], "rgbaimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.rgbaImg", false]], "rocket (class in pyflyt.core.drones)": [[14, "PyFlyt.core.drones.Rocket", false]], "rocketlandingenv (class in pyflyt.gym_envs.rocket_envs.rocket_landing_env)": [[22, "PyFlyt.gym_envs.rocket_envs.rocket_landing_env.RocketLandingEnv", false]], "segimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.segImg", false]], "set_all_setpoints() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_all_setpoints", false]], "set_armed() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_armed", false]], "set_mode() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.set_mode", false]], "set_mode() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_mode", false]], "set_mode() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.set_mode", false]], "set_mode() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.set_mode", false]], "set_mode() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.set_mode", false]], "set_setpoint() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_setpoint", false]], "setpoint (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.setpoint", false]], "starting_fuel_ratio (pyflyt.core.drones.rocket attribute)": [[14, "PyFlyt.core.drones.Rocket.starting_fuel_ratio", false]], "starting_velocity (pyflyt.core.drones.fixedwing attribute)": [[12, "PyFlyt.core.drones.Fixedwing.starting_velocity", false]], "state (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.state", false]], "state() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.state", false]], "state_update() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.state_update", false]], "state_update() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.state_update", false]], "state_update() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.state_update", false]], "state_update() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.state_update", false]], "state_update() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.state_update", false]], "state_update() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.state_update", false]], "state_update() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.state_update", false]], "step() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.step", false]], "update_control() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_control", false]], "update_control() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_control", false]], "update_control() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_control", false]], "update_control() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_control", false]], "update_last() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_last", false]], "update_last() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_last", false]], "update_last() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_last", false]], "update_last() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_last", false]], "update_physics() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_physics", false]], "update_physics() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_physics", false]], "update_physics() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_physics", false]], "update_physics() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_physics", false]], "update_state() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_state", false]], "update_state() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_state", false]], "update_state() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_state", false]], "update_state() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_state", false]], "view_mat (pyflyt.core.abstractions.camera property)": [[6, "PyFlyt.core.abstractions.Camera.view_mat", false]], "windfieldclass (class in pyflyt.core.abstractions)": [[15, "PyFlyt.core.abstractions.WindFieldClass", false]]}, "objects": {"PyFlyt.core": [[10, 0, 1, "", "Aviary"]], "PyFlyt.core.Aviary": [[10, 1, 1, "", "all_aux_states"], [10, 1, 1, "", "all_states"], [10, 2, 1, "", "aux_state"], [10, 1, 1, "", "aviary_steps"], [10, 1, 1, "", "contact_array"], [10, 1, 1, "", "drones"], [10, 1, 1, "", "elapsed_ime"], [10, 1, 1, "", "physics_steps"], [10, 2, 1, "", "print_all_bodies"], [10, 2, 1, "", "register_all_new_bodies"], [10, 2, 1, "", "reset"], [10, 2, 1, "", "set_all_setpoints"], [10, 2, 1, "", "set_armed"], [10, 2, 1, "", "set_mode"], [10, 2, 1, "", "set_setpoint"], [10, 2, 1, "", "state"], [10, 2, 1, "", "step"]], "PyFlyt.core.abstractions": [[4, 0, 1, "", "Boosters"], [5, 0, 1, "", "BoringBodies"], [6, 0, 1, "", "Camera"], [3, 0, 1, "", "DroneClass"], [7, 0, 1, "", "Gimbals"], [8, 0, 1, "", "LiftingSurface"], [8, 0, 1, "", "LiftingSurfaces"], [15, 0, 1, "", "WindFieldClass"]], "PyFlyt.core.abstractions.Boosters": [[4, 3, 1, "", "get_states"], [4, 3, 1, "", "physics_update"], [4, 3, 1, "", "reset"], [4, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.BoringBodies": [[5, 3, 1, "", "get_states"], [5, 3, 1, "", "physics_update"], [5, 3, 1, "", "reset"], [5, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.Camera": [[6, 3, 1, "", "capture_image"], [6, 3, 1, "", "get_states"], [6, 3, 1, "", "physics_update"], [6, 3, 1, "", "state_update"], [6, 1, 1, "", "view_mat"]], "PyFlyt.core.abstractions.DroneClass": [[3, 1, 1, "", "Id"], [15, 2, 1, "", "__call__"], [3, 1, 1, "", "aux_state"], [3, 1, 1, "", "control_period"], [3, 1, 1, "", "depthImg"], [3, 2, 1, "", "disable_artificial_damping"], [3, 1, 1, "", "drone_path"], [3, 2, 1, "", "get_joint_info"], [3, 1, 1, "", "instanced_controllers"], [3, 1, 1, "", "np_random"], [3, 1, 1, "", "param_path"], [3, 1, 1, "", "physics_period"], [3, 2, 1, "", "register_controller"], [3, 1, 1, "", "registered_base_controllers"], [3, 1, 1, "", "registered_controllers"], [3, 2, 1, "", "reset"], [3, 1, 1, "", "rgbaImg"], [3, 1, 1, "", "segImg"], [3, 2, 1, "", "set_mode"], [3, 1, 1, "", "setpoint"], [3, 1, 1, "", "state"], [3, 2, 1, "", "update_control"], [3, 2, 1, "", "update_last"], [3, 2, 1, "", "update_physics"], [3, 2, 1, "", "update_state"]], "PyFlyt.core.abstractions.Gimbals": [[7, 3, 1, "", "compute_rotation"], [7, 3, 1, "", "get_states"], [7, 3, 1, "", "physics_update"], [7, 3, 1, "", "reset"], [7, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.LiftingSurface": [[8, 3, 1, "", "get_states"], [8, 3, 1, "", "physics_update"], [8, 3, 1, "", "reset"], [8, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.LiftingSurfaces": [[8, 3, 1, "", "get_states"], [8, 3, 1, "", "physics_update"], [8, 3, 1, "", "reset"], [8, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.WindFieldClass": [[15, 2, 1, "", "__init__"], [15, 1, 1, "", "np_random"]], "PyFlyt.core.abstractions.motors": [[9, 0, 1, "", "Motors"]], "PyFlyt.core.abstractions.motors.Motors": [[9, 3, 1, "", "get_states"], [9, 3, 1, "", "physics_update"], [9, 3, 1, "", "reset"], [9, 3, 1, "", "state_update"]], "PyFlyt.core.drones": [[12, 0, 1, "", "Fixedwing"], [13, 0, 1, "", "QuadX"], [14, 0, 1, "", "Rocket"]], "PyFlyt.core.drones.Fixedwing": [[12, 3, 1, "", "reset"], [12, 3, 1, "", "set_mode"], [12, 4, 1, "", "starting_velocity"], [12, 3, 1, "", "update_control"], [12, 3, 1, "", "update_last"], [12, 3, 1, "", "update_physics"], [12, 3, 1, "", "update_state"]], "PyFlyt.core.drones.QuadX": [[13, 3, 1, "", "register_controller"], [13, 3, 1, "", "reset"], [13, 3, 1, "", "set_mode"], [13, 3, 1, "", "update_control"], [13, 3, 1, "", "update_last"], [13, 3, 1, "", "update_physics"], [13, 3, 1, "", "update_state"]], "PyFlyt.core.drones.Rocket": [[14, 3, 1, "", "reset"], [14, 3, 1, "", "set_mode"], [14, 4, 1, "", "starting_fuel_ratio"], [14, 3, 1, "", "update_control"], [14, 3, 1, "", "update_last"], [14, 3, 1, "", "update_physics"], [14, 3, 1, "", "update_state"]], "PyFlyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env": [[17, 0, 1, "", "FixedwingWaypointsEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_hover_env": [[18, 0, 1, "", "QuadXHoverEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_pole_balance_env": [[19, 0, 1, "", "QuadXPoleBalanceEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_pole_waypoints_env": [[20, 0, 1, "", "QuadXPoleWaypointsEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_waypoints_env": [[21, 0, 1, "", "QuadXWaypointsEnv"]], "PyFlyt.gym_envs.rocket_envs.rocket_landing_env": [[22, 0, 1, "", "RocketLandingEnv"]], "PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env": [[24, 0, 1, "", "MAFixedwingDogfightEnv"]], "PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env": [[25, 0, 1, "", "MAQuadXHoverEnv"]]}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "property", "Python property"], "2": ["py", "function", "Python function"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "objtypes": {"0": "py:class", "1": "py:property", "2": "py:function", "3": "py:method", "4": "py:attribute"}, "terms": {"": [3, 4, 6, 9, 10, 13, 23], "0": [1, 3, 4, 6, 8, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 24, 25], "01": 24, "01305": 27, "05": 14, "07": 24, "1": [1, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 19, 20, 21, 22, 24, 25], "10": [18, 20, 21, 24, 25], "100": 17, "1000": [1, 10, 15], "10th": 14, "120": [3, 10, 12, 13, 14, 15, 17], "128": [3, 12, 13, 14], "2": [1, 3, 5, 7, 10, 12, 13, 14, 15, 17, 20, 21, 24], "20": [12, 13, 19, 20, 24], "200": 22, "2023": 27, "20xx": 0, "225": 5, "2304": 27, "240": [3, 10, 12, 13, 14], "25": 10, "2d": 5, "3": [1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 25], "30": [10, 14, 17, 21, 22, 24, 25], "4": [1, 10, 13, 17, 20, 21], "40": [10, 18, 19, 20, 22, 25], "42": 23, "480": [17, 18, 19, 20, 21, 22], "5": [1, 10, 12, 13, 21, 24], "50": 10, "500": [22, 24], "6": [1, 10, 13], "60": [10, 24], "65": 8, "7": [1, 10, 13, 14, 15], "8": [10, 15, 24], "80": 0, "9": 14, "90": [3, 12, 13, 14], "A": [0, 3, 4, 5, 6, 7, 10, 27], "As": 5, "At": 1, "By": [3, 10], "For": [2, 10, 15, 23], "If": [0, 4, 17, 20, 21, 27], "In": [6, 10], "It": [0, 1, 2, 3, 4, 6, 10, 13, 26], "NOT": 4, "OR": 8, "On": [1, 6], "The": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 17, 18, 19, 20, 21, 22, 24, 25], "Then": [1, 15], "These": [10, 11], "To": [10, 15, 26], "_": [17, 18, 19, 20, 21, 22], "__call__": 15, "__file__": 3, "__init__": [3, 15], "_lowercase_": 10, "a0": 4, "a1": 4, "abil": 9, "abl": 10, "about": [7, 12, 13, 14], "abov": 1, "absolut": 22, "abstract": [1, 3, 4, 5, 6, 7, 8, 9, 15], "accept": [4, 9], "access": 3, "accord": 4, "accur": [3, 5], "achiev": 6, "acrow": 24, "act": [4, 9], "action": [17, 18, 19, 20, 21, 22, 23, 24, 25], "action_spac": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "actual": [4, 9], "actual_duty_cycl": [4, 9], "actuat": [3, 7, 8, 12, 24], "addit": [6, 19], "addition": [4, 9], "adjust": 6, "aerial": 24, "aerodynam": [3, 5, 8], "affect": 5, "after": 7, "agent": [17, 18, 19, 20, 21, 22, 23, 24, 25], "agent_hz": [17, 18, 19, 20, 21, 22, 24, 25], "aggress": 24, "agil": 8, "ai": 24, "aileron": 12, "air": 5, "aircraft": [6, 17, 20, 21, 24], "al": 8, "algorithm": [16, 23, 26], "all": [0, 1, 2, 3, 5, 7, 8, 9, 10, 23, 24, 25], "all_aux_st": 10, "all_param": 3, "all_stat": 10, "allevi": 10, "allow": [1, 2, 4, 9, 10, 17, 18, 19, 20, 21, 24, 25], "along": [9, 10], "alpha_0_bas": 8, "alpha_stall_n_bas": 8, "alpha_stall_p_bas": 8, "also": [4, 10], "altern": 0, "although": 10, "alwai": 4, "amalgam": 1, "amount": [4, 6, 9, 10], "an": [1, 3, 4, 6, 8, 9, 10, 15, 24, 25], "ang_po": [3, 12, 13, 14], "ang_vel": [3, 12, 13, 14], "angl": [6, 8, 10, 21], "angle_represent": [17, 18, 19, 20, 21, 22, 25], "angular": [10, 13, 18, 21, 25], "ani": [3, 5, 10, 19, 20, 26], "anyth": [24, 26], "api": [23, 24], "append": 10, "appli": 5, "ar": [0, 1, 2, 3, 4, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "arbitrari": [4, 5, 7, 9], "ardupilot": 13, "area": [5, 17, 18, 19, 20, 21, 22, 24, 25], "arg": 15, "argument": [4, 9, 10, 17, 20, 21], "arm": 10, "around": [4, 7, 9], "arrai": [1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 25], "arrang": 10, "articl": 27, "artifici": 3, "arxiv": 27, "ascend": 10, "asid": 3, "assign": 3, "assisted_flight": 24, "assum": 5, "attach": [4, 6, 15], "attack": 8, "attribut": 1, "author": 27, "automat": [10, 24], "aux": 10, "aux_stat": [3, 10], "auxiliari": [3, 10], "avail": [0, 4, 13, 27], "aviari": [1, 3, 12, 13, 14, 15], "aviary_step": 10, "ax": [1, 5, 7], "axi": [3, 4, 7, 9, 14], "b": [1, 24], "b0": 4, "b1": 4, "backend": 3, "balanc": 20, "base": [1, 8], "base_mod": [3, 13], "baselin": [17, 20, 21], "basic": [2, 15], "becaus": [19, 20], "becom": 24, "been": 10, "befor": [3, 21, 24], "begin": 24, "behaviour": 3, "being": [17, 20, 21], "below": [13, 15], "between": [4, 7, 10, 24], "big": 10, "bind": [3, 26], "biplan": 26, "bn": 4, "bodi": [1, 4, 6, 10], "body_id": 5, "bool": [3, 4, 6, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 24, 25], "boolean": [4, 10], "booster": [3, 7, 9, 10, 14, 22], "booster_id": 4, "boringbodi": 5, "bottom": 10, "bound": 24, "breakdown": 13, "briefli": 10, "bring": 0, "brusei": 27, "brushless": 9, "bug": 6, "build": 0, "built": [0, 1, 26], "bullet": 26, "bullet_cli": [3, 4, 5, 6, 7, 8, 9], "bulletcli": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14], "burn": 4, "c": [0, 24], "c0": 4, "c1": 4, "c_d": 5, "calcul": 4, "call": [2, 4, 6, 7, 9, 10, 13, 15], "callabl": 10, "camera": 3, "camera_angle_degre": [3, 6, 12, 13, 14], "camera_fov_degre": [3, 6, 12, 13, 14], "camera_fp": [10, 12, 13, 14], "camera_id": 6, "camera_position_offset": [6, 12, 13, 14], "camera_resolut": [3, 6, 12, 13, 14], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 15, 17, 18, 19, 20, 21, 22, 24, 25, 26], "cannon": 24, "cannot": 4, "capabl": [1, 15], "captur": [6, 10], "capture_imag": [3, 6], "cardin": 1, "cascad": 13, "case": 1, "caus": 5, "caveat": 10, "cd_0": 8, "cdot": 5, "ceil": 22, "center": 6, "cf2x": 13, "chang": [1, 4, 10, 13], "check": [3, 10], "chord": 8, "cinemat": 6, "cite": 27, "cl_alpha_2d": 8, "class": [1, 2, 11, 15, 17, 18, 19, 20, 21, 22, 24, 25], "click": 0, "client": [3, 4, 5, 6, 7, 8, 9], "close": [1, 10, 23, 24, 25], "cmd": [3, 8], "cn": 4, "code": 10, "coeffici": [5, 8, 9], "collis": 10, "command": [3, 4, 8, 9, 12, 17, 19, 20, 24], "command_id": 8, "command_sign": 8, "common": 10, "compat": [17, 20, 21], "complet": [17, 20, 21], "complic": 2, "compon": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "comprehens": [2, 3], "comput": [5, 9], "compute_rot": 7, "concaten": 3, "concis": [5, 9], "conda": 0, "condit": 8, "cone": 24, "configur": [2, 10, 13, 26], "consid": [3, 17, 20, 21, 24], "consist": 13, "constant": [4, 7, 8, 9, 17, 20, 21], "construct": [2, 3], "consult": 10, "consum": [6, 10], "contact": 10, "contact_arrai": 10, "contain": 10, "context_length": [17, 20, 21], "control": [1, 3, 11, 19, 20, 24], "control_hz": [3, 10, 12, 13, 14], "control_period": 3, "controlclass": [3, 13], "controller_constructor": [3, 13], "controller_id": [3, 13], "conveni": [4, 8, 9], "convert": [4, 8, 9], "cooper": 24, "core": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15], "correct": 8, "correspond": [10, 14], "counter": 9, "coupl": 0, "crash": [18, 19, 25], "creat": 3, "creativ": 10, "crucial": 4, "current": [4, 6, 7, 8, 9, 10, 12, 13, 14], "custom": [2, 3, 17, 20, 21, 26], "cycl": [4, 9], "damag": 24, "damage_per_hit": 24, "damp": 3, "datasheet": 14, "deal": 24, "debug": [3, 10], "def": [3, 15], "default": [10, 11, 13, 16, 23], "defin": [1, 3, 9, 10, 15], "deflect": [8, 10, 14], "deflection_limit": 8, "degre": [6, 7, 8], "denomin": 10, "densiti": 5, "depend": [3, 4, 5, 6, 9, 10, 15], "deplet": 4, "depth": 6, "depthimg": [3, 6], "describ": [1, 13, 14], "descript": 11, "design": 2, "desir": 1, "desktop": 0, "detail": 0, "develop": 0, "diagon": 4, "dict": [3, 10, 15, 17, 20, 21], "dictionari": 10, "differ": [4, 7, 10, 13, 16, 23], "difficult": 5, "direct": [1, 4, 5, 8, 19, 20], "directli": [12, 24], "directori": 3, "dirnam": 3, "disabl": 3, "disable_artificial_damp": 3, "disconnect": 15, "discret": 26, "displai": 3, "distanc": [6, 17, 20, 21, 22], "do": [3, 9, 10, 15], "document": [2, 3, 13, 26], "doe": [4, 5, 6, 7, 9, 10], "dogfight": 24, "domain": 1, "don": [1, 3], "down": 0, "download": 0, "downtilt": 6, "drag": [5, 8], "drag_coef": 5, "driven": 9, "drone": [1, 2, 4, 5, 6, 8, 9, 12, 13, 14, 18, 19, 26], "drone_index": 10, "drone_model": [3, 10, 12, 13, 14], "drone_opt": 10, "drone_path": 3, "drone_typ": [1, 10, 15], "drone_type_map": 10, "droneclass": [3, 10, 15], "drop": 20, "dtype": [3, 15], "duti": [4, 9], "dynam": [9, 13], "each": [1, 2, 3, 4, 5, 7, 8, 9, 10, 24, 25], "easier": [2, 17, 20, 21], "easili": 9, "east": 1, "effect": [6, 8, 21, 24], "elabor": 1, "elaps": 10, "elapsed_im": 10, "electr": 9, "element": [4, 10], "elsewher": 2, "enabl": 3, "encourag": 0, "end": [3, 12, 13, 14], "endpoint": 10, "enemi": 24, "engin": [4, 10, 26], "enough": [3, 10], "entiti": 10, "enu": 1, "env": [1, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "environ": [1, 6, 10, 15, 27], "equal": 10, "equat": 5, "equival": 10, "essenti": 1, "et": 8, "eta": 8, "etc": 10, "euler": [3, 10, 17, 18, 19, 20, 21, 22, 25], "even": 10, "everi": [1, 6, 7, 10], "everyth": [0, 12, 13, 14], "exact": [4, 9], "exampl": [0, 2, 3, 15], "except": 9, "exist": 5, "expand": 0, "experienc": [5, 10], "express": 3, "extent": 1, "extinguish": 4, "extract": 14, "f": 3, "f_i": 5, "factor": 8, "falcon": 14, "fall": [5, 22], "fals": [3, 6, 10, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 25], "familiar": 5, "fast": [17, 20, 21], "fastest": 23, "featur": 6, "field": [6, 10, 15], "figur": 5, "file": [3, 12, 14], "final": 1, "finlet": 14, "finlet_i": 22, "finlet_rol": 22, "finlet_x": 22, "fire": 24, "first": [0, 1, 7, 10, 14], "fix": [8, 12], "fixedw": [10, 11, 14], "fixedwing_env": [17, 24], "fixedwing_opt": 10, "fixedwing_waypoints_env": 17, "fixedwingwaypointsenv": 17, "flap": 8, "flap_to_chord": 8, "flatten": 2, "flatten_observ": 24, "flattenwaypointenv": [17, 20, 21], "fledg": 0, "flexibl": [1, 26], "fli": 24, "flight": [1, 3, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 25], "flight_dome_s": [17, 18, 19, 20, 21, 24, 25], "flight_mod": [10, 17, 18, 19, 20, 21, 25], "float": [3, 4, 5, 6, 7, 8, 9, 10, 14, 15, 17, 18, 19, 20, 21, 22, 24, 25], "floor": 10, "fluctuat": [4, 9], "fly": [17, 18, 19, 20, 21, 22, 24, 25], "focu": 6, "folder": 3, "follow": [1, 3, 5, 7, 15], "forc": [4, 5, 8, 9], "form": 3, "forward_unit": 8, "found": [2, 3], "four": 13, "fov": 6, "frac": 5, "frame": [1, 3, 4, 5, 10], "from": [1, 3, 4, 6, 7, 9, 10, 14, 15, 17, 20, 21, 23, 24, 25], "front": 1, "frontal": 5, "fuel": [4, 9, 10, 22], "fuel_burn": 4, "fueltank_id": 4, "full": [4, 8, 24], "fulli": 0, "function": [2, 3, 10, 15, 24], "g": 1, "gener": [3, 4, 5, 6, 7, 8, 9], "geometri": 14, "get": [3, 4, 7, 8, 9, 10, 20, 26], "get_joint_info": 3, "get_stat": [2, 3, 4, 5, 6, 7, 8, 9], "getbasepositionandorient": 3, "getbaseveloc": 3, "geteulerfromquaternion": 3, "getmatrixfromquaternion": 3, "gimbal": [4, 6, 9, 14, 22], "gimbal_command": 7, "gimbal_range_degre": 7, "gimbal_tau": 7, "gimbal_unit_1": 7, "gimbal_unit_2": 7, "github": [6, 10], "give": 10, "go": [0, 22], "goal": [17, 18, 19, 20, 21, 22, 25], "goal_reach_angl": 21, "goal_reach_dist": [17, 20, 21], "goe": 10, "gracefulli": [1, 10], "graviti": 1, "greedi": 24, "greedier": 24, "ground": [1, 5, 10, 13, 19], "gun": 24, "gym_env": [16, 17, 18, 19, 20, 21, 22], "gymnasium": [17, 18, 19, 20, 21, 22], "ha": [1, 3, 10, 14, 24], "hand": [7, 9], "handl": [1, 8, 10, 12, 13, 14], "handler": [8, 10], "happen": 3, "have": [1, 2, 3, 4, 9, 10, 15, 17, 20, 21], "health": 24, "height": [6, 15], "help": 0, "here": [0, 10, 27, 28], "high": 24, "highli": [0, 1], "hit": [19, 24], "hook": 15, "horizon": 6, "horizont": [1, 12, 22], "horri": 27, "hour": 0, "hover": [16, 19, 25], "how": [10, 16, 17, 20, 21, 23, 24], "howev": [10, 17, 20, 21], "human": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "hz": 10, "i": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27], "id": [3, 4, 5, 6, 7, 8, 9, 10], "idea": 5, "ie": [18, 21, 25], "ignit": [4, 14, 22], "illustr": 5, "imag": [6, 10], "immedi": [17, 20, 21], "implement": [2, 3, 4, 5, 13, 15], "implicit": 6, "import": [1, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "includ": [12, 13, 14, 17, 20, 21], "index": [1, 4, 10], "indic": 4, "individu": 5, "inertia": 4, "infin": 6, "info": [16, 23, 24, 25], "inform": [2, 3, 10], "inherit": 3, "initi": [3, 12, 13, 14, 15, 16, 23], "innocent": 27, "insert": [23, 24, 25], "inspir": 13, "instanc": [10, 12, 13, 14], "instanced_control": 3, "instanti": [1, 10], "instead": [6, 7, 10, 24], "int": [3, 4, 5, 6, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 24, 25], "integ": [3, 4, 6, 8, 9, 10], "interact": [17, 18, 19, 20, 21, 22, 24, 25], "interfac": 3, "interstag": 14, "introduc": [19, 20], "invalid": 10, "invari": 15, "ipsum": 15, "is_tracking_camera": 6, "issu": [6, 10], "its": [1, 24], "itself": [1, 3, 5, 6, 13], "jame": 27, "jet": 27, "jim": 27, "joint": 3, "journal": 27, "jun": 27, "just": [0, 1], "keep": 19, "kei": [3, 10], "kg": [5, 12], "khan": 8, "kindli": 28, "king": 27, "kwarg": 15, "lab": 13, "last": 10, "latenc": [19, 20], "later": 10, "latest": 0, "launch": 14, "law": 3, "lead": [10, 24], "learn": [16, 17, 20, 21, 23, 24, 27], "left": [1, 12], "let": 19, "lethal": 24, "lethal_angle_radian": 24, "lethal_dist": 24, "level": [8, 9, 24], "li": 1, "librari": [17, 20, 21, 26], "lift": 2, "lifting_surfac": [3, 8], "lifting_unit": 8, "liftingsurfac": [3, 8], "like": [1, 10, 15, 17, 20, 21], "likewis": 4, "limit": [4, 8], "lin_po": [3, 12, 13, 14], "lin_vel": [3, 12, 13, 14], "linear": [9, 10, 13], "link": [4, 5, 6, 7, 8, 9], "liquid": 4, "list": [4, 5, 8, 9, 10], "lit": 4, "liter": [17, 18, 19, 20, 21, 22, 25], "load": [3, 4, 12, 14], "local": [1, 3, 5, 8, 13], "locat": [3, 4, 9], "lock": 6, "log": 15, "logarithm": 15, "long": [18, 19, 20, 25], "longest": [18, 19, 25], "look": 1, "loop": 10, "looprat": [3, 17, 18, 19, 20, 21, 22, 24, 25], "loos": 1, "lorem": 15, "lose": 24, "lower": 24, "lowercas": 10, "m": [5, 10], "m1": 13, "m2": 13, "m3": 13, "m4": 13, "ma_fixedwing_dogfight_env": 24, "ma_quadx_hover_env": 25, "mafixedwingdogfightenv": 24, "magnitud": 10, "mai": [2, 7, 10, 23], "main": [5, 6, 12], "maintain": 23, "make": [16, 17, 18, 19, 20, 21, 22], "mani": [17, 20, 21, 24], "map": [6, 8, 10, 12], "maquadxhoverenv": [23, 25], "mass": [4, 14], "match": 21, "mathbf": 5, "mathemat": 2, "matmul": 3, "matric": [4, 7, 9], "matrix": [4, 6, 9], "mauro": 27, "max": 4, "max_displac": 22, "max_duration_second": [17, 18, 19, 20, 21, 22, 24, 25], "max_fuel_burn": 4, "max_fuel_r": 4, "max_inertia": 4, "max_rpm": 9, "max_thrust": [4, 9], "maximum": [4, 8, 9, 17, 18, 19, 20, 21, 22, 24, 25], "mean": 24, "meaning": 4, "meter": [1, 19, 20], "method": 2, "microsoft": 0, "min": 4, "min_thrust": 4, "minimum": 4, "missil": 24, "mode": [1, 3, 10, 11, 15, 17, 18, 19, 20, 21, 25], "model": [2, 3, 10, 11, 24], "model_dir": [3, 12, 13, 14], "modern": 24, "modifi": 4, "moment": 4, "more": [2, 3, 4, 5, 9, 10], "most": [17, 20, 21, 23], "motor": [2, 7, 12, 13, 19, 20], "motor_id": 9, "move": 5, "movement": 1, "much": [10, 19, 20, 24], "multi": [1, 23], "multiag": 25, "multipl": [8, 10], "multirotor": 13, "must": [0, 2, 3, 10], "my_paramet": 15, "mycustomdron": 10, "mywindfield": 15, "n": [1, 4, 5, 9, 10, 15], "nadjim": 27, "name": [2, 3, 10], "nativ": 16, "ndarrai": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 25], "need": [2, 4, 6, 7, 9], "neg": [8, 9], "net": 9, "new": [0, 10, 13], "nois": [4, 9, 15], "noise_ratio": [4, 9], "non": [17, 20, 21], "none": [3, 4, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 24, 25], "noqa": 16, "normal": [4, 5, 8, 9], "normal_area": 5, "north": 1, "nose": 24, "note": 10, "noth": 10, "now": 0, "np": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 25], "np_random": [3, 4, 5, 7, 8, 9, 12, 13, 14, 15], "num_boost": 4, "num_dron": [10, 25], "num_gimb": 7, "num_motor": 9, "num_surfac": 8, "num_target": [17, 20, 21], "number": [1, 3, 4, 5, 7, 8, 9, 10, 17, 20, 21], "numpi": [0, 1, 10, 15, 25], "o": 3, "ob": [16, 17, 18, 19, 20, 21, 22], "object": [1, 6, 8, 10], "observ": [16, 17, 20, 21, 23, 24, 25], "obtain": [4, 9], "off": 4, "offer": [11, 26], "offset": 6, "oh": 10, "onboard": [3, 10], "one": [10, 12, 14], "onli": [10, 12, 13, 14, 21, 22, 24], "open": 3, "optim": 10, "option": [0, 1, 2, 4, 13, 26], "order": [4, 10], "orient": [1, 3, 6, 10, 15, 25], "orthogon": 7, "other": [3, 7, 24], "otherwis": 3, "our": 27, "out": [1, 10, 24], "output": [3, 4, 9], "outsid": [10, 24], "overhead": [6, 10], "overrid": 15, "overview": 0, "own": [1, 2, 3, 15], "p": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14], "pad": [17, 20, 21, 22], "page": 10, "pair": 7, "parallelenv": 23, "param": 3, "param_path": 3, "paramet": [3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 24, 25], "parameter": 4, "pass": [1, 8, 10], "path": 3, "per": 24, "percent": 4, "perform": [6, 24], "period": [4, 5, 7, 8, 9], "persist": 1, "pettingzoo": 24, "phang": 27, "phyiscs_hz": 3, "physic": [1, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 24, 26], "physics_camera_ratio": 3, "physics_control_ratio": 3, "physics_hz": [3, 4, 9, 10, 12, 13, 14], "physics_period": [3, 4, 5, 7, 8, 9], "physics_step": [3, 10, 12, 13, 14], "physics_upd": [2, 3, 4, 5, 6, 7, 8, 9], "pid": 13, "pip3": 0, "pitch": [3, 12, 17], "pixel": 6, "place": 8, "plain": 5, "plane": 1, "platform": 11, "plu": [4, 9, 15], "point": [1, 4, 6, 24], "pointer": [3, 10], "polici": [23, 24, 25], "popular": [15, 17, 20, 21], "posit": [1, 3, 8, 10, 13, 15, 25], "possibl": [0, 1, 10, 15, 17, 18, 19, 20, 21, 25], "presenc": 4, "present": [4, 9], "primari": 5, "primitive_dron": [10, 13], "principl": 5, "print": 10, "print_all_bodi": 10, "prior": 0, "problem": 10, "produc": [4, 9], "propel": 9, "properti": [3, 4, 6, 10, 14, 15], "proport": 4, "propuls": 4, "provid": [0, 3, 10, 12, 13, 14, 15, 16, 23], "put": 1, "pwm": [4, 9, 19, 20], "px4": 13, "pybullet": [0, 3, 4, 5, 6, 7, 8, 9, 10, 13], "pyflyt": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 23, 24, 25, 27], "python": [0, 1, 15, 26], "pz_env": [23, 24, 25], "q": 13, "quad": 13, "quadcopt": 26, "quadrotor": [13, 18, 19, 20, 21], "quadx": [1, 10, 11, 15, 16], "quadx_env": [18, 19, 20, 21, 25], "quadx_hover_env": 18, "quadx_opt": 10, "quadx_pole_balance_env": 19, "quadx_pole_waypoints_env": 20, "quadx_waypoints_env": 21, "quadxhoverenv": 18, "quadxpolebalanceenv": 19, "quadxpolewaypointsenv": 20, "quadxwaypointsenv": 21, "quaternion": [17, 18, 19, 20, 21, 22, 25], "queri": 10, "r": 13, "radian": [1, 21], "ragdol": 10, "rais": 3, "ramp": [4, 8, 9], "randn": 15, "random": [3, 4, 5, 7, 8, 9, 15], "randomst": [3, 4, 5, 7, 8, 9, 12, 13, 14, 15], "rang": [1, 7, 10, 15, 24], "rate": [3, 4, 18, 21, 25], "ratio": [4, 8, 9], "raw": 10, "rb": 3, "re": 5, "reach": [1, 17, 20, 21], "read": [12, 14], "readabl": [17, 20, 21], "readili": [4, 9], "real": 8, "realpath": 3, "reason": 23, "receiv": [3, 10], "recommend": [0, 6, 10], "redirect": [4, 7, 9], "refer": [1, 2, 5, 15, 28], "referenc": 5, "regist": [10, 13], "register_all_new_bodi": 10, "register_control": [3, 11, 13], "register_wind_field_funct": 15, "registered_base_control": 3, "registered_control": 3, "reignit": 4, "reimplement": 2, "reinforc": [16, 17, 20, 21, 23, 24, 27], "rel": [1, 4], "relev": [1, 2, 3, 6, 10], "reli": 4, "remain": [4, 10, 22], "render": [1, 10, 15, 26], "render_mod": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "render_resolut": [17, 18, 19, 20, 21, 22], "repeatedli": 1, "report": 14, "repositori": 0, "repres": [1, 3, 4, 5, 6, 7, 8, 9, 10], "requir": [2, 9], "research": 27, "reserv": 3, "reset": [2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "resetbasepositionandorient": 3, "reshap": 3, "resolut": 6, "resolv": 5, "result": [5, 10, 17, 20, 21], "return": [2, 3, 4, 6, 7, 8, 9, 10, 15], "revers": 9, "rew": [17, 18, 19, 20, 21, 22], "reward": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "rgb_arrai": [17, 18, 19, 20, 21, 22], "rgba": 6, "rgbaimg": [3, 6], "rgbimg": 10, "rho": 5, "right": [7, 9, 12], "rng": 10, "rocket": [4, 10, 11, 26], "rocket_brick": 3, "rocket_env": 22, "rocket_landing_env": 22, "rocket_opt": 10, "rocketbrick": 10, "rocketlandingenv": 22, "roll": [3, 12, 17], "rosetta": [2, 3], "rotat": [3, 4, 7, 9], "rotation_matrix": [5, 8], "rotation_vector": 7, "round": 10, "rpm": 9, "rpy": [1, 10], "rpyt": 24, "rule": [7, 9], "run": [0, 3, 12, 13, 14], "safe_load": 3, "same": [3, 5, 10], "sampl": [4, 9, 10, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "scale": 14, "scroll": 0, "second": [7, 10, 15], "section": [0, 1, 2, 3, 10], "see": [6, 10], "seed": [10, 23], "segimg": [3, 6], "segment": 6, "select": [0, 13], "self": [3, 10, 15], "sequenc": [5, 10, 17, 20, 21], "seri": [4, 5, 7, 9], "serv": [1, 2, 3], "servo": 7, "set": [0, 1, 2, 3, 4, 7, 12, 13, 14, 15, 17, 20, 21], "set_all_setpoint": 10, "set_arm": 10, "set_mod": [1, 3, 10, 11, 12, 13, 14, 15], "set_setpoint": [1, 10], "setpoint": [1, 3, 10, 12, 14], "setup": 15, "sever": [3, 4, 11, 15], "shape": 15, "ship": 10, "shit": 10, "should": [3, 4], "show": 5, "shown": [1, 5], "sign": 5, "signific": [6, 10], "similar": [9, 10, 24], "similarli": [0, 10], "simpl": [0, 18, 19, 25], "simple_wind": 15, "simpli": [8, 10, 15], "simul": [3, 4, 5, 6, 7, 8, 9, 10, 15, 17, 18, 19, 20, 21, 22, 24, 25, 27], "sinc": 10, "singl": [1, 8, 12], "size": [17, 18, 19, 20, 21, 24, 25], "skip": [0, 3], "slope": 8, "small": 12, "so": [10, 15], "solid": 4, "some": [2, 3, 4, 9, 15], "someth": [1, 10], "sourc": [0, 4, 10], "space": [1, 14, 17, 20, 21], "spacex": 14, "span": 8, "spars": [17, 18, 19, 20, 21, 22, 24, 25], "sparse_reward": [17, 18, 19, 20, 21, 22, 24, 25], "spawn": [1, 24], "spawn_height": 24, "spawn_radiu": 24, "special": 2, "specif": 13, "specifi": [3, 4, 17, 20, 21, 25], "stabl": [17, 20, 21], "stack": 3, "stage": 14, "stall": 8, "standard": [4, 9], "start": [1, 3, 10, 15, 24, 25, 26], "start_orn": [1, 3, 10, 12, 13, 14, 15, 25], "start_po": [1, 3, 10, 12, 13, 14, 15, 25], "starting_fuel_ratio": [4, 11, 14], "starting_veloc": [10, 11, 12], "state": [2, 3, 4, 7, 8, 9, 10, 12, 13, 14, 15], "state_upd": [2, 3, 4, 5, 6, 7, 8, 9], "stateless": 15, "step": [1, 3, 4, 6, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "steppabl": 26, "stone": [2, 3], "store": 10, "str": [3, 10, 12, 13, 14, 24, 25], "straight": 0, "strength": 15, "string": [1, 10], "studio": 0, "subclass": 3, "submodul": 2, "subscript": 1, "suggest": 2, "super": [3, 15], "support": [0, 15, 23, 26], "surfac": [2, 5, 10], "surface_id": 8, "surface_veloc": 8, "swee": 27, "system": [13, 24], "t": [1, 3, 10, 13, 18, 21, 25], "tai": 27, "tai2023pyflyt": 27, "tail": 12, "take": 4, "tank": 4, "target": [17, 18, 19, 20, 21, 25], "target_duty_cycl": [4, 9], "task": 10, "tau": [4, 8, 9], "team": 24, "team_siz": 24, "templat": 3, "term": [6, 10, 17, 18, 19, 20, 21, 22], "termin": [16, 22, 23, 24, 25], "test": [16, 23, 26], "text": 5, "th": 10, "theh": 6, "thei": [3, 4, 5, 15], "them": [0, 1, 5, 10, 17, 20, 21], "thermal": 15, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25], "thing": [1, 3, 10, 12, 13, 14], "think": 26, "those": [17, 20, 21], "three": [1, 5, 10], "throttl": [4, 9, 14, 22], "throttleabl": [4, 14], "through": [0, 1, 5, 8, 10, 12, 13, 14], "throughout": 10, "thrust": [3, 4, 7, 9, 10, 12, 13, 14, 17, 18, 21, 25], "thrust_coef": 9, "thrust_unit": [4, 9], "tilt": 6, "time": [4, 7, 8, 9, 10, 15, 17, 18, 19, 20, 21, 22, 24, 25, 26], "titl": 27, "too": [19, 20], "tool": 0, "toronto": 13, "torqu": [4, 8, 9], "torque_coef": 9, "total_fuel_mass": 4, "toward": [17, 20, 21], "track": [6, 10], "train": 24, "trait": [4, 10], "transform": 4, "travel": 8, "true": [1, 10, 15, 24], "trunc": [17, 18, 19, 20, 21, 22], "truncat": [16, 23, 24, 25], "tube": 12, "tupl": [3, 6, 8, 12, 13, 14, 17, 18, 19, 20, 21, 22], "tutori": [2, 3], "two": [1, 5, 7, 13], "type": [1, 3, 4, 6, 7, 8, 9, 13], "typic": [4, 10], "u": 13, "uav": [8, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 25, 27], "uav_id": [4, 5, 6, 8, 9], "unarm": 10, "under": [8, 10], "underli": [3, 10, 19, 20], "uniformli": 5, "uniqu": [4, 10], "unit": [4, 7, 8, 9], "univers": 13, "unstabl": 10, "up": [1, 4, 9], "updat": [3, 5, 8, 10, 12, 13, 14], "update_control": [3, 11, 12, 13, 14], "update_last": [3, 6, 11, 12, 13, 14], "update_phys": [2, 3, 11, 12, 13, 14], "update_st": [2, 3, 8, 11, 12, 13, 14], "updraft": 15, "upright": 19, "uptil": 6, "upward": 1, "urdf": 3, "us": [0, 1, 3, 4, 5, 7, 8, 9, 10, 13, 15, 17, 18, 19, 20, 21, 22, 24, 25], "usabl": 3, "usag": [4, 15, 16, 23], "use_camera": [3, 10, 12, 13, 14], "use_gimb": [3, 6, 12, 13, 14], "use_yaw_target": 21, "user": [0, 1, 10, 15], "usual": [0, 3, 8, 15], "util": 1, "v": [5, 13], "v1": 14, "v2": [16, 18], "v_i": 5, "v_x": 5, "v_y": 5, "v_z": 5, "valid": 10, "valu": [3, 4, 6, 7, 9, 14, 24], "valueerror": 3, "vari": 15, "variabl": 15, "variant": 11, "varieti": 4, "variou": [1, 2, 10, 13, 15, 16, 23], "vec3": 8, "vector": [4, 5, 7, 8, 9, 10, 14], "vehicl": [3, 12, 13, 14], "vel": 3, "veloc": [5, 8, 10, 13, 15, 22], "veri": [2, 3, 10], "vertic": [12, 15], "via": 10, "view": 6, "view_mat": 6, "virtual": 0, "viscos": 8, "visit": 26, "visual": 0, "vp": [13, 18, 21, 25], "vq": [13, 18, 21, 25], "vr": [13, 18, 21, 25], "vx": 13, "vy": 13, "vz": 13, "w": 13, "wai": 0, "want": 10, "we": [0, 1, 3, 4, 10], "weapon": 24, "well": [1, 15, 23], "were": 14, "what": 10, "wheel": 0, "when": [6, 10, 24], "where": [0, 1, 3, 4, 5, 6, 7, 10, 15, 17, 20, 21, 23, 24, 25], "whether": [3, 4, 6, 10, 17, 18, 19, 20, 21, 22, 24, 25], "which": [5, 10, 17, 20, 21], "while": [0, 2, 3, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "whole": 10, "wide": 23, "width": [6, 24], "wind": 10, "wind_field": 15, "wind_opt": [10, 15], "wind_typ": [10, 15], "windfield": [10, 15], "windfieldclass": [10, 15], "wing": [8, 12], "wish": [0, 10, 27], "within": [2, 6, 10, 24], "without": [2, 17, 20, 21], "won": 10, "wong": 27, "work": 27, "world_scal": 10, "would": [17, 20, 21, 23, 24, 25], "wrapper": [17, 20, 21], "x": [1, 3, 5, 10, 13, 14, 17, 20, 21, 22, 25], "xx": 0, "xy": 15, "xyz": 5, "xz_b": 5, "xz_g": 5, "y": [1, 3, 5, 10, 13, 14, 17, 20, 21, 22], "yaml": [3, 12, 14], "yaw": [1, 3, 12, 14, 17, 21], "year": [0, 27], "ymmv": 0, "you": [0, 1, 10, 17, 20, 21, 23, 24, 25, 26, 27], "your": [2, 3, 23, 24, 25], "z": [1, 3, 5, 10, 13, 15, 17, 20, 21], "zero": [3, 8], "zeros_lik": [10, 15]}, "titles": ["Documentation", "Core", "Abstractions", "Base Drone Class", "Boosters", "Boring Bodies", "Camera", "Gimbals", "Lifting Surfaces", "Motors", "Aviary", "Drones", "Fixedwing", "QuadX", "Rocket", "Wind", "Gymnasium Environments", "PyFlyt/Fixedwing-Waypoints-v3", "PyFlyt/QuadX-Hover-v3", "PyFlyt/QuadX-Pole-Balance-v3", "PyFlyt/QuadX-Pole-Waypoints-v3", "PyFlyt/QuadX-Waypoints-v3", "PyFlyt/Rocket-Landing-v3", "PettingZoo Environments", "MAFixedwingDogfightEnvV2", "MAQuadXHoverEnvV2", "PyFlyt - UAV Simulation Environments for Reinforcement Learning Research", "Paper Publication", "Tutorials"], "titleterms": {"abstract": 2, "access": 10, "api": [1, 10], "architectur": 1, "attribut": [3, 10, 15], "aviari": 10, "axi": 1, "balanc": 19, "base": 3, "bodi": 5, "booster": 4, "bore": 5, "camera": [6, 10], "citat": 27, "class": [3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14], "complex": 15, "control": [10, 12, 13, 14], "convent": 1, "core": [1, 10], "custom": [10, 15], "default": [3, 15], "descript": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 24, 25, 26], "do": 0, "document": 0, "drone": [3, 10, 11], "environ": [0, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "exampl": 10, "fixedw": [12, 17], "flatten": [17, 20, 21], "fp": [6, 10], "gener": 1, "gimbal": 7, "gymnasium": [0, 16], "hover": 18, "i": 0, "individu": 10, "instal": 0, "land": 22, "learn": 26, "lift": 8, "linux": 0, "looprat": 10, "maco": 0, "mafixedwingdogfightenvv2": 24, "maquadxhoverenvv2": 25, "mathemat": 8, "method": [3, 10, 15], "mode": [12, 13, 14], "model": [8, 12, 13, 14, 15], "more": [0, 15], "motor": 9, "multi": 10, "option": [3, 10, 17, 18, 19, 20, 21, 22, 24, 25], "overview": [11, 15], "paper": 27, "pettingzoo": [0, 23], "physic": 10, "pole": [19, 20], "preimplement": 15, "preprint": 27, "public": 27, "pyflyt": [17, 18, 19, 20, 21, 22, 26], "quadx": [13, 18, 19, 20, 21], "reinforc": 26, "requir": [3, 15], "research": 26, "rocket": [14, 22], "rule": 24, "set": 10, "setup": 10, "simpl": 15, "simul": 26, "singl": 10, "spawn": 10, "step": 10, "surfac": 8, "task": [17, 18, 19, 20, 21, 22, 24, 25], "tutori": 28, "type": 10, "uav": 26, "usag": [2, 10, 17, 18, 19, 20, 21, 22, 24, 25], "v3": [17, 18, 19, 20, 21, 22], "variant": 13, "want": 0, "waypoint": [17, 20, 21], "wind": 15, "window": 0}}) \ No newline at end of file diff --git a/docs/tutorials.html b/docs/tutorials.html index 05b58105..785630f7 100644 --- a/docs/tutorials.html +++ b/docs/tutorials.html @@ -42,7 +42,7 @@ - + diff --git a/docs_source/documentation/gym_envs/fixedwing_waypoints_env.md b/docs_source/documentation/gym_envs/fixedwing_waypoints_env.md index f338544e..1be42f6c 100644 --- a/docs_source/documentation/gym_envs/fixedwing_waypoints_env.md +++ b/docs_source/documentation/gym_envs/fixedwing_waypoints_env.md @@ -1,4 +1,4 @@ -# `PyFlyt/Fixedwing-Waypoints-v2` +# `PyFlyt/Fixedwing-Waypoints-v3` ```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/fixedwing_waypoint.gif :width: 50% @@ -14,7 +14,7 @@ The goal of this environment is to fly a fixedwing aircraft towards a set of way import gymnasium import PyFlyt.gym_envs -env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v3", render_mode="human") term, trunc = False, False obs, _ = env.reset() @@ -34,7 +34,7 @@ import gymnasium import PyFlyt.gym_envs from PyFlyt.gym_envs import FlattenWaypointEnv -env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/Fixedwing-Waypoints-v3", render_mode="human") env = FlattenWaypointEnv(env, context_length=2) term, trunc = False, False diff --git a/docs_source/documentation/gym_envs/quadx_hover_env.md b/docs_source/documentation/gym_envs/quadx_hover_env.md index 7fb3df7f..a6a14a93 100644 --- a/docs_source/documentation/gym_envs/quadx_hover_env.md +++ b/docs_source/documentation/gym_envs/quadx_hover_env.md @@ -1,4 +1,4 @@ -# `PyFlyt/QuadX-Hover-v2` +# `PyFlyt/QuadX-Hover-v3` ```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_hover.gif :width: 50% diff --git a/docs_source/documentation/gym_envs/quadx_pole_balance_env.md b/docs_source/documentation/gym_envs/quadx_pole_balance_env.md index be13772a..4f6cece1 100644 --- a/docs_source/documentation/gym_envs/quadx_pole_balance_env.md +++ b/docs_source/documentation/gym_envs/quadx_pole_balance_env.md @@ -1,4 +1,4 @@ -# `PyFlyt/QuadX-Pole-Balance-v2` +# `PyFlyt/QuadX-Pole-Balance-v3` ```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_pole_balance.gif :width: 50% @@ -14,7 +14,7 @@ The goal of this environment is to hover a quadrotor drone for as long as possib import gymnasium import PyFlyt.gym_envs -env = gymnasium.make("PyFlyt/QuadX-Pole-Balance-v2", render_mode="human") +env = gymnasium.make("PyFlyt/QuadX-Pole-Balance-v3", render_mode="human") term, trunc = False, False obs, _ = env.reset() diff --git a/docs_source/documentation/gym_envs/quadx_pole_waypoints_env.md b/docs_source/documentation/gym_envs/quadx_pole_waypoints_env.md index aa196539..7346a2f1 100644 --- a/docs_source/documentation/gym_envs/quadx_pole_waypoints_env.md +++ b/docs_source/documentation/gym_envs/quadx_pole_waypoints_env.md @@ -1,4 +1,4 @@ -# `PyFlyt/QuadX-Pole-Waypoints-v2` +# `PyFlyt/QuadX-Pole-Waypoints-v3` ```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_pole_waypoint.gif :width: 50% @@ -14,7 +14,7 @@ The goal of this environment is to fly a quadrotor aircraft towards a set of way import gymnasium import PyFlyt.gym_envs -env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v3", render_mode="human") term, trunc = False, False obs, _ = env.reset() @@ -34,7 +34,7 @@ import gymnasium import PyFlyt.gym_envs from PyFlyt.gym_envs import FlattenWaypointEnv -env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/QuadX-Pole-Waypoints-v3", render_mode="human") env = FlattenWaypointEnv(env, context_length=2) term, trunc = False, False diff --git a/docs_source/documentation/gym_envs/quadx_waypoints_env.md b/docs_source/documentation/gym_envs/quadx_waypoints_env.md index 10f66ead..aa8f0b56 100644 --- a/docs_source/documentation/gym_envs/quadx_waypoints_env.md +++ b/docs_source/documentation/gym_envs/quadx_waypoints_env.md @@ -1,4 +1,4 @@ -# `PyFlyt/QuadX-Waypoints-v2` +# `PyFlyt/QuadX-Waypoints-v3` ```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_waypoint.gif :width: 50% @@ -14,7 +14,7 @@ The goal of this environment is to fly a quadrotor aircraft towards a set of way import gymnasium import PyFlyt.gym_envs -env = gymnasium.make("PyFlyt/QuadX-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/QuadX-Waypoints-v3", render_mode="human") term, trunc = False, False obs, _ = env.reset() @@ -34,7 +34,7 @@ import gymnasium import PyFlyt.gym_envs from PyFlyt.gym_envs import FlattenWaypointEnv -env = gymnasium.make("PyFlyt/QuadX-Waypoints-v2", render_mode="human") +env = gymnasium.make("PyFlyt/QuadX-Waypoints-v3", render_mode="human") env = FlattenWaypointEnv(env, context_length=2) term, trunc = False, False diff --git a/docs_source/documentation/gym_envs/rocket_landing_env.md b/docs_source/documentation/gym_envs/rocket_landing_env.md index 3a2c956d..fa08f7ee 100644 --- a/docs_source/documentation/gym_envs/rocket_landing_env.md +++ b/docs_source/documentation/gym_envs/rocket_landing_env.md @@ -1,4 +1,4 @@ -# `PyFlyt/Rocket-Landing-v2` +# `PyFlyt/Rocket-Landing-v3` ```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/rocket_landing.gif :width: 50% @@ -14,7 +14,7 @@ The goal of this environment is to land a rocket falling at terminal velocity on import gymnasium import PyFlyt.gym_envs -env = gymnasium.make("PyFlyt/Rocket-Landing-v2", render_mode="human") +env = gymnasium.make("PyFlyt/Rocket-Landing-v3", render_mode="human") term, trunc = False, False obs, _ = env.reset() diff --git a/docs_source/documentation/pz_envs/ma_fixedwing_dogfight_env.md b/docs_source/documentation/pz_envs/ma_fixedwing_dogfight_env.md index 32e4015e..8ff00f5f 100644 --- a/docs_source/documentation/pz_envs/ma_fixedwing_dogfight_env.md +++ b/docs_source/documentation/pz_envs/ma_fixedwing_dogfight_env.md @@ -1,4 +1,4 @@ -# `MAFixedwingDogfightEnv` +# `MAFixedwingDogfightEnvV2` ```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/fixedwing_dogfight.gif :width: 50% @@ -11,9 +11,9 @@ This is a reinforcement learning environment for training AI agents to perform a ## Usage ```python -from PyFlyt.pz_envs import MAFixedwingDogfightEnv +from PyFlyt.pz_envs import MAFixedwingDogfightEnvV2 -env = MAFixedwingDogfightEnv(render_mode="human") +env = MAFixedwingDogfightEnvV2(render_mode="human") observations, infos = env.reset() while env.agents: diff --git a/docs_source/documentation/pz_envs/ma_quadx_hover_env.md b/docs_source/documentation/pz_envs/ma_quadx_hover_env.md index 6820c061..b44d6dd2 100644 --- a/docs_source/documentation/pz_envs/ma_quadx_hover_env.md +++ b/docs_source/documentation/pz_envs/ma_quadx_hover_env.md @@ -1,4 +1,4 @@ -# `MAQuadXHoverEnv` +# `MAQuadXHoverEnvV2` ```{figure} https://raw.githubusercontent.com/jjshoots/PyFlyt/master/readme_assets/quadx_hover.gif :width: 50% @@ -11,9 +11,9 @@ The goal of this environment is for all agents to hover at their starting positi ## Usage ```python -from PyFlyt.pz_envs import MAQuadXHoverEnv +from PyFlyt.pz_envs import MAQuadXHoverEnvV2 -env = MAQuadXHoverEnv(render_mode="human") +env = MAQuadXHoverEnvV2(render_mode="human") observations, infos = env.reset() while env.agents: diff --git a/tests/test_pz_envs.py b/tests/test_pz_envs.py index 1fcad0ea..d2ebcfe8 100644 --- a/tests/test_pz_envs.py +++ b/tests/test_pz_envs.py @@ -11,12 +11,12 @@ from pettingzoo.test import parallel_api_test from pettingzoo.test.seed_test import check_environment_deterministic_parallel -from PyFlyt.pz_envs import MAFixedwingDogfightEnv, MAQuadXHoverEnv +from PyFlyt.pz_envs import MAFixedwingDogfightEnvV2, MAQuadXHoverEnvV2 _QUADX_HOVER_ENVS = [] for env_class, angle_representation, sparse_reward in itertools.product( [ - MAQuadXHoverEnv, + MAQuadXHoverEnvV2, ], ["euler", "quaternion"], [True, False], @@ -39,7 +39,7 @@ sparse_reward, flatten_observation, ) in itertools.product( - [MAFixedwingDogfightEnv], + [MAFixedwingDogfightEnvV2], [1, 2, 3], [True, False], [True, False], From 5763a4e0330f4b9f07180699272c8b533ce7dc4d Mon Sep 17 00:00:00 2001 From: Jet Date: Sun, 4 Aug 2024 23:59:43 +0900 Subject: [PATCH 094/146] modify aircraft params --- PyFlyt/models/vehicles/acrowing/acrowing.yaml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/PyFlyt/models/vehicles/acrowing/acrowing.yaml b/PyFlyt/models/vehicles/acrowing/acrowing.yaml index d1b4ddae..f6b0795c 100644 --- a/PyFlyt/models/vehicles/acrowing/acrowing.yaml +++ b/PyFlyt/models/vehicles/acrowing/acrowing.yaml @@ -6,7 +6,7 @@ motor_params: tau: 0.01 main_wing_params: - Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil + Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 1.6 flap_to_chord: 0.1 # 10% of chord @@ -19,7 +19,7 @@ main_wing_params: tau: 0.05 left_wing_flapped_params: - Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil + Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord @@ -28,11 +28,11 @@ left_wing_flapped_params: alpha_stall_P_base: 16 # Positive stall AoA alpha_stall_N_base: -12 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient - deflection_limit: 40 # Control surface deflection limit in degrees + deflection_limit: 45 # Control surface deflection limit in degrees tau: 0.05 right_wing_flapped_params: - Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil + Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord @@ -41,27 +41,27 @@ right_wing_flapped_params: alpha_stall_P_base: 16 # Positive stall AoA alpha_stall_N_base: -12 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient - deflection_limit: 40 # Control surface deflection limit in degrees + deflection_limit: 45 # Control surface deflection limit in degrees tau: 0.05 horizontal_tail_params: - Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil + Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.8 - flap_to_chord: 0.5 # 40% of chord + flap_to_chord: 0.6 # 60% of chord eta: 0.65 # Correction factor for viscosity effects (An average obtained from pg 112) alpha_0_base: 0 # 2D dCl_dalpha X-intercept alpha_stall_P_base: 11 # Positive stall AoA alpha_stall_N_base: -11 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient - deflection_limit: 35 # Control surface deflection limit in degrees + deflection_limit: 45 # Control surface deflection limit in degrees tau: 0.05 vertical_tail_params: - Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil + Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil chord: 0.4 # meters span: 0.4 - flap_to_chord: 0.4 # 30% of chord + flap_to_chord: 0.4 # 40% of chord eta: 0.65 # Correction factor for viscosity effects (An average obtained from pg 112) alpha_0_base: 0 # 2D dCl_dalpha X-intercept alpha_stall_P_base: 11 # Positive stall AoA From 395a3a7c47d86e3cbca21f5bfcf65ddb50fc7c2b Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 10:38:12 +0900 Subject: [PATCH 095/146] less aggressive change --- PyFlyt/models/vehicles/acrowing/acrowing.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PyFlyt/models/vehicles/acrowing/acrowing.yaml b/PyFlyt/models/vehicles/acrowing/acrowing.yaml index f6b0795c..e5bbc557 100644 --- a/PyFlyt/models/vehicles/acrowing/acrowing.yaml +++ b/PyFlyt/models/vehicles/acrowing/acrowing.yaml @@ -6,7 +6,7 @@ motor_params: tau: 0.01 main_wing_params: - Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 1.6 flap_to_chord: 0.1 # 10% of chord @@ -19,7 +19,7 @@ main_wing_params: tau: 0.05 left_wing_flapped_params: - Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord @@ -32,7 +32,7 @@ left_wing_flapped_params: tau: 0.05 right_wing_flapped_params: - Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord @@ -45,10 +45,10 @@ right_wing_flapped_params: tau: 0.05 horizontal_tail_params: - Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.8 - flap_to_chord: 0.6 # 60% of chord + flap_to_chord: 0.5 # 40% of chord eta: 0.65 # Correction factor for viscosity effects (An average obtained from pg 112) alpha_0_base: 0 # 2D dCl_dalpha X-intercept alpha_stall_P_base: 11 # Positive stall AoA @@ -58,7 +58,7 @@ horizontal_tail_params: tau: 0.05 vertical_tail_params: - Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.4 # meters span: 0.4 flap_to_chord: 0.4 # 40% of chord From de33ecb6fb5f52da746cec3c44775d2270bc96da Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 13:20:53 +0900 Subject: [PATCH 096/146] tweak aircraft params --- PyFlyt/models/vehicles/acrowing/acrowing.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PyFlyt/models/vehicles/acrowing/acrowing.yaml b/PyFlyt/models/vehicles/acrowing/acrowing.yaml index e5bbc557..8cb727db 100644 --- a/PyFlyt/models/vehicles/acrowing/acrowing.yaml +++ b/PyFlyt/models/vehicles/acrowing/acrowing.yaml @@ -6,7 +6,7 @@ motor_params: tau: 0.01 main_wing_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 1.6 flap_to_chord: 0.1 # 10% of chord @@ -19,7 +19,7 @@ main_wing_params: tau: 0.05 left_wing_flapped_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord @@ -32,7 +32,7 @@ left_wing_flapped_params: tau: 0.05 right_wing_flapped_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord @@ -45,7 +45,7 @@ right_wing_flapped_params: tau: 0.05 horizontal_tail_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.8 flap_to_chord: 0.5 # 40% of chord @@ -58,7 +58,7 @@ horizontal_tail_params: tau: 0.05 vertical_tail_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Half of average value for a 2D aerofoil chord: 0.4 # meters span: 0.4 flap_to_chord: 0.4 # 40% of chord From a6b78f2b1f5b700c990cb339062166400360b405 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 13:31:33 +0900 Subject: [PATCH 097/146] tweak params more --- PyFlyt/models/vehicles/acrowing/acrowing.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PyFlyt/models/vehicles/acrowing/acrowing.yaml b/PyFlyt/models/vehicles/acrowing/acrowing.yaml index 8cb727db..e5bbc557 100644 --- a/PyFlyt/models/vehicles/acrowing/acrowing.yaml +++ b/PyFlyt/models/vehicles/acrowing/acrowing.yaml @@ -6,7 +6,7 @@ motor_params: tau: 0.01 main_wing_params: - Cl_alpha_2D: 2.0 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 1.6 flap_to_chord: 0.1 # 10% of chord @@ -19,7 +19,7 @@ main_wing_params: tau: 0.05 left_wing_flapped_params: - Cl_alpha_2D: 6.283 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord @@ -32,7 +32,7 @@ left_wing_flapped_params: tau: 0.05 right_wing_flapped_params: - Cl_alpha_2D: 6.283 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord @@ -45,7 +45,7 @@ right_wing_flapped_params: tau: 0.05 horizontal_tail_params: - Cl_alpha_2D: 6.283 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.3 # meters span: 0.8 flap_to_chord: 0.5 # 40% of chord @@ -58,7 +58,7 @@ horizontal_tail_params: tau: 0.05 vertical_tail_params: - Cl_alpha_2D: 6.283 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil chord: 0.4 # meters span: 0.4 flap_to_chord: 0.4 # 40% of chord From af82c07430cf8beb8875389035705ffcfb1f05ea Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 13:41:02 +0900 Subject: [PATCH 098/146] less aggressive changes --- PyFlyt/models/vehicles/acrowing/acrowing.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PyFlyt/models/vehicles/acrowing/acrowing.yaml b/PyFlyt/models/vehicles/acrowing/acrowing.yaml index e5bbc557..523735ca 100644 --- a/PyFlyt/models/vehicles/acrowing/acrowing.yaml +++ b/PyFlyt/models/vehicles/acrowing/acrowing.yaml @@ -6,7 +6,7 @@ motor_params: tau: 0.01 main_wing_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.3 # meters span: 1.6 flap_to_chord: 0.1 # 10% of chord @@ -19,12 +19,12 @@ main_wing_params: tau: 0.05 left_wing_flapped_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord eta: 0.65 # Correction factor for viscosity effects (An average obtained from pg 112) - alpha_0_base: -2 # 2D dCl_dalpha X-intercept + alpha_0_base: 0 # 2D dCl_dalpha X-intercept alpha_stall_P_base: 16 # Positive stall AoA alpha_stall_N_base: -12 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient @@ -32,12 +32,12 @@ left_wing_flapped_params: tau: 0.05 right_wing_flapped_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.3 # meters span: 0.3 flap_to_chord: 0.3 # 30% of chord eta: 0.65 # Correction factor for viscosity effects (An average obtained from pg 112) - alpha_0_base: -2 # 2D dCl_dalpha X-intercept + alpha_0_base: 0 # 2D dCl_dalpha X-intercept alpha_stall_P_base: 16 # Positive stall AoA alpha_stall_N_base: -12 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient @@ -45,7 +45,7 @@ right_wing_flapped_params: tau: 0.05 horizontal_tail_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.3 # meters span: 0.8 flap_to_chord: 0.5 # 40% of chord @@ -54,11 +54,11 @@ horizontal_tail_params: alpha_stall_P_base: 11 # Positive stall AoA alpha_stall_N_base: -11 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient - deflection_limit: 45 # Control surface deflection limit in degrees + deflection_limit: 30 # Control surface deflection limit in degrees tau: 0.05 vertical_tail_params: - Cl_alpha_2D: 3.142 # Half of average value for a 2D aerofoil + Cl_alpha_2D: 6.283 # Average value for a 2D aerofoil chord: 0.4 # meters span: 0.4 flap_to_chord: 0.4 # 40% of chord From b9b844b93391f83b02e11113896f8ecaccc04c0d Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 13:41:30 +0900 Subject: [PATCH 099/146] bake in aggressiveness score --- PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py index d91f24c7..11f3c1dc 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py @@ -43,7 +43,7 @@ def __init__( lethal_distance: float = 20.0, lethal_angle_radians: float = 0.07, assisted_flight: bool = True, - aggressiveness: float = 0.8, + aggressiveness: float = 0.35, cooperativeness: float = 0.5, sparse_reward: bool = False, flatten_observation: bool = True, From c4bd43a3080002f320a79223a5918ad8cf5857b9 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 14:06:28 +0900 Subject: [PATCH 100/146] precommit --- PyFlyt/pz_envs/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PyFlyt/pz_envs/__init__.py b/PyFlyt/pz_envs/__init__.py index a8bcf20d..d72b1192 100644 --- a/PyFlyt/pz_envs/__init__.py +++ b/PyFlyt/pz_envs/__init__.py @@ -1,4 +1,6 @@ """Imports all PZ envs.""" -from .fixedwing_envs.ma_fixedwing_dogfight_env import MAFixedwingDogfightEnv as MAFixedwingDogfightEnvV2 +from .fixedwing_envs.ma_fixedwing_dogfight_env import ( + MAFixedwingDogfightEnv as MAFixedwingDogfightEnvV2, +) from .quadx_envs.ma_quadx_hover_env import MAQuadXHoverEnv as MAQuadXHoverEnvV2 From ceddd3d7ea7ea4d4e1b1c7dddeeea0ef869f336b Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 19:33:37 +0900 Subject: [PATCH 101/146] use codecov? --- .github/workflows/codecov.yml | 4 ++++ readme.md | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/codecov.yml diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml new file mode 100644 index 00000000..9e7c757e --- /dev/null +++ b/.github/workflows/codecov.yml @@ -0,0 +1,4 @@ +- name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/readme.md b/readme.md index 688be41b..c2d4ad1b 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,10 @@ +# PyFlyt - UAV Flight Simulator for Reinforcement Learning Research + +![PyPI - Version](https://img.shields.io/pypi/v/PyFlyt) +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![total downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=total&units=international_system&left_color=grey&right_color=green&left_text=total%20downloads)](https://pepy.tech/project/pyflyt) [![weekly downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=week&units=international_system&left_color=grey&right_color=green&left_text=weekly%20downloads)](https://pepy.tech/project/pyflyt) -# PyFlyt - UAV Flight Simulator for Reinforcement Learning Research Comes with Gymnasium and PettingZoo environments built in! From d7a33a92309075c1c9c0760c801c5a736b4c465e Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 19:34:51 +0900 Subject: [PATCH 102/146] bump gymnasium version in tests --- tests/test_gym_envs.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_gym_envs.py b/tests/test_gym_envs.py index df8e6876..37b589a6 100644 --- a/tests/test_gym_envs.py +++ b/tests/test_gym_envs.py @@ -16,9 +16,9 @@ _WAYPOINT_ENV_CONFIGS = [] for env_name, angle_representation, sparse_reward in itertools.product( [ - "PyFlyt/QuadX-Waypoints-v2", - "PyFlyt/QuadX-Pole-Waypoints-v2", - "PyFlyt/Fixedwing-Waypoints-v2", + "PyFlyt/QuadX-Waypoints-v3", + "PyFlyt/QuadX-Pole-Waypoints-v3", + "PyFlyt/Fixedwing-Waypoints-v3", ], ["euler", "quaternion"], [True, False], @@ -37,9 +37,9 @@ _NORMAL_ENV_CONFIGS = [] for env_name, angle_representation, sparse_reward in itertools.product( [ - "PyFlyt/QuadX-Hover-v2", - "PyFlyt/QuadX-Pole-Balance-v2", - "PyFlyt/Rocket-Landing-v2", + "PyFlyt/QuadX-Hover-v3", + "PyFlyt/QuadX-Pole-Balance-v3", + "PyFlyt/Rocket-Landing-v3", ], ["euler", "quaternion"], [True, False], From 5dd2cde70bd09578aab3a2ee3cbf069335131e7e Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 19:37:18 +0900 Subject: [PATCH 103/146] update sheild --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index c2d4ad1b..5da9e675 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # PyFlyt - UAV Flight Simulator for Reinforcement Learning Research -![PyPI - Version](https://img.shields.io/pypi/v/PyFlyt) +[![PyPI - Version](https://img.shields.io/pypi/v/panda-gym.svg?logo=pypi&logoColor=FFE873)](https://img.shields.io/pypi/v/PyFlyt) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![total downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=total&units=international_system&left_color=grey&right_color=green&left_text=total%20downloads)](https://pepy.tech/project/pyflyt) [![weekly downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=week&units=international_system&left_color=grey&right_color=green&left_text=weekly%20downloads)](https://pepy.tech/project/pyflyt) From 51a6cab1832e2ca3a92d855f4eeadf80522a0737 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 19:38:15 +0900 Subject: [PATCH 104/146] update shield --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 5da9e675..ba04310a 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # PyFlyt - UAV Flight Simulator for Reinforcement Learning Research -[![PyPI - Version](https://img.shields.io/pypi/v/panda-gym.svg?logo=pypi&logoColor=FFE873)](https://img.shields.io/pypi/v/PyFlyt) +[![PyPI - Version](https://img.shields.io/pypi/v/PyFlyt.svg?logo=pypi&logoColor=FFE873)](https://img.shields.io/pypi/v/PyFlyt) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![total downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=total&units=international_system&left_color=grey&right_color=green&left_text=total%20downloads)](https://pepy.tech/project/pyflyt) [![weekly downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=week&units=international_system&left_color=grey&right_color=green&left_text=weekly%20downloads)](https://pepy.tech/project/pyflyt) From 73d9fdcddc70389f572e40f7ec1c8bad9fe2ed38 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 19:39:13 +0900 Subject: [PATCH 105/146] add codecov badge --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index ba04310a..35bdd8ea 100644 --- a/readme.md +++ b/readme.md @@ -2,6 +2,7 @@ [![PyPI - Version](https://img.shields.io/pypi/v/PyFlyt.svg?logo=pypi&logoColor=FFE873)](https://img.shields.io/pypi/v/PyFlyt) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![codecov](https://codecov.io/github/jjshoots/PyFlyt/graph/badge.svg?token=4RP08UIPIF)](https://codecov.io/github/jjshoots/PyFlyt) [![total downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=total&units=international_system&left_color=grey&right_color=green&left_text=total%20downloads)](https://pepy.tech/project/pyflyt) [![weekly downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=week&units=international_system&left_color=grey&right_color=green&left_text=weekly%20downloads)](https://pepy.tech/project/pyflyt) From 787da9746245568026f8516988d3033604a27139 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 19:47:05 +0900 Subject: [PATCH 106/146] delete redundant file --- .github/workflows/codecov.yml | 4 ---- .github/workflows/linux-test.yml | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 .github/workflows/codecov.yml diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml deleted file mode 100644 index 9e7c757e..00000000 --- a/.github/workflows/codecov.yml +++ /dev/null @@ -1,4 +0,0 @@ -- name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v4.0.1 - with: - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/linux-test.yml b/.github/workflows/linux-test.yml index 6947e30a..d133acfb 100644 --- a/.github/workflows/linux-test.yml +++ b/.github/workflows/linux-test.yml @@ -29,3 +29,7 @@ jobs: - name: Release Test run: | xvfb-run -s "-screen 0 1024x768x24" pytest tests/*.py -vvv + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} From a95b50ebaca8854449342c3a6b0166d4cfa1f09f Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 19:54:01 +0900 Subject: [PATCH 107/146] add codecov --- pyproject.toml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5206ae7d..0b2415ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,13 @@ keywords = ["Reinforcement Learning", "UAVs", "drones", "Quadcopter", "AI", "RL" license = { file="./LICENSE.txt" } [project.optional-dependencies] -dev = ["pytest", "pre-commit", "matplotlib"] +dev = [ + "pytest", + "pytest-cov", + "codecov", + "pre-commit", + "matplotlib", +] [tool.setuptools] include-package-data = true From 8263b33b46614921f619d7384d0a323df94bf76c Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 20:08:44 +0900 Subject: [PATCH 108/146] forgot coverage --- .github/workflows/linux-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linux-test.yml b/.github/workflows/linux-test.yml index d133acfb..e28aebe5 100644 --- a/.github/workflows/linux-test.yml +++ b/.github/workflows/linux-test.yml @@ -28,7 +28,7 @@ jobs: pip install .[dev] - name: Release Test run: | - xvfb-run -s "-screen 0 1024x768x24" pytest tests/*.py -vvv + xvfb-run -s "-screen 0 1024x768x24" pytest --cov tests/*.py -vvv - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4.0.1 with: From 906dd97fa114a09aabc6a65a61ba2a9ce64874a1 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 20:12:28 +0900 Subject: [PATCH 109/146] bake in aggressiveness a bit more --- PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py index 11f3c1dc..2ef42f5c 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py @@ -43,7 +43,7 @@ def __init__( lethal_distance: float = 20.0, lethal_angle_radians: float = 0.07, assisted_flight: bool = True, - aggressiveness: float = 0.35, + aggressiveness: float = 0.4, cooperativeness: float = 0.5, sparse_reward: bool = False, flatten_observation: bool = True, From ca908c641c4c41609938fc23c7b973fede1b6eb0 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 5 Aug 2024 23:12:32 +0900 Subject: [PATCH 110/146] set camera for fixedwing envs --- PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py index d8ac6500..82d0601c 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_base_env.py @@ -210,6 +210,14 @@ def begin_reset( world_scale=5.0, ) + # reset the camera position to a sane place + self.aviary.resetDebugVisualizerCamera( + cameraDistance=50, + cameraYaw=30, + cameraPitch=-30, + cameraTargetPosition=[0, 0, 1], + ) + def end_reset( self, seed: None | int = None, options: None | dict[str, Any] = dict() ) -> None: From 50d238de8848ac12445dbe31690b93e3faf10ea4 Mon Sep 17 00:00:00 2001 From: Jet Date: Wed, 7 Aug 2024 23:39:15 +0900 Subject: [PATCH 111/146] adjust shape --- .../ma_fixedwing_dogfight_env.py | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py index 2ef42f5c..b0de408e 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py @@ -114,30 +114,33 @@ def __init__( ) # observation_space - self._observation_space = spaces.Dict( - { - # base + health - "self": spaces.Box( - low=-np.inf, - high=np.inf, - shape=(self_space_shape := (self.combined_space.shape[0] + 1),), - dtype=np.float64, - ), - # attitude + health + team_mask - "others": spaces.Sequence( - space=spaces.Box( + self_space_shape = (self.combined_space.shape[0] + 1,) + others_space_shape = (12 + 1 + 1,) + if not flatten_observation: + self._observation_space = spaces.Dict( + { + # base + health + "self": spaces.Box( low=-np.inf, high=np.inf, - shape=(others_space_shape := (12 + 1 + 1),), + shape=self_space_shape, dtype=np.float64, ), - stack=True, - ), - } - ) + # attitude + health + team_mask + "others": spaces.Sequence( + space=spaces.Box( + low=-np.inf, + high=np.inf, + shape=others_space_shape, + dtype=np.float64, + ), + stack=True, + ), + } + ) # if flatten observation, then it's just a big box - if flatten_observation: + else: self._observation_space = spaces.Box( low=-np.inf, high=np.inf, From 3d82f51fa4127d320754b049e2b7b587de819515 Mon Sep 17 00:00:00 2001 From: Jet Date: Wed, 7 Aug 2024 23:40:54 +0900 Subject: [PATCH 112/146] fix space logic --- .../fixedwing_envs/ma_fixedwing_dogfight_env.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py index b0de408e..32de3abf 100644 --- a/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py +++ b/PyFlyt/pz_envs/fixedwing_envs/ma_fixedwing_dogfight_env.py @@ -114,8 +114,8 @@ def __init__( ) # observation_space - self_space_shape = (self.combined_space.shape[0] + 1,) - others_space_shape = (12 + 1 + 1,) + self_space_shape = self.combined_space.shape[0] + 1 + others_space_shape = 12 + 1 + 1 if not flatten_observation: self._observation_space = spaces.Dict( { @@ -123,7 +123,7 @@ def __init__( "self": spaces.Box( low=-np.inf, high=np.inf, - shape=self_space_shape, + shape=(self_space_shape,), dtype=np.float64, ), # attitude + health + team_mask @@ -131,15 +131,13 @@ def __init__( space=spaces.Box( low=-np.inf, high=np.inf, - shape=others_space_shape, + shape=(others_space_shape,), dtype=np.float64, ), stack=True, ), } ) - - # if flatten observation, then it's just a big box else: self._observation_space = spaces.Box( low=-np.inf, From 0a18c466d5b3dbecffd84ca75382a066cef343f4 Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 9 Aug 2024 12:28:25 +0900 Subject: [PATCH 113/146] update readme --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index 35bdd8ea..fc2db97d 100644 --- a/readme.md +++ b/readme.md @@ -12,6 +12,10 @@ Comes with Gymnasium and PettingZoo environments built in!

    + + + + #### [View the documentation here!](https://jjshoots.github.io/PyFlyt/documentation.html) From c6e0d3ae58ac05edf6b5fd707390f341fb0accd6 Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 9 Aug 2024 12:30:18 +0900 Subject: [PATCH 114/146] test --- readme.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index fc2db97d..ade681df 100644 --- a/readme.md +++ b/readme.md @@ -12,10 +12,12 @@ Comes with Gymnasium and PettingZoo environments built in!

    - - - - +

    + + + + +

    #### [View the documentation here!](https://jjshoots.github.io/PyFlyt/documentation.html) From 082e351f594d5c11b6b41dcb0295c1e01ad03a3c Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 9 Aug 2024 12:30:50 +0900 Subject: [PATCH 115/146] change sizes --- readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index ade681df..68b7c464 100644 --- a/readme.md +++ b/readme.md @@ -13,10 +13,10 @@ Comes with Gymnasium and PettingZoo environments built in!

    - - - - + + + +

    #### [View the documentation here!](https://jjshoots.github.io/PyFlyt/documentation.html) From 6c3c64c76ce67b8307fbac40d44df39e604cc387 Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 9 Aug 2024 12:31:34 +0900 Subject: [PATCH 116/146] update sizes --- readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index 68b7c464..08de36a2 100644 --- a/readme.md +++ b/readme.md @@ -13,10 +13,10 @@ Comes with Gymnasium and PettingZoo environments built in!

    - - - - + + + +

    #### [View the documentation here!](https://jjshoots.github.io/PyFlyt/documentation.html) From df9f68b3c7288b3ec99c343e7bd389f2a6eb72f3 Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 9 Aug 2024 12:32:37 +0900 Subject: [PATCH 117/146] test --- readme.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index 08de36a2..74bb9f8c 100644 --- a/readme.md +++ b/readme.md @@ -11,12 +11,14 @@ Comes with Gymnasium and PettingZoo environments built in!

    -

    -

    - - - - +

    + + +

    +

    + + +

    #### [View the documentation here!](https://jjshoots.github.io/PyFlyt/documentation.html) From 13ea5528a73ec3d23a0ab8cd3bbac27f54875caf Mon Sep 17 00:00:00 2001 From: Jet <38184875+jjshoots@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:46:46 +0900 Subject: [PATCH 118/146] Update readme.md --- readme.md | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/readme.md b/readme.md index 74bb9f8c..fe13b612 100644 --- a/readme.md +++ b/readme.md @@ -1,24 +1,9 @@ -# PyFlyt - UAV Flight Simulator for Reinforcement Learning Research - -[![PyPI - Version](https://img.shields.io/pypi/v/PyFlyt.svg?logo=pypi&logoColor=FFE873)](https://img.shields.io/pypi/v/PyFlyt) -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) -[![codecov](https://codecov.io/github/jjshoots/PyFlyt/graph/badge.svg?token=4RP08UIPIF)](https://codecov.io/github/jjshoots/PyFlyt) -[![total downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=total&units=international_system&left_color=grey&right_color=green&left_text=total%20downloads)](https://pepy.tech/project/pyflyt) -[![weekly downloads](https://static.pepy.tech/personalized-badge/pyflyt?period=week&units=international_system&left_color=grey&right_color=green&left_text=weekly%20downloads)](https://pepy.tech/project/pyflyt) - +# PyFlyt - UAV Flight Simulator for Reinforcement Learning Comes with Gymnasium and PettingZoo environments built in!

    - -

    - - -

    -

    - - -

    +

    #### [View the documentation here!](https://jjshoots.github.io/PyFlyt/documentation.html) @@ -88,3 +73,14 @@ If you use our work in your research and would like to cite it, please use the f year={2023} } ``` + +## Gallery + +

    + + +

    +

    + + +

    From 558c314078bfe23a71f3b2c7c674119c50df1489 Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 9 Aug 2024 12:59:10 +0900 Subject: [PATCH 119/146] update docs --- .../documentation/core/drones/fixedwing.md.txt | 13 +++++++++++-- docs/documentation/core/drones.html | 1 + docs/documentation/core/drones/fixedwing.html | 18 ++++++++++++++++-- .../pz_envs/ma_fixedwing_dogfight_env.html | 2 +- docs/searchindex.js | 2 +- .../documentation/core/drones/fixedwing.md | 13 +++++++++++-- 6 files changed, 41 insertions(+), 8 deletions(-) diff --git a/docs/_sources/documentation/core/drones/fixedwing.md.txt b/docs/_sources/documentation/core/drones/fixedwing.md.txt index 84c536d0..a2db5fe5 100644 --- a/docs/_sources/documentation/core/drones/fixedwing.md.txt +++ b/docs/_sources/documentation/core/drones/fixedwing.md.txt @@ -4,10 +4,19 @@ Small tube-and-wing fixed wing UAV with a single motor (~2.5 Kg). +## Variants + +Two different models of the QuadX drone are provided. +This option can be selected through the `drone_model` parameter. +The available models are: + +- `fixedwing` (default) +- `acrowing` + - A more aggressive aircraft with higher thrust:weight ratio, bigger flight and control surfaces, and a trailing edge flap. + ## Control Mode -Only one control mode is provided. -Setpoints are mapped directly to `[pitch, roll, yaw, thrust]` actuator commands. +Two modes are available and documented [below](https://taijunjet.com/PyFlyt/documentation/core/drones/fixedwing.html#PyFlyt.core.drones.Fixedwing.set_mode). ## Class Description ```{eval-rst} diff --git a/docs/documentation/core/drones.html b/docs/documentation/core/drones.html index 6b36581b..6a08defe 100644 --- a/docs/documentation/core/drones.html +++ b/docs/documentation/core/drones.html @@ -396,6 +396,7 @@

    Overview
    • Fixedwing
      • Model Description
      • +
      • Variants
      • Control Mode
      • Class Description
        • Fixedwing
            diff --git a/docs/documentation/core/drones/fixedwing.html b/docs/documentation/core/drones/fixedwing.html index a721aa6e..86002754 100644 --- a/docs/documentation/core/drones/fixedwing.html +++ b/docs/documentation/core/drones/fixedwing.html @@ -397,10 +397,23 @@

            Fixedwing#

            Small tube-and-wing fixed wing UAV with a single motor (~2.5 Kg).

    +
    +

    Variants#

    +

    Two different models of the QuadX drone are provided. +This option can be selected through the drone_model parameter. +The available models are:

    +
      +
    • fixedwing (default)

    • +
    • acrowing

      +
        +
      • A more aggressive aircraft with higher thrust:weight ratio, bigger flight and control surfaces, and a trailing edge flap.

      • +
      +
    • +
    +

    Control Mode#

    -

    Only one control mode is provided. -Setpoints are mapped directly to [pitch, roll, yaw, thrust] actuator commands.

    +

    Two modes are available and documented below.

    Class Description#

    @@ -501,6 +514,7 @@

    Class Description

    diff --git a/docs/documentation/core.html b/docs/documentation/core.html index 07028b6e..831aa0d6 100644 --- a/docs/documentation/core.html +++ b/docs/documentation/core.html @@ -529,7 +529,7 @@

    Axis Conventions

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/abstractions.html b/docs/documentation/core/abstractions.html index 8c7ed4db..d9d5b201 100644 --- a/docs/documentation/core/abstractions.html +++ b/docs/documentation/core/abstractions.html @@ -484,7 +484,7 @@

    Usage#< diff --git a/docs/documentation/core/abstractions/base_drone.html b/docs/documentation/core/abstractions/base_drone.html index 1da250e9..2070aea5 100644 --- a/docs/documentation/core/abstractions/base_drone.html +++ b/docs/documentation/core/abstractions/base_drone.html @@ -845,7 +845,7 @@

    Optional Methods

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/abstractions/boosters.html b/docs/documentation/core/abstractions/boosters.html index 5fd2e978..76ef0a16 100644 --- a/docs/documentation/core/abstractions/boosters.html +++ b/docs/documentation/core/abstractions/boosters.html @@ -581,7 +581,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/abstractions/boring_bodies.html b/docs/documentation/core/abstractions/boring_bodies.html index cd91b07c..d4768743 100644 --- a/docs/documentation/core/abstractions/boring_bodies.html +++ b/docs/documentation/core/abstractions/boring_bodies.html @@ -550,7 +550,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/abstractions/camera.html b/docs/documentation/core/abstractions/camera.html index 869fcb09..6542aa21 100644 --- a/docs/documentation/core/abstractions/camera.html +++ b/docs/documentation/core/abstractions/camera.html @@ -566,7 +566,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/abstractions/gimbals.html b/docs/documentation/core/abstractions/gimbals.html index d4a2b7a9..8c66e0c6 100644 --- a/docs/documentation/core/abstractions/gimbals.html +++ b/docs/documentation/core/abstractions/gimbals.html @@ -556,7 +556,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/abstractions/lifting_surfaces.html b/docs/documentation/core/abstractions/lifting_surfaces.html index ea9e4e31..bca4b5c2 100644 --- a/docs/documentation/core/abstractions/lifting_surfaces.html +++ b/docs/documentation/core/abstractions/lifting_surfaces.html @@ -626,7 +626,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/abstractions/motors.html b/docs/documentation/core/abstractions/motors.html index 497fabaa..d7b7236e 100644 --- a/docs/documentation/core/abstractions/motors.html +++ b/docs/documentation/core/abstractions/motors.html @@ -560,7 +560,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/aviary.html b/docs/documentation/core/aviary.html index c3d553a5..71bd0dfd 100644 --- a/docs/documentation/core/aviary.html +++ b/docs/documentation/core/aviary.html @@ -941,7 +941,7 @@

    Methods#< diff --git a/docs/documentation/core/drones.html b/docs/documentation/core/drones.html index 354853b1..b2b64ce5 100644 --- a/docs/documentation/core/drones.html +++ b/docs/documentation/core/drones.html @@ -525,7 +525,7 @@

    Overview diff --git a/docs/documentation/core/drones/fixedwing.html b/docs/documentation/core/drones/fixedwing.html index 48205603..1a2c04c7 100644 --- a/docs/documentation/core/drones/fixedwing.html +++ b/docs/documentation/core/drones/fixedwing.html @@ -576,7 +576,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/drones/quadx.html b/docs/documentation/core/drones/quadx.html index 09fd62fc..ded5c4dd 100644 --- a/docs/documentation/core/drones/quadx.html +++ b/docs/documentation/core/drones/quadx.html @@ -600,7 +600,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/drones/rocket.html b/docs/documentation/core/drones/rocket.html index 93cf70fb..fa0984d5 100644 --- a/docs/documentation/core/drones/rocket.html +++ b/docs/documentation/core/drones/rocket.html @@ -583,7 +583,7 @@

    Class Description

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/core/wind.html b/docs/documentation/core/wind.html index 62bb86c7..69dd51c5 100644 --- a/docs/documentation/core/wind.html +++ b/docs/documentation/core/wind.html @@ -604,7 +604,7 @@

    Required Methods

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/gym_envs.html b/docs/documentation/gym_envs.html index 063bbcfa..6a0093b9 100644 --- a/docs/documentation/gym_envs.html +++ b/docs/documentation/gym_envs.html @@ -466,7 +466,7 @@

    Gymnasium Environments

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/gym_envs/fixedwing_waypoints_env.html b/docs/documentation/gym_envs/fixedwing_waypoints_env.html index dba43adb..5001e2f8 100644 --- a/docs/documentation/gym_envs/fixedwing_waypoints_env.html +++ b/docs/documentation/gym_envs/fixedwing_waypoints_env.html @@ -535,7 +535,7 @@

    Environment Options

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/gym_envs/quadx_ball_in_cup_env.html b/docs/documentation/gym_envs/quadx_ball_in_cup_env.html index 2621d092..9d2ee496 100644 --- a/docs/documentation/gym_envs/quadx_ball_in_cup_env.html +++ b/docs/documentation/gym_envs/quadx_ball_in_cup_env.html @@ -515,7 +515,7 @@

    Environment Options

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/gym_envs/quadx_hover_env.html b/docs/documentation/gym_envs/quadx_hover_env.html index 0d54ef38..fed9cc9a 100644 --- a/docs/documentation/gym_envs/quadx_hover_env.html +++ b/docs/documentation/gym_envs/quadx_hover_env.html @@ -512,7 +512,7 @@

    Environment Options

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/gym_envs/quadx_pole_balance_env.html b/docs/documentation/gym_envs/quadx_pole_balance_env.html index 77f475a4..9c7576e0 100644 --- a/docs/documentation/gym_envs/quadx_pole_balance_env.html +++ b/docs/documentation/gym_envs/quadx_pole_balance_env.html @@ -512,7 +512,7 @@

    Environment Options

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/gym_envs/quadx_pole_waypoints_env.html b/docs/documentation/gym_envs/quadx_pole_waypoints_env.html index 7b1a525d..43130411 100644 --- a/docs/documentation/gym_envs/quadx_pole_waypoints_env.html +++ b/docs/documentation/gym_envs/quadx_pole_waypoints_env.html @@ -535,7 +535,7 @@

    Environment Options

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/gym_envs/quadx_waypoints_env.html b/docs/documentation/gym_envs/quadx_waypoints_env.html index dfba3b57..71e57a59 100644 --- a/docs/documentation/gym_envs/quadx_waypoints_env.html +++ b/docs/documentation/gym_envs/quadx_waypoints_env.html @@ -537,7 +537,7 @@

    Environment Options

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/gym_envs/rocket_landing_env.html b/docs/documentation/gym_envs/rocket_landing_env.html index d3dc7c09..fd87c9ec 100644 --- a/docs/documentation/gym_envs/rocket_landing_env.html +++ b/docs/documentation/gym_envs/rocket_landing_env.html @@ -512,7 +512,7 @@

    Environment Options

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/pz_envs.html b/docs/documentation/pz_envs.html index 0df1aa2c..67e0d6dc 100644 --- a/docs/documentation/pz_envs.html +++ b/docs/documentation/pz_envs.html @@ -467,7 +467,7 @@

    PettingZoo Environments

    - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

    diff --git a/docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html b/docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html index 12fe6b4f..67424614 100644 --- a/docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html +++ b/docs/documentation/pz_envs/ma_fixedwing_dogfight_env.html @@ -429,15 +429,20 @@

    Environment Rules#

    -class PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env.MAFixedwingDogfightEnv(team_size: int = 2, spawn_radius: float = 10.0, spawn_height: float = 20.0, damage_per_hit: float = 0.01, lethal_distance: float = 20.0, lethal_angle_radians: float = 0.07, assisted_flight: bool = True, aggressiveness: float = 0.4, cooperativeness: float = 0.5, sparse_reward: bool = False, flatten_observation: bool = True, flight_dome_size: float = 500.0, max_duration_seconds: float = 60.0, agent_hz: int = 30, render_mode: None | str = None)#
    +class PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env.MAFixedwingDogfightEnv(team_size: int = 2, spawn_min_radius: float = 10.0, spawn_max_radius: float = 50.0, spawn_min_height: float = 20.0, spawn_max_height: float = 50.0, damage_per_hit: float = 0.003, lethal_distance: float = 20.0, lethal_angle_radians: float = 0.07, assisted_flight: bool = True, aggressiveness: float = 0.5, cooperativeness: float = 0.5, sparse_reward: bool = False, flatten_observation: bool = True, flight_dome_size: float = 800.0, max_duration_seconds: float = 60.0, agent_hz: int = 30, render_mode: None | str = None)#

    Team Dogfighting Environment for the Acrowing model using the PettingZoo API.

    Parameters:
      -
    • spawn_height (float) – how high to spawn the agents at the beginning of the simulation.

    • +
    • team_size (int) – number of planes that comprises a team.

    • +
    • spawn_min_radius (float) – agents are spawned in a circle pointing outwards, this value is the min radius of that circle.

    • +
    • spawn_max_radius (float) – agents are spawned in a circle pointing outwards, this value is the maxradius of that circle.

    • +
    • spawn_min_height (float) – minimum height to spawn the agents at the beginning of the simulation.

    • +
    • spawn_max_height (float) – maximum height to spawn the agents at the beginning of the simulation.

    • damage_per_hit (float) – how much damage per hit per physics step, each agent starts with a health of 1.0.

    • lethal_distance (float) – how close before weapons become effective.

    • lethal_angle_radians (float) – the width of the cone of fire.

    • +
    • too_close_distance (float) – the minimum distance that a drone must maintain from another drone before a penalty is incurred.

    • assisted_flight (bool) – whether to use high level commands (RPYT) instead of full actuator commands.

    • aggressiveness (float) – a value between 0 and 1 controlling how greedy the reward function is. Lower values lead to greedier policies.

    • cooperativeness (float) – a value between 0 and 1 controlling how cooperative with each other the reward function is.

    • @@ -529,7 +534,7 @@

      Environment Options

      - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

      diff --git a/docs/documentation/pz_envs/ma_quadx_hover_env.html b/docs/documentation/pz_envs/ma_quadx_hover_env.html index 488a30a2..aab17039 100644 --- a/docs/documentation/pz_envs/ma_quadx_hover_env.html +++ b/docs/documentation/pz_envs/ma_quadx_hover_env.html @@ -515,7 +515,7 @@

      Environment Options

      - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

      diff --git a/docs/genindex.html b/docs/genindex.html index 8beeb9d0..24856ec7 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -772,7 +772,7 @@

      W

      diff --git a/docs/index.html b/docs/index.html index 2eaaca6d..297eb9f1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -398,7 +398,7 @@

      Description

      - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

      diff --git a/docs/paper.html b/docs/paper.html index 38d758d8..c10b3a68 100644 --- a/docs/paper.html +++ b/docs/paper.html @@ -432,7 +432,7 @@

      Citation diff --git a/docs/search.html b/docs/search.html index 3d53ab3c..12c32825 100644 --- a/docs/search.html +++ b/docs/search.html @@ -377,7 +377,7 @@

      Search

      diff --git a/docs/searchindex.js b/docs/searchindex.js index afc4ccb9..5b51e25b 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"Abstractions": [[2, null]], "Accessing Individual Drones": [[10, "accessing-individual-drones"]], "Attributes": [[10, "attributes"]], "Aviary": [[10, null]], "Axis Conventions": [[1, "axis-conventions"]], "Base Drone Class": [[3, null]], "Boosters": [[4, null]], "Boring Bodies": [[5, null]], "Camera": [[6, null]], "Camera FPS": [[6, "camera-fps"], [10, "camera-fps"]], "Citation": [[28, "citation"]], "Class Description": [[3, "class-description"], [4, "class-description"], [5, "class-description"], [6, "class-description"], [7, "class-description"], [8, "class-description"], [9, "class-description"], [10, "class-description"], [12, "class-description"], [13, "class-description"], [14, "class-description"]], "Control Mode": [[12, "control-mode"], [14, "control-mode"]], "Control Modes": [[13, "control-modes"]], "Controlling Drone Types": [[10, "controlling-drone-types"]], "Core": [[1, null]], "Core API": [[1, "core-api"]], "Core API Example": [[10, "core-api-example"]], "Default Attributes": [[3, "default-attributes"], [15, "default-attributes"]], "Default Methods": [[3, "default-methods"]], "Description": [[2, "description"], [4, "description"], [5, "description"], [6, "description"], [7, "description"], [8, "description"], [9, "description"], [10, "description"], [27, "description"]], "Documentation": [[0, null]], "Drones": [[11, null]], "Environment Options": [[17, "environment-options"], [18, "environment-options"], [19, "environment-options"], [20, "environment-options"], [21, "environment-options"], [22, "environment-options"], [23, "environment-options"], [25, "environment-options"], [26, "environment-options"]], "Environment Rules": [[25, "environment-rules"]], "Fixedwing": [[12, null]], "Flattening the Environment": [[17, "flattening-the-environment"], [21, "flattening-the-environment"], [22, "flattening-the-environment"]], "General Architecture": [[1, "general-architecture"]], "Gimbals": [[7, null]], "Gymnasium Environments": [[0, "gymnasium-environments"], [16, null]], "I want to do more!": [[0, "i-want-to-do-more"]], "Installation": [[0, "installation"]], "Lifting Surfaces": [[8, null]], "Linux and MacOS": [[0, "linux-and-macos"]], "Looprates": [[10, "looprates"]], "MAFixedwingDogfightEnvV2": [[25, null]], "MAQuadXHoverEnvV2": [[26, null]], "Mathematical Model": [[8, "mathematical-model"]], "Methods": [[10, "methods"]], "Model Description": [[12, "model-description"], [13, "model-description"], [14, "model-description"]], "More Complex Custom Wind Modelling": [[15, "more-complex-custom-wind-modelling"]], "Motors": [[9, null]], "Multi Drone Physics Stepping": [[10, "multi-drone-physics-stepping"]], "Multi Drone Setup": [[10, "multi-drone-setup"]], "Optional Attributes": [[3, "optional-attributes"]], "Optional Methods": [[3, "optional-methods"]], "Overview": [[11, "overview"], [15, "overview"]], "Paper Publication": [[28, null]], "PettingZoo Environments": [[0, "pettingzoo-environments"], [24, null]], "Preimplemented Wind Models": [[15, "preimplemented-wind-models"]], "Preprint": [[28, "preprint"]], "PyFlyt - UAV Simulation Environments for Reinforcement Learning Research": [[27, null]], "PyFlyt/Fixedwing-Waypoints-v3": [[17, null]], "PyFlyt/QuadX-Ball-In-Cup-v2": [[18, null]], "PyFlyt/QuadX-Hover-v3": [[19, null]], "PyFlyt/QuadX-Pole-Balance-v3": [[20, null]], "PyFlyt/QuadX-Pole-Waypoints-v3": [[21, null]], "PyFlyt/QuadX-Waypoints-v3": [[22, null]], "PyFlyt/Rocket-Landing-v3": [[23, null]], "QuadX": [[13, null]], "Required Attributes": [[3, "required-attributes"]], "Required Methods": [[3, "required-methods"], [15, "required-methods"]], "Rocket": [[14, null]], "Setting Drone Options": [[10, "setting-drone-options"]], "Simple Custom Wind Modelling": [[15, "simple-custom-wind-modelling"]], "Single Drone Physics Stepping": [[10, "single-drone-physics-stepping"]], "Spawning Custom Drones": [[10, "spawning-custom-drones"]], "Task Description": [[17, "task-description"], [18, "task-description"], [19, "task-description"], [20, "task-description"], [21, "task-description"], [22, "task-description"], [23, "task-description"], [25, "task-description"], [26, "task-description"]], "Tutorials": [[29, null]], "Usage": [[2, "usage"], [10, "usage"], [17, "usage"], [18, "usage"], [19, "usage"], [20, "usage"], [21, "usage"], [22, "usage"], [23, "usage"], [25, "usage"], [26, "usage"]], "Variants": [[12, "variants"], [13, "variants"]], "Wind": [[15, null]], "Windows": [[0, "windows"]]}, "docnames": ["documentation", "documentation/core", "documentation/core/abstractions", "documentation/core/abstractions/base_drone", "documentation/core/abstractions/boosters", "documentation/core/abstractions/boring_bodies", "documentation/core/abstractions/camera", "documentation/core/abstractions/gimbals", "documentation/core/abstractions/lifting_surfaces", "documentation/core/abstractions/motors", "documentation/core/aviary", "documentation/core/drones", "documentation/core/drones/fixedwing", "documentation/core/drones/quadx", "documentation/core/drones/rocket", "documentation/core/wind", "documentation/gym_envs", "documentation/gym_envs/fixedwing_waypoints_env", "documentation/gym_envs/quadx_ball_in_cup_env", "documentation/gym_envs/quadx_hover_env", "documentation/gym_envs/quadx_pole_balance_env", "documentation/gym_envs/quadx_pole_waypoints_env", "documentation/gym_envs/quadx_waypoints_env", "documentation/gym_envs/rocket_landing_env", "documentation/pz_envs", "documentation/pz_envs/ma_fixedwing_dogfight_env", "documentation/pz_envs/ma_quadx_hover_env", "index", "paper", "tutorials"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["documentation.md", "documentation/core.md", "documentation/core/abstractions.md", "documentation/core/abstractions/base_drone.md", "documentation/core/abstractions/boosters.md", "documentation/core/abstractions/boring_bodies.md", "documentation/core/abstractions/camera.md", "documentation/core/abstractions/gimbals.md", "documentation/core/abstractions/lifting_surfaces.md", "documentation/core/abstractions/motors.md", "documentation/core/aviary.md", "documentation/core/drones.md", "documentation/core/drones/fixedwing.md", "documentation/core/drones/quadx.md", "documentation/core/drones/rocket.md", "documentation/core/wind.md", "documentation/gym_envs.md", "documentation/gym_envs/fixedwing_waypoints_env.md", "documentation/gym_envs/quadx_ball_in_cup_env.md", "documentation/gym_envs/quadx_hover_env.md", "documentation/gym_envs/quadx_pole_balance_env.md", "documentation/gym_envs/quadx_pole_waypoints_env.md", "documentation/gym_envs/quadx_waypoints_env.md", "documentation/gym_envs/rocket_landing_env.md", "documentation/pz_envs.md", "documentation/pz_envs/ma_fixedwing_dogfight_env.md", "documentation/pz_envs/ma_quadx_hover_env.md", "index.md", "paper.md", "tutorials.md"], "indexentries": {"__call__() (in module pyflyt.core.abstractions.droneclass)": [[15, "PyFlyt.core.abstractions.DroneClass.__call__", false]], "__init__() (in module pyflyt.core.abstractions.windfieldclass)": [[15, "PyFlyt.core.abstractions.WindFieldClass.__init__", false]], "all_aux_states (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.all_aux_states", false]], "all_states (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.all_states", false]], "aux_state (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.aux_state", false]], "aux_state() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.aux_state", false]], "aviary (class in pyflyt.core)": [[10, "PyFlyt.core.Aviary", false]], "aviary_steps (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.aviary_steps", false]], "boosters (class in pyflyt.core.abstractions)": [[4, "PyFlyt.core.abstractions.Boosters", false]], "boringbodies (class in pyflyt.core.abstractions)": [[5, "PyFlyt.core.abstractions.BoringBodies", false]], "camera (class in pyflyt.core.abstractions)": [[6, "PyFlyt.core.abstractions.Camera", false]], "capture_image() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.capture_image", false]], "compute_rotation() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.compute_rotation", false]], "contact_array (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.contact_array", false]], "control_period (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.control_period", false]], "depthimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.depthImg", false]], "disable_artificial_damping() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.disable_artificial_damping", false]], "drone_path (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.drone_path", false]], "droneclass (class in pyflyt.core.abstractions)": [[3, "PyFlyt.core.abstractions.DroneClass", false]], "drones (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.drones", false]], "elapsed_ime (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.elapsed_ime", false]], "fixedwing (class in pyflyt.core.drones)": [[12, "PyFlyt.core.drones.Fixedwing", false]], "fixedwingwaypointsenv (class in pyflyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env)": [[17, "PyFlyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env.FixedwingWaypointsEnv", false]], "get_joint_info() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.get_joint_info", false]], "get_states() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.get_states", false]], "get_states() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.get_states", false]], "get_states() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.get_states", false]], "get_states() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.get_states", false]], "get_states() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.get_states", false]], "get_states() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.get_states", false]], "get_states() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.get_states", false]], "gimbals (class in pyflyt.core.abstractions)": [[7, "PyFlyt.core.abstractions.Gimbals", false]], "id (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.Id", false]], "instanced_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.instanced_controllers", false]], "liftingsurface (class in pyflyt.core.abstractions)": [[8, "PyFlyt.core.abstractions.LiftingSurface", false]], "liftingsurfaces (class in pyflyt.core.abstractions)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces", false]], "mafixedwingdogfightenv (class in pyflyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env)": [[25, "PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env.MAFixedwingDogfightEnv", false]], "maquadxhoverenv (class in pyflyt.pz_envs.quadx_envs.ma_quadx_hover_env)": [[26, "PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env.MAQuadXHoverEnv", false]], "motors (class in pyflyt.core.abstractions.motors)": [[9, "PyFlyt.core.abstractions.motors.Motors", false]], "np_random (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.np_random", false]], "np_random (pyflyt.core.abstractions.windfieldclass property)": [[15, "PyFlyt.core.abstractions.WindFieldClass.np_random", false]], "param_path (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.param_path", false]], "physics_period (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.physics_period", false]], "physics_steps (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.physics_steps", false]], "physics_update() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.physics_update", false]], "physics_update() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.physics_update", false]], "physics_update() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.physics_update", false]], "physics_update() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.physics_update", false]], "physics_update() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.physics_update", false]], "physics_update() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.physics_update", false]], "physics_update() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.physics_update", false]], "print_all_bodies() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.print_all_bodies", false]], "quadx (class in pyflyt.core.drones)": [[13, "PyFlyt.core.drones.QuadX", false]], "quadxballincupenv (class in pyflyt.gym_envs.quadx_envs.quadx_ball_in_cup_env)": [[18, "PyFlyt.gym_envs.quadx_envs.quadx_ball_in_cup_env.QuadXBallInCupEnv", false]], "quadxhoverenv (class in pyflyt.gym_envs.quadx_envs.quadx_hover_env)": [[19, "PyFlyt.gym_envs.quadx_envs.quadx_hover_env.QuadXHoverEnv", false]], "quadxpolebalanceenv (class in pyflyt.gym_envs.quadx_envs.quadx_pole_balance_env)": [[20, "PyFlyt.gym_envs.quadx_envs.quadx_pole_balance_env.QuadXPoleBalanceEnv", false]], "quadxpolewaypointsenv (class in pyflyt.gym_envs.quadx_envs.quadx_pole_waypoints_env)": [[21, "PyFlyt.gym_envs.quadx_envs.quadx_pole_waypoints_env.QuadXPoleWaypointsEnv", false]], "quadxwaypointsenv (class in pyflyt.gym_envs.quadx_envs.quadx_waypoints_env)": [[22, "PyFlyt.gym_envs.quadx_envs.quadx_waypoints_env.QuadXWaypointsEnv", false]], "register_all_new_bodies() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.register_all_new_bodies", false]], "register_controller() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.register_controller", false]], "register_controller() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.register_controller", false]], "registered_base_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.registered_base_controllers", false]], "registered_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.registered_controllers", false]], "reset() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.reset", false]], "reset() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.reset", false]], "reset() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.reset", false]], "reset() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.reset", false]], "reset() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.reset", false]], "reset() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.reset", false]], "reset() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.reset", false]], "reset() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.reset", false]], "reset() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.reset", false]], "reset() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.reset", false]], "reset() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.reset", false]], "rgbaimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.rgbaImg", false]], "rocket (class in pyflyt.core.drones)": [[14, "PyFlyt.core.drones.Rocket", false]], "rocketlandingenv (class in pyflyt.gym_envs.rocket_envs.rocket_landing_env)": [[23, "PyFlyt.gym_envs.rocket_envs.rocket_landing_env.RocketLandingEnv", false]], "segimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.segImg", false]], "set_all_setpoints() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_all_setpoints", false]], "set_armed() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_armed", false]], "set_mode() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.set_mode", false]], "set_mode() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_mode", false]], "set_mode() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.set_mode", false]], "set_mode() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.set_mode", false]], "set_mode() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.set_mode", false]], "set_setpoint() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_setpoint", false]], "setpoint (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.setpoint", false]], "starting_fuel_ratio (pyflyt.core.drones.rocket attribute)": [[14, "PyFlyt.core.drones.Rocket.starting_fuel_ratio", false]], "starting_velocity (pyflyt.core.drones.fixedwing attribute)": [[12, "PyFlyt.core.drones.Fixedwing.starting_velocity", false]], "state (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.state", false]], "state() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.state", false]], "state_update() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.state_update", false]], "state_update() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.state_update", false]], "state_update() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.state_update", false]], "state_update() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.state_update", false]], "state_update() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.state_update", false]], "state_update() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.state_update", false]], "state_update() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.state_update", false]], "step() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.step", false]], "update_control() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_control", false]], "update_control() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_control", false]], "update_control() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_control", false]], "update_control() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_control", false]], "update_last() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_last", false]], "update_last() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_last", false]], "update_last() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_last", false]], "update_last() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_last", false]], "update_physics() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_physics", false]], "update_physics() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_physics", false]], "update_physics() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_physics", false]], "update_physics() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_physics", false]], "update_state() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_state", false]], "update_state() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_state", false]], "update_state() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_state", false]], "update_state() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_state", false]], "view_mat (pyflyt.core.abstractions.camera property)": [[6, "PyFlyt.core.abstractions.Camera.view_mat", false]], "windfieldclass (class in pyflyt.core.abstractions)": [[15, "PyFlyt.core.abstractions.WindFieldClass", false]]}, "objects": {"PyFlyt.core": [[10, 0, 1, "", "Aviary"]], "PyFlyt.core.Aviary": [[10, 1, 1, "", "all_aux_states"], [10, 1, 1, "", "all_states"], [10, 2, 1, "", "aux_state"], [10, 1, 1, "", "aviary_steps"], [10, 1, 1, "", "contact_array"], [10, 1, 1, "", "drones"], [10, 1, 1, "", "elapsed_ime"], [10, 1, 1, "", "physics_steps"], [10, 2, 1, "", "print_all_bodies"], [10, 2, 1, "", "register_all_new_bodies"], [10, 2, 1, "", "reset"], [10, 2, 1, "", "set_all_setpoints"], [10, 2, 1, "", "set_armed"], [10, 2, 1, "", "set_mode"], [10, 2, 1, "", "set_setpoint"], [10, 2, 1, "", "state"], [10, 2, 1, "", "step"]], "PyFlyt.core.abstractions": [[4, 0, 1, "", "Boosters"], [5, 0, 1, "", "BoringBodies"], [6, 0, 1, "", "Camera"], [3, 0, 1, "", "DroneClass"], [7, 0, 1, "", "Gimbals"], [8, 0, 1, "", "LiftingSurface"], [8, 0, 1, "", "LiftingSurfaces"], [15, 0, 1, "", "WindFieldClass"]], "PyFlyt.core.abstractions.Boosters": [[4, 3, 1, "", "get_states"], [4, 3, 1, "", "physics_update"], [4, 3, 1, "", "reset"], [4, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.BoringBodies": [[5, 3, 1, "", "get_states"], [5, 3, 1, "", "physics_update"], [5, 3, 1, "", "reset"], [5, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.Camera": [[6, 3, 1, "", "capture_image"], [6, 3, 1, "", "get_states"], [6, 3, 1, "", "physics_update"], [6, 3, 1, "", "state_update"], [6, 1, 1, "", "view_mat"]], "PyFlyt.core.abstractions.DroneClass": [[3, 1, 1, "", "Id"], [15, 2, 1, "", "__call__"], [3, 1, 1, "", "aux_state"], [3, 1, 1, "", "control_period"], [3, 1, 1, "", "depthImg"], [3, 2, 1, "", "disable_artificial_damping"], [3, 1, 1, "", "drone_path"], [3, 2, 1, "", "get_joint_info"], [3, 1, 1, "", "instanced_controllers"], [3, 1, 1, "", "np_random"], [3, 1, 1, "", "param_path"], [3, 1, 1, "", "physics_period"], [3, 2, 1, "", "register_controller"], [3, 1, 1, "", "registered_base_controllers"], [3, 1, 1, "", "registered_controllers"], [3, 2, 1, "", "reset"], [3, 1, 1, "", "rgbaImg"], [3, 1, 1, "", "segImg"], [3, 2, 1, "", "set_mode"], [3, 1, 1, "", "setpoint"], [3, 1, 1, "", "state"], [3, 2, 1, "", "update_control"], [3, 2, 1, "", "update_last"], [3, 2, 1, "", "update_physics"], [3, 2, 1, "", "update_state"]], "PyFlyt.core.abstractions.Gimbals": [[7, 3, 1, "", "compute_rotation"], [7, 3, 1, "", "get_states"], [7, 3, 1, "", "physics_update"], [7, 3, 1, "", "reset"], [7, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.LiftingSurface": [[8, 3, 1, "", "get_states"], [8, 3, 1, "", "physics_update"], [8, 3, 1, "", "reset"], [8, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.LiftingSurfaces": [[8, 3, 1, "", "get_states"], [8, 3, 1, "", "physics_update"], [8, 3, 1, "", "reset"], [8, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.WindFieldClass": [[15, 2, 1, "", "__init__"], [15, 1, 1, "", "np_random"]], "PyFlyt.core.abstractions.motors": [[9, 0, 1, "", "Motors"]], "PyFlyt.core.abstractions.motors.Motors": [[9, 3, 1, "", "get_states"], [9, 3, 1, "", "physics_update"], [9, 3, 1, "", "reset"], [9, 3, 1, "", "state_update"]], "PyFlyt.core.drones": [[12, 0, 1, "", "Fixedwing"], [13, 0, 1, "", "QuadX"], [14, 0, 1, "", "Rocket"]], "PyFlyt.core.drones.Fixedwing": [[12, 3, 1, "", "reset"], [12, 3, 1, "", "set_mode"], [12, 4, 1, "", "starting_velocity"], [12, 3, 1, "", "update_control"], [12, 3, 1, "", "update_last"], [12, 3, 1, "", "update_physics"], [12, 3, 1, "", "update_state"]], "PyFlyt.core.drones.QuadX": [[13, 3, 1, "", "register_controller"], [13, 3, 1, "", "reset"], [13, 3, 1, "", "set_mode"], [13, 3, 1, "", "update_control"], [13, 3, 1, "", "update_last"], [13, 3, 1, "", "update_physics"], [13, 3, 1, "", "update_state"]], "PyFlyt.core.drones.Rocket": [[14, 3, 1, "", "reset"], [14, 3, 1, "", "set_mode"], [14, 4, 1, "", "starting_fuel_ratio"], [14, 3, 1, "", "update_control"], [14, 3, 1, "", "update_last"], [14, 3, 1, "", "update_physics"], [14, 3, 1, "", "update_state"]], "PyFlyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env": [[17, 0, 1, "", "FixedwingWaypointsEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_ball_in_cup_env": [[18, 0, 1, "", "QuadXBallInCupEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_hover_env": [[19, 0, 1, "", "QuadXHoverEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_pole_balance_env": [[20, 0, 1, "", "QuadXPoleBalanceEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_pole_waypoints_env": [[21, 0, 1, "", "QuadXPoleWaypointsEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_waypoints_env": [[22, 0, 1, "", "QuadXWaypointsEnv"]], "PyFlyt.gym_envs.rocket_envs.rocket_landing_env": [[23, 0, 1, "", "RocketLandingEnv"]], "PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env": [[25, 0, 1, "", "MAFixedwingDogfightEnv"]], "PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env": [[26, 0, 1, "", "MAQuadXHoverEnv"]]}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "property", "Python property"], "2": ["py", "function", "Python function"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "objtypes": {"0": "py:class", "1": "py:property", "2": "py:function", "3": "py:method", "4": "py:attribute"}, "terms": {"": [3, 4, 6, 9, 10, 13, 24], "0": [1, 3, 4, 6, 8, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "01": 25, "01305": 28, "05": 14, "07": 25, "1": [1, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 18, 20, 21, 22, 23, 25, 26], "10": [18, 19, 21, 22, 25, 26], "100": 17, "1000": [1, 10, 15], "10th": 14, "120": [3, 10, 12, 13, 14, 15, 17], "128": [3, 12, 13, 14], "2": [1, 3, 5, 7, 10, 12, 13, 14, 15, 17, 21, 22, 25], "20": [12, 13, 20, 21, 25], "200": 23, "2023": 28, "20xx": 0, "225": 5, "2304": 28, "240": [3, 10, 12, 13, 14], "25": 10, "2d": 5, "3": [1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 19, 20, 21, 22, 26], "30": [10, 14, 17, 18, 22, 23, 25, 26], "4": [1, 10, 13, 17, 21, 22, 25], "40": [10, 19, 20, 21, 23, 26], "42": 24, "480": [17, 18, 19, 20, 21, 22, 23], "5": [1, 10, 12, 13, 22, 25], "50": 10, "500": [23, 25], "6": [1, 10, 13], "60": [10, 25], "65": 8, "7": [1, 10, 13, 14, 15], "8": [10, 15], "80": 0, "9": 14, "90": [3, 12, 13, 14], "A": [0, 3, 4, 5, 6, 7, 10, 12, 28], "As": 5, "At": 1, "By": [3, 10], "For": [2, 10, 15, 24], "If": [0, 4, 17, 21, 22, 28], "In": [6, 10], "It": [0, 1, 2, 3, 4, 6, 10, 13, 27], "NOT": 4, "OR": 8, "On": [1, 6], "The": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "Then": [1, 15], "These": [10, 11], "To": [10, 15, 27], "_": [17, 18, 19, 20, 21, 22, 23], "__call__": 15, "__file__": 3, "__init__": [3, 15], "_lowercase_": 10, "a0": 4, "a1": 4, "abil": 9, "abl": 10, "about": [7, 12, 13, 14], "abov": 1, "absolut": 23, "abstract": [1, 3, 4, 5, 6, 7, 8, 9, 15], "accept": [4, 9], "access": 3, "accord": 4, "accur": [3, 5], "achiev": 6, "acrow": [12, 25], "act": [4, 9], "action": [17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "action_spac": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "actual": [4, 9], "actual_duty_cycl": [4, 9], "actuat": [3, 7, 8, 25], "addit": [6, 20], "addition": [4, 9], "adjust": 6, "aerial": 25, "aerodynam": [3, 5, 8], "affect": 5, "after": 7, "agent": [17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "agent_hz": [17, 18, 19, 20, 21, 22, 23, 25, 26], "aggress": [12, 25], "agil": 8, "ai": 25, "aileron": 12, "air": 5, "aircraft": [6, 12, 17, 21, 22, 25], "al": 8, "algorithm": [16, 24, 27], "all": [0, 1, 2, 3, 5, 7, 8, 9, 10, 24, 25, 26], "all_aux_st": 10, "all_param": 3, "all_stat": 10, "allevi": 10, "allow": [1, 2, 4, 9, 10, 17, 18, 19, 20, 21, 22, 25, 26], "along": [9, 10], "alpha_0_bas": 8, "alpha_stall_n_bas": 8, "alpha_stall_p_bas": 8, "also": [4, 10], "altern": 0, "although": 10, "alwai": 4, "amalgam": 1, "amount": [4, 6, 9, 10], "an": [1, 3, 4, 6, 8, 9, 10, 15, 25, 26], "ang_po": [3, 12, 13, 14], "ang_vel": [3, 12, 13, 14], "angl": [6, 8, 10, 22], "angle_represent": [17, 18, 19, 20, 21, 22, 23, 26], "angular": [10, 13, 18, 19, 22, 26], "ani": [3, 5, 10, 20, 21, 27], "anyth": [25, 27], "api": [24, 25], "append": 10, "appli": 5, "ar": [0, 1, 2, 3, 4, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "arbitrari": [4, 5, 7, 9], "ardupilot": 13, "area": [5, 17, 18, 19, 20, 21, 22, 23, 25, 26], "arg": 15, "argument": [4, 9, 10, 17, 21, 22], "arm": 10, "around": [4, 7, 9], "arrai": [1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 26], "arrang": 10, "articl": 28, "artifici": 3, "arxiv": 28, "ascend": 10, "asid": 3, "assign": 3, "assisted_flight": 25, "assum": 5, "attach": [4, 6, 15], "attack": 8, "attribut": 1, "author": 28, "automat": [10, 25], "aux": 10, "aux_stat": [3, 10], "auxiliari": [3, 10], "avail": [0, 4, 12, 13, 28], "aviari": [1, 3, 12, 13, 14, 15], "aviary_step": 10, "ax": [1, 5, 7], "axi": [3, 4, 7, 9, 14], "b": [1, 25], "b0": 4, "b1": 4, "backend": 3, "balanc": 21, "bambino": 18, "base": [1, 8], "base_mod": [3, 13], "baselin": [17, 21, 22], "basic": [2, 15], "becaus": [20, 21], "becom": 25, "been": 10, "befor": [3, 22, 25], "begin": 25, "behaviour": 3, "being": [17, 21, 22], "below": [12, 13, 15], "between": [4, 7, 10, 25], "big": 10, "bigger": 12, "bind": [3, 27], "biplan": 27, "bn": 4, "bodi": [1, 4, 6, 10], "body_id": 5, "bool": [3, 4, 6, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 26], "boolean": [4, 10], "booster": [3, 7, 9, 10, 14, 23], "booster_id": 4, "boringbodi": 5, "bottom": 10, "bound": 25, "breakdown": 13, "briefli": 10, "bring": [0, 18], "brusei": 28, "brushless": 9, "bug": 6, "build": 0, "built": [0, 1, 27], "bullet": 27, "bullet_cli": [3, 4, 5, 6, 7, 8, 9], "bulletcli": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14], "burn": 4, "c": [0, 25], "c0": 4, "c1": 4, "c_d": 5, "calcul": 4, "call": [2, 4, 6, 7, 9, 10, 13, 15], "callabl": 10, "camera": 3, "camera_angle_degre": [3, 6, 12, 13, 14], "camera_fov_degre": [3, 6, 12, 13, 14], "camera_fp": [10, 12, 13, 14], "camera_id": 6, "camera_position_offset": [6, 12, 13, 14], "camera_resolut": [3, 6, 12, 13, 14], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27], "cannon": 25, "cannot": 4, "capabl": [1, 15], "captur": [6, 10], "capture_imag": [3, 6], "cardin": 1, "cascad": 13, "case": 1, "caus": 5, "caveat": 10, "cd_0": 8, "cdot": 5, "ceil": 23, "center": 6, "cf2x": 13, "chang": [1, 4, 10, 13], "check": [3, 10], "chord": 8, "cinemat": 6, "cite": 28, "cl_alpha_2d": 8, "class": [1, 2, 11, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "click": 0, "client": [3, 4, 5, 6, 7, 8, 9], "close": [1, 10, 24, 25, 26], "cmd": [3, 8], "cn": 4, "code": 10, "coeffici": [5, 8, 9], "collis": 10, "command": [3, 4, 8, 9, 17, 20, 21, 25], "command_id": 8, "command_sign": 8, "common": 10, "compat": [17, 21, 22], "complet": [17, 21, 22], "complic": 2, "compon": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "comprehens": [2, 3], "comput": [5, 9], "compute_rot": 7, "concaten": 3, "concis": [5, 9], "conda": 0, "condit": 8, "cone": 25, "configur": [2, 10, 13, 27], "consid": [3, 17, 21, 22, 25], "consist": 13, "constant": [4, 7, 8, 9, 17, 21, 22], "construct": [2, 3], "consult": 10, "consum": [6, 10], "contact": 10, "contact_arrai": 10, "contain": 10, "context_length": [17, 21, 22], "contribut": 18, "control": [1, 3, 11, 20, 21, 25], "control_hz": [3, 10, 12, 13, 14], "control_period": 3, "controlclass": [3, 13], "controller_constructor": [3, 13], "controller_id": [3, 13], "conveni": [4, 8, 9], "convert": [4, 8, 9], "cooper": 25, "core": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15], "correct": 8, "correspond": [10, 14], "counter": 9, "coupl": 0, "crash": [19, 20, 26], "creat": 3, "creativ": 10, "crucial": 4, "current": [4, 6, 7, 8, 9, 10, 12, 13, 14], "custom": [2, 3, 17, 21, 22, 27], "cycl": [4, 9], "damag": 25, "damage_per_hit": 25, "damp": 3, "datasheet": 14, "deal": 25, "debug": [3, 10], "def": [3, 15], "default": [10, 11, 12, 13, 16, 24], "defin": [1, 3, 9, 10, 15], "deflect": [8, 10, 14], "deflection_limit": 8, "defrag": 18, "degre": [6, 7, 8], "denomin": 10, "densiti": 5, "depend": [3, 4, 5, 6, 9, 10, 15], "deplet": 4, "depth": 6, "depthimg": [3, 6], "describ": [1, 13, 14], "descript": 11, "design": 2, "desir": 1, "desktop": 0, "detail": 0, "develop": 0, "diagon": 4, "dict": [3, 10, 15, 17, 21, 22], "dictionari": 10, "differ": [4, 7, 10, 12, 13, 16, 24], "difficult": 5, "direct": [1, 4, 5, 8, 20, 21], "directli": 25, "directori": 3, "dirnam": 3, "disabl": 3, "disable_artificial_damp": 3, "disconnect": 15, "discret": 27, "displai": 3, "distanc": [6, 17, 18, 21, 22, 23], "do": [3, 9, 10, 15], "document": [2, 3, 12, 13, 27], "doe": [4, 5, 6, 7, 9, 10], "dogfight": 25, "domain": 1, "don": [1, 3], "down": 0, "download": 0, "downtilt": 6, "drag": [5, 8], "drag_coef": 5, "driven": 9, "drone": [1, 2, 4, 5, 6, 8, 9, 12, 13, 14, 18, 19, 20, 27], "drone_index": 10, "drone_model": [3, 10, 12, 13, 14], "drone_opt": 10, "drone_path": 3, "drone_typ": [1, 10, 15], "drone_type_map": 10, "droneclass": [3, 10, 15], "drop": 21, "dtype": [3, 15], "duti": [4, 9], "dynam": [9, 13], "each": [1, 2, 3, 4, 5, 7, 8, 9, 10, 25, 26], "easier": [2, 17, 21, 22], "easili": 9, "east": 1, "edg": 12, "effect": [6, 8, 22, 25], "elabor": 1, "elaps": 10, "elapsed_im": 10, "electr": 9, "element": [4, 10], "elsewher": 2, "enabl": 3, "encourag": 0, "end": [3, 12, 13, 14, 18], "endpoint": 10, "enemi": 25, "engin": [4, 10, 27], "enough": [3, 10], "entiti": 10, "enu": 1, "env": [1, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "environ": [1, 6, 10, 15, 28], "equal": 10, "equat": 5, "equival": 10, "essenti": 1, "et": 8, "eta": 8, "etc": 10, "euler": [3, 10, 17, 18, 19, 20, 21, 22, 23, 26], "even": 10, "everi": [1, 6, 7, 10], "everyth": [0, 12, 13, 14], "exact": [4, 9], "exampl": [0, 2, 3, 15], "except": 9, "exist": 5, "expand": 0, "experienc": [5, 10], "express": 3, "extent": 1, "extinguish": 4, "extract": 14, "f": 3, "f_i": 5, "factor": 8, "falcon": 14, "fall": [5, 23], "fals": [3, 6, 10, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26], "familiar": 5, "fast": [17, 21, 22], "fastest": 24, "featur": 6, "field": [6, 10, 15], "figur": 5, "file": [3, 12, 14], "final": 1, "finlet": 14, "finlet_i": 23, "finlet_rol": 23, "finlet_x": 23, "fire": 25, "first": [0, 1, 7, 10, 14], "fix": [8, 12], "fixedw": [10, 11, 14], "fixedwing_env": [17, 25], "fixedwing_opt": 10, "fixedwing_waypoints_env": 17, "fixedwingwaypointsenv": 17, "flap": [8, 12], "flap_to_chord": 8, "flatten": 2, "flatten_observ": 25, "flattenwaypointenv": [17, 21, 22], "fledg": 0, "flexibl": [1, 27], "fli": 25, "flight": [1, 3, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 26], "flight_dome_s": [17, 18, 19, 20, 21, 22, 25, 26], "flight_mod": [10, 17, 18, 19, 20, 21, 22, 26], "float": [3, 4, 5, 6, 7, 8, 9, 10, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "floor": 10, "fluctuat": [4, 9], "fly": [17, 18, 19, 20, 21, 22, 23, 25, 26], "focu": 6, "folder": 3, "follow": [1, 3, 5, 7, 15], "forc": [4, 5, 8, 9], "form": 3, "forward_unit": 8, "found": [2, 3], "four": 13, "fov": 6, "frac": 5, "frame": [1, 3, 4, 5, 10], "from": [1, 3, 4, 6, 7, 9, 10, 14, 15, 17, 18, 21, 22, 24, 25, 26], "front": 1, "frontal": 5, "fuel": [4, 9, 10, 23], "fuel_burn": 4, "fueltank_id": 4, "full": [4, 8, 25], "fulli": 0, "function": [2, 3, 10, 15, 25], "g": 1, "gener": [3, 4, 5, 6, 7, 8, 9], "geometri": 14, "get": [3, 4, 7, 8, 9, 10, 21, 27], "get_joint_info": 3, "get_stat": [2, 3, 4, 5, 6, 7, 8, 9], "getbasepositionandorient": 3, "getbaseveloc": 3, "geteulerfromquaternion": 3, "getmatrixfromquaternion": 3, "gimbal": [4, 6, 9, 14, 23], "gimbal_command": 7, "gimbal_range_degre": 7, "gimbal_tau": 7, "gimbal_unit_1": 7, "gimbal_unit_2": 7, "github": [6, 10, 18], "give": 10, "go": [0, 23], "goal": [17, 18, 19, 20, 21, 22, 23, 26], "goal_reach_angl": 22, "goal_reach_dist": [17, 18, 21, 22], "goal_reach_veloc": 18, "goe": 10, "gracefulli": [1, 10], "graviti": 1, "greedi": 25, "greedier": 25, "ground": [1, 5, 10, 13, 20], "gun": 25, "gym_env": [16, 17, 18, 19, 20, 21, 22, 23], "gymnasium": [17, 18, 19, 20, 21, 22, 23], "ha": [1, 3, 10, 14, 25], "hand": [7, 9], "handl": [1, 8, 10, 12, 13, 14], "handler": [8, 10], "happen": 3, "have": [1, 2, 3, 4, 9, 10, 15, 17, 21, 22], "health": 25, "height": [6, 15], "help": 0, "here": [0, 10, 28, 29], "high": 25, "higher": 12, "highli": [0, 1], "hit": [20, 25], "hook": 15, "horizon": 6, "horizont": [1, 12, 23], "horri": 28, "hour": 0, "hover": [16, 20, 26], "how": [10, 16, 17, 21, 22, 24, 25], "howev": [10, 17, 21, 22], "human": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "hz": 10, "i": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "id": [3, 4, 5, 6, 7, 8, 9, 10], "idea": 5, "ie": [18, 19, 22, 26], "ignit": [4, 14, 23], "illustr": 5, "imag": [6, 10], "immedi": [17, 21, 22], "implement": [2, 3, 4, 5, 13, 15], "implicit": 6, "import": [1, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "includ": [12, 13, 14, 17, 21, 22], "index": [1, 4, 10], "indic": 4, "individu": 5, "inertia": 4, "infin": 6, "info": [16, 24, 25, 26], "inform": [2, 3, 10], "inherit": 3, "initi": [3, 12, 13, 14, 15, 16, 24], "innocent": 28, "insert": [24, 25, 26], "inspir": 13, "instanc": [10, 12, 13, 14], "instanced_control": 3, "instanti": [1, 10], "instead": [6, 7, 10, 25], "int": [3, 4, 5, 6, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 26], "integ": [3, 4, 6, 8, 9, 10], "interact": [17, 18, 19, 20, 21, 22, 23, 25, 26], "interfac": 3, "interstag": 14, "introduc": [18, 20, 21], "invalid": 10, "invari": 15, "ipsum": 15, "is_tracking_camera": 6, "issu": [6, 10], "its": [1, 25], "itself": [1, 3, 5, 6, 13], "jame": 28, "jet": 28, "jim": 28, "joint": 3, "journal": 28, "jun": 28, "just": [0, 1], "keep": 20, "kei": [3, 10], "kg": [5, 12], "khan": 8, "kindli": 29, "king": 28, "kwarg": 15, "lab": 13, "last": 10, "latenc": [20, 21], "later": 10, "latest": 0, "launch": 14, "law": 3, "lead": [10, 25], "learn": [16, 17, 21, 22, 24, 25, 28], "left": [1, 12], "let": 20, "lethal": 25, "lethal_angle_radian": 25, "lethal_dist": 25, "level": [8, 9, 25], "li": 1, "librari": [17, 21, 22, 27], "lift": 2, "lifting_surfac": [3, 8], "lifting_unit": 8, "liftingsurfac": [3, 8], "like": [1, 10, 15, 17, 21, 22], "likewis": 4, "limit": [4, 8], "lin_po": [3, 12, 13, 14], "lin_vel": [3, 12, 13, 14], "linear": [9, 10, 13], "link": [4, 5, 6, 7, 8, 9], "liquid": 4, "list": [4, 5, 8, 9, 10], "lit": 4, "liter": [17, 18, 19, 20, 21, 22, 23, 26], "load": [3, 4, 12, 14], "local": [1, 3, 5, 8, 13], "locat": [3, 4, 9], "lock": 6, "log": 15, "logarithm": 15, "long": [19, 20, 21, 26], "longest": [19, 20, 26], "look": 1, "loop": 10, "looprat": [3, 17, 18, 19, 20, 21, 22, 23, 25, 26], "loos": 1, "lorem": 15, "lose": 25, "lower": 25, "lowercas": 10, "m": [5, 10], "m1": 13, "m2": 13, "m3": 13, "m4": 13, "ma_fixedwing_dogfight_env": 25, "ma_quadx_hover_env": 26, "mafixedwingdogfightenv": 25, "magnitud": 10, "mai": [2, 7, 10, 24], "main": [5, 6, 12], "maintain": [18, 24], "make": [16, 17, 18, 19, 20, 21, 22, 23], "mani": [17, 21, 22, 25], "map": [6, 8, 10], "maquadxhoverenv": [24, 26], "mass": [4, 14], "match": 22, "mathbf": 5, "mathemat": 2, "matmul": 3, "matric": [4, 7, 9], "matrix": [4, 6, 9], "mauro": 28, "max": 4, "max_displac": 23, "max_duration_second": [17, 18, 19, 20, 21, 22, 23, 25, 26], "max_fuel_burn": 4, "max_fuel_r": 4, "max_inertia": 4, "max_rpm": 9, "max_thrust": [4, 9], "maximum": [4, 8, 9, 17, 18, 19, 20, 21, 22, 23, 25, 26], "mean": 25, "meaning": 4, "meter": [1, 20, 21], "method": 2, "microsoft": 0, "min": 4, "min_thrust": 4, "minimum": [4, 18], "missil": 25, "mode": [1, 3, 10, 11, 15, 17, 18, 19, 20, 21, 22, 26], "model": [2, 3, 10, 11, 25], "model_dir": [3, 12, 13, 14], "modern": 25, "modifi": 4, "moment": 4, "more": [2, 3, 4, 5, 9, 10, 12], "most": [17, 21, 22, 24], "motor": [2, 7, 12, 13, 20, 21], "motor_id": 9, "move": 5, "movement": 1, "much": [10, 20, 21, 25], "multi": [1, 24], "multiag": 26, "multipl": [8, 10], "multirotor": 13, "must": [0, 2, 3, 10, 18], "my_paramet": 15, "mycustomdron": 10, "mywindfield": 15, "n": [1, 4, 5, 9, 10, 15], "nadjim": 28, "name": [2, 3, 10], "nativ": 16, "ndarrai": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 26], "need": [2, 4, 6, 7, 9], "neg": [8, 9], "net": 9, "new": [0, 10, 13], "nois": [4, 9, 15], "noise_ratio": [4, 9], "non": [17, 21, 22], "none": [3, 4, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "noqa": 16, "normal": [4, 5, 8, 9], "normal_area": 5, "north": 1, "nose": 25, "note": 10, "noth": 10, "now": 0, "np": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 26], "np_random": [3, 4, 5, 7, 8, 9, 12, 13, 14, 15], "num_boost": 4, "num_dron": [10, 26], "num_gimb": 7, "num_motor": 9, "num_surfac": 8, "num_target": [17, 21, 22], "number": [1, 3, 4, 5, 7, 8, 9, 10, 17, 21, 22], "numpi": [0, 1, 10, 15, 26], "o": 3, "ob": [16, 17, 18, 19, 20, 21, 22, 23], "object": [1, 6, 8, 10], "observ": [16, 17, 21, 22, 24, 25, 26], "obtain": [4, 9], "off": 4, "offer": [11, 27], "offset": 6, "oh": 10, "onboard": [3, 10], "one": [10, 14], "onli": [10, 12, 13, 14, 22, 23, 25], "onto": 18, "open": 3, "optim": 10, "option": [0, 1, 2, 4, 12, 13, 27], "order": [4, 10], "orient": [1, 3, 6, 10, 15, 26], "orthogon": 7, "other": [3, 7, 25], "otherwis": 3, "our": 28, "out": [1, 10, 25], "output": [3, 4, 9], "outsid": [10, 25], "overhead": [6, 10], "overrid": 15, "overview": 0, "own": [1, 2, 3, 15], "p": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14], "pad": [17, 21, 22, 23], "page": 10, "pair": 7, "parallelenv": 24, "param": 3, "param_path": 3, "paramet": [3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "parameter": 4, "pass": [1, 8, 10], "path": 3, "per": 25, "percent": 4, "perform": [6, 25], "period": [4, 5, 7, 8, 9], "persist": 1, "pettingzoo": 25, "phang": 28, "phyiscs_hz": 3, "physic": [1, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 25, 27], "physics_camera_ratio": 3, "physics_control_ratio": 3, "physics_hz": [3, 4, 9, 10, 12, 13, 14], "physics_period": [3, 4, 5, 7, 8, 9], "physics_step": [3, 10, 12, 13, 14], "physics_upd": [2, 3, 4, 5, 6, 7, 8, 9], "pid": 13, "pip3": 0, "pitch": [3, 12, 17], "pixel": 6, "place": 8, "plain": 5, "plane": 1, "platform": 11, "plu": [4, 9, 15], "point": [1, 4, 6, 25], "pointer": [3, 10], "polici": [24, 25, 26], "popular": [15, 17, 21, 22], "posit": [1, 3, 8, 10, 13, 15, 18, 26], "possibl": [0, 1, 10, 15, 17, 19, 20, 21, 22, 26], "presenc": 4, "present": [4, 9], "primari": 5, "primitive_dron": [10, 13], "principl": 5, "print": 10, "print_all_bodi": 10, "prior": 0, "problem": 10, "produc": [4, 9], "propel": 9, "properti": [3, 4, 6, 10, 14, 15], "proport": 4, "propuls": 4, "provid": [0, 3, 10, 12, 13, 14, 15, 16, 24], "put": 1, "pwm": [4, 9, 20, 21], "px4": 13, "pybullet": [0, 3, 4, 5, 6, 7, 8, 9, 10, 13], "pyflyt": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 24, 25, 26, 28], "python": [0, 1, 15, 27], "pz_env": [24, 25, 26], "q": 13, "quad": 13, "quadcopt": 27, "quadrotor": [13, 19, 20, 21, 22], "quadx": [1, 10, 11, 12, 15, 16], "quadx_ball_in_cup_env": 18, "quadx_env": [18, 19, 20, 21, 22, 26], "quadx_hover_env": 19, "quadx_opt": 10, "quadx_pole_balance_env": 20, "quadx_pole_waypoints_env": 21, "quadx_waypoints_env": 22, "quadxballincupenv": 18, "quadxhoverenv": 19, "quadxpolebalanceenv": 20, "quadxpolewaypointsenv": 21, "quadxwaypointsenv": 22, "quaternion": [17, 18, 19, 20, 21, 22, 23, 26], "queri": 10, "r": 13, "radian": [1, 22], "ragdol": 10, "rais": 3, "ramp": [4, 8, 9], "randn": 15, "random": [3, 4, 5, 7, 8, 9, 15], "randomst": [3, 4, 5, 7, 8, 9, 12, 13, 14, 15], "rang": [1, 7, 10, 15, 25], "rate": [3, 4, 18, 19, 22, 26], "ratio": [4, 8, 9, 12], "raw": 10, "rb": 3, "re": 5, "reach": [1, 17, 18, 21, 22], "read": [12, 14], "readabl": [17, 21, 22], "readili": [4, 9], "real": 8, "realpath": 3, "reason": 24, "receiv": [3, 10], "recommend": [0, 6, 10], "redirect": [4, 7, 9], "refer": [1, 2, 5, 15, 29], "referenc": 5, "regist": [10, 13], "register_all_new_bodi": 10, "register_control": [3, 11, 13], "register_wind_field_funct": 15, "registered_base_control": 3, "registered_control": 3, "reignit": 4, "reimplement": 2, "reinforc": [16, 17, 21, 22, 24, 25, 28], "rel": [1, 4], "relev": [1, 2, 3, 6, 10], "reli": 4, "remain": [4, 10, 23], "render": [1, 10, 15, 27], "render_mod": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "render_resolut": [17, 18, 19, 20, 21, 22, 23], "repeatedli": 1, "report": 14, "repositori": 0, "repres": [1, 3, 4, 5, 6, 7, 8, 9, 10], "requir": [2, 9], "research": 28, "reserv": 3, "reset": [2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "resetbasepositionandorient": 3, "reshap": 3, "resolut": 6, "resolv": 5, "result": [5, 10, 17, 21, 22], "return": [2, 3, 4, 6, 7, 8, 9, 10, 15], "revers": 9, "rew": [17, 18, 19, 20, 21, 22, 23], "reward": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "rgb_arrai": [17, 18, 19, 20, 21, 22, 23], "rgba": 6, "rgbaimg": [3, 6], "rgbimg": 10, "rho": 5, "right": [7, 9, 12], "rng": 10, "rocket": [4, 10, 11, 27], "rocket_brick": 3, "rocket_env": 23, "rocket_landing_env": 23, "rocket_opt": 10, "rocketbrick": 10, "rocketlandingenv": 23, "roll": [3, 12, 17], "rosetta": [2, 3], "rotat": [3, 4, 7, 9], "rotation_matrix": [5, 8], "rotation_vector": 7, "round": 10, "rpm": 9, "rpy": [1, 10], "rpyt": 25, "rule": [7, 9], "run": [0, 3, 12, 13, 14], "safe_load": 3, "same": [3, 5, 10], "sampl": [4, 9, 10, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "scale": 14, "scroll": 0, "second": [7, 10, 15], "section": [0, 1, 2, 3, 10], "see": [6, 10], "seed": [10, 24], "segimg": [3, 6], "segment": 6, "select": [0, 12, 13], "self": [3, 10, 15], "sequenc": [5, 10, 17, 21, 22], "seri": [4, 5, 7, 9], "serv": [1, 2, 3], "servo": 7, "set": [0, 1, 2, 3, 4, 7, 12, 13, 14, 15, 17, 21, 22], "set_all_setpoint": 10, "set_arm": 10, "set_mod": [1, 3, 10, 11, 12, 13, 14, 15], "set_setpoint": [1, 10], "setpoint": [1, 3, 10, 14], "setup": 15, "sever": [3, 4, 11, 15], "shape": 15, "ship": 10, "shit": 10, "should": [3, 4], "show": 5, "shown": [1, 5], "sign": 5, "signific": [6, 10], "similar": [9, 10, 25], "similarli": [0, 10], "simpl": [0, 19, 20, 26], "simple_wind": 15, "simpli": [8, 10, 15], "simul": [3, 4, 5, 6, 7, 8, 9, 10, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26, 28], "sinc": 10, "singl": [1, 8, 12], "size": [17, 18, 19, 20, 21, 22, 25, 26], "skip": [0, 3], "slope": 8, "small": 12, "so": [10, 15], "solid": 4, "some": [2, 3, 4, 9, 15], "someth": [1, 10], "sourc": [0, 4, 10], "space": [1, 14, 17, 21, 22], "spacex": 14, "span": 8, "spars": [17, 18, 19, 20, 21, 22, 23, 25, 26], "sparse_reward": [17, 18, 19, 20, 21, 22, 23, 25, 26], "spawn": [1, 25], "spawn_height": 25, "spawn_radiu": 25, "special": 2, "specif": 13, "specifi": [3, 4, 17, 21, 22, 26], "stabl": [17, 21, 22], "stack": 3, "stage": 14, "stall": 8, "standard": [4, 9], "start": [1, 3, 10, 15, 18, 25, 26, 27], "start_orn": [1, 3, 10, 12, 13, 14, 15, 26], "start_po": [1, 3, 10, 12, 13, 14, 15, 26], "starting_fuel_ratio": [4, 11, 14], "starting_veloc": [10, 11, 12], "state": [2, 3, 4, 7, 8, 9, 10, 12, 13, 14, 15], "state_upd": [2, 3, 4, 5, 6, 7, 8, 9], "stateless": 15, "step": [1, 3, 4, 6, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "steppabl": 27, "stone": [2, 3], "store": 10, "str": [3, 10, 12, 13, 14, 25, 26], "straight": 0, "strength": 15, "string": [1, 10], "studio": 0, "subclass": 3, "submodul": 2, "subscript": 1, "success": 18, "suggest": 2, "super": [3, 15], "support": [0, 15, 24, 27], "surfac": [2, 5, 10, 12], "surface_id": 8, "surface_veloc": 8, "suspend": 18, "swee": 28, "swing": 18, "system": [13, 25], "t": [1, 3, 10, 13, 18, 19, 22, 26], "tai": 28, "tai2023pyflyt": 28, "tail": 12, "take": 4, "tank": 4, "target": [17, 19, 20, 21, 22, 26], "target_duty_cycl": [4, 9], "task": 10, "tau": [4, 8, 9], "team": 25, "team_siz": 25, "templat": 3, "term": [6, 10, 17, 18, 19, 20, 21, 22, 23], "termin": [16, 23, 24, 25, 26], "test": [16, 24, 27], "text": 5, "th": 10, "theh": 6, "thei": [3, 4, 5, 15], "them": [0, 1, 5, 10, 17, 21, 22], "thermal": 15, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "thing": [1, 3, 10, 12, 13, 14], "think": 27, "those": [17, 21, 22], "three": [1, 5, 10], "throttl": [4, 9, 14, 23], "throttleabl": [4, 14], "through": [0, 1, 5, 8, 10, 12, 13, 14], "throughout": 10, "thrust": [3, 4, 7, 9, 10, 12, 13, 14, 17, 18, 19, 22, 26], "thrust_coef": 9, "thrust_unit": [4, 9], "tilt": 6, "time": [4, 7, 8, 9, 10, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27], "titl": 28, "too": [20, 21], "tool": 0, "toronto": 13, "torqu": [4, 8, 9], "torque_coef": 9, "total_fuel_mass": 4, "toward": [17, 21, 22], "track": [6, 10], "trail": 12, "train": 25, "trait": [4, 10], "transform": 4, "travel": 8, "true": [1, 10, 15, 25], "trunc": [17, 18, 19, 20, 21, 22, 23], "truncat": [16, 24, 25, 26], "tube": 12, "tupl": [3, 6, 8, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23], "tutori": [2, 3], "two": [1, 5, 7, 12, 13], "type": [1, 3, 4, 6, 7, 8, 9, 13], "typic": [4, 10], "u": 13, "uav": [8, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 26, 28], "uav_id": [4, 5, 6, 8, 9], "unarm": 10, "under": [8, 10], "underli": [3, 10, 20, 21], "uniformli": 5, "uniqu": [4, 10], "unit": [4, 7, 8, 9], "univers": 13, "unstabl": 10, "up": [1, 4, 9, 18], "updat": [3, 5, 8, 10, 12, 13, 14], "update_control": [3, 11, 12, 13, 14], "update_last": [3, 6, 11, 12, 13, 14], "update_phys": [2, 3, 11, 12, 13, 14], "update_st": [2, 3, 8, 11, 12, 13, 14], "updraft": 15, "upright": 20, "uptil": 6, "upward": 1, "urdf": 3, "us": [0, 1, 3, 4, 5, 7, 8, 9, 10, 13, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "usabl": 3, "usag": [4, 15, 16, 24], "use_camera": [3, 10, 12, 13, 14], "use_gimb": [3, 6, 12, 13, 14], "use_yaw_target": 22, "user": [0, 1, 10, 15, 18], "usual": [0, 3, 8, 15], "util": 1, "v": [5, 13], "v1": 14, "v2": [16, 19], "v3": 18, "v_i": 5, "v_x": 5, "v_y": 5, "v_z": 5, "valid": 10, "valu": [3, 4, 6, 7, 9, 14, 25], "valueerror": 3, "vari": 15, "variabl": 15, "variant": 11, "varieti": 4, "variou": [1, 2, 10, 13, 15, 16, 24], "vec3": 8, "vector": [4, 5, 7, 8, 9, 10, 14], "vehicl": [3, 12, 13, 14], "vel": 3, "veloc": [5, 8, 10, 13, 15, 18, 23], "veri": [2, 3, 10], "vertic": [12, 15], "via": 10, "view": 6, "view_mat": 6, "virtual": 0, "viscos": 8, "visit": 27, "visual": 0, "vp": [13, 18, 19, 22, 26], "vq": [13, 18, 19, 22, 26], "vr": [13, 18, 19, 22, 26], "vx": 13, "vy": 13, "vz": 13, "w": 13, "wa": 18, "wai": 0, "want": 10, "we": [0, 1, 3, 4, 10], "weapon": 25, "weight": 12, "well": [1, 15, 24], "were": 14, "what": 10, "wheel": 0, "when": [6, 10, 25], "where": [0, 1, 3, 4, 5, 6, 7, 10, 15, 17, 21, 22, 24, 25, 26], "whether": [3, 4, 6, 10, 17, 18, 19, 20, 21, 22, 23, 25, 26], "which": [5, 10, 17, 21, 22], "while": [0, 2, 3, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "whole": 10, "wide": 24, "width": [6, 25], "wind": 10, "wind_field": 15, "wind_opt": [10, 15], "wind_typ": [10, 15], "windfield": [10, 15], "windfieldclass": [10, 15], "wing": [8, 12], "wish": [0, 10, 28], "within": [2, 6, 10, 25], "without": [2, 17, 21, 22], "won": 10, "wong": 28, "work": 28, "world_scal": 10, "would": [17, 21, 22, 24, 25, 26], "wrapper": [17, 21, 22], "x": [1, 3, 5, 10, 13, 14, 17, 21, 22, 23, 26], "xx": 0, "xy": 15, "xyz": 5, "xz_b": 5, "xz_g": 5, "y": [1, 3, 5, 10, 13, 14, 17, 21, 22, 23], "yaml": [3, 12, 14], "yaw": [1, 3, 12, 14, 17, 22], "year": [0, 28], "ymmv": 0, "you": [0, 1, 10, 17, 21, 22, 24, 25, 26, 27, 28], "your": [2, 3, 24, 25, 26], "z": [1, 3, 5, 10, 13, 15, 17, 21, 22], "zero": [3, 8], "zeros_lik": [10, 15]}, "titles": ["Documentation", "Core", "Abstractions", "Base Drone Class", "Boosters", "Boring Bodies", "Camera", "Gimbals", "Lifting Surfaces", "Motors", "Aviary", "Drones", "Fixedwing", "QuadX", "Rocket", "Wind", "Gymnasium Environments", "PyFlyt/Fixedwing-Waypoints-v3", "PyFlyt/QuadX-Ball-In-Cup-v2", "PyFlyt/QuadX-Hover-v3", "PyFlyt/QuadX-Pole-Balance-v3", "PyFlyt/QuadX-Pole-Waypoints-v3", "PyFlyt/QuadX-Waypoints-v3", "PyFlyt/Rocket-Landing-v3", "PettingZoo Environments", "MAFixedwingDogfightEnvV2", "MAQuadXHoverEnvV2", "PyFlyt - UAV Simulation Environments for Reinforcement Learning Research", "Paper Publication", "Tutorials"], "titleterms": {"In": 18, "abstract": 2, "access": 10, "api": [1, 10], "architectur": 1, "attribut": [3, 10, 15], "aviari": 10, "axi": 1, "balanc": 20, "ball": 18, "base": 3, "bodi": 5, "booster": 4, "bore": 5, "camera": [6, 10], "citat": 28, "class": [3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14], "complex": 15, "control": [10, 12, 13, 14], "convent": 1, "core": [1, 10], "cup": 18, "custom": [10, 15], "default": [3, 15], "descript": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27], "do": 0, "document": 0, "drone": [3, 10, 11], "environ": [0, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27], "exampl": 10, "fixedw": [12, 17], "flatten": [17, 21, 22], "fp": [6, 10], "gener": 1, "gimbal": 7, "gymnasium": [0, 16], "hover": 19, "i": 0, "individu": 10, "instal": 0, "land": 23, "learn": 27, "lift": 8, "linux": 0, "looprat": 10, "maco": 0, "mafixedwingdogfightenvv2": 25, "maquadxhoverenvv2": 26, "mathemat": 8, "method": [3, 10, 15], "mode": [12, 13, 14], "model": [8, 12, 13, 14, 15], "more": [0, 15], "motor": 9, "multi": 10, "option": [3, 10, 17, 18, 19, 20, 21, 22, 23, 25, 26], "overview": [11, 15], "paper": 28, "pettingzoo": [0, 24], "physic": 10, "pole": [20, 21], "preimplement": 15, "preprint": 28, "public": 28, "pyflyt": [17, 18, 19, 20, 21, 22, 23, 27], "quadx": [13, 18, 19, 20, 21, 22], "reinforc": 27, "requir": [3, 15], "research": 27, "rocket": [14, 23], "rule": 25, "set": 10, "setup": 10, "simpl": 15, "simul": 27, "singl": 10, "spawn": 10, "step": 10, "surfac": 8, "task": [17, 18, 19, 20, 21, 22, 23, 25, 26], "tutori": 29, "type": 10, "uav": 27, "usag": [2, 10, 17, 18, 19, 20, 21, 22, 23, 25, 26], "v2": 18, "v3": [17, 19, 20, 21, 22, 23], "variant": [12, 13], "want": 0, "waypoint": [17, 21, 22], "wind": 15, "window": 0}}) \ No newline at end of file +Search.setIndex({"alltitles": {"Abstractions": [[2, null]], "Accessing Individual Drones": [[10, "accessing-individual-drones"]], "Attributes": [[10, "attributes"]], "Aviary": [[10, null]], "Axis Conventions": [[1, "axis-conventions"]], "Base Drone Class": [[3, null]], "Boosters": [[4, null]], "Boring Bodies": [[5, null]], "Camera": [[6, null]], "Camera FPS": [[6, "camera-fps"], [10, "camera-fps"]], "Citation": [[28, "citation"]], "Class Description": [[3, "class-description"], [4, "class-description"], [5, "class-description"], [6, "class-description"], [7, "class-description"], [8, "class-description"], [9, "class-description"], [10, "class-description"], [12, "class-description"], [13, "class-description"], [14, "class-description"]], "Control Mode": [[12, "control-mode"], [14, "control-mode"]], "Control Modes": [[13, "control-modes"]], "Controlling Drone Types": [[10, "controlling-drone-types"]], "Core": [[1, null]], "Core API": [[1, "core-api"]], "Core API Example": [[10, "core-api-example"]], "Default Attributes": [[3, "default-attributes"], [15, "default-attributes"]], "Default Methods": [[3, "default-methods"]], "Description": [[2, "description"], [4, "description"], [5, "description"], [6, "description"], [7, "description"], [8, "description"], [9, "description"], [10, "description"], [27, "description"]], "Documentation": [[0, null]], "Drones": [[11, null]], "Environment Options": [[17, "environment-options"], [18, "environment-options"], [19, "environment-options"], [20, "environment-options"], [21, "environment-options"], [22, "environment-options"], [23, "environment-options"], [25, "environment-options"], [26, "environment-options"]], "Environment Rules": [[25, "environment-rules"]], "Fixedwing": [[12, null]], "Flattening the Environment": [[17, "flattening-the-environment"], [21, "flattening-the-environment"], [22, "flattening-the-environment"]], "General Architecture": [[1, "general-architecture"]], "Gimbals": [[7, null]], "Gymnasium Environments": [[0, "gymnasium-environments"], [16, null]], "I want to do more!": [[0, "i-want-to-do-more"]], "Installation": [[0, "installation"]], "Lifting Surfaces": [[8, null]], "Linux and MacOS": [[0, "linux-and-macos"]], "Looprates": [[10, "looprates"]], "MAFixedwingDogfightEnvV2": [[25, null]], "MAQuadXHoverEnvV2": [[26, null]], "Mathematical Model": [[8, "mathematical-model"]], "Methods": [[10, "methods"]], "Model Description": [[12, "model-description"], [13, "model-description"], [14, "model-description"]], "More Complex Custom Wind Modelling": [[15, "more-complex-custom-wind-modelling"]], "Motors": [[9, null]], "Multi Drone Physics Stepping": [[10, "multi-drone-physics-stepping"]], "Multi Drone Setup": [[10, "multi-drone-setup"]], "Optional Attributes": [[3, "optional-attributes"]], "Optional Methods": [[3, "optional-methods"]], "Overview": [[11, "overview"], [15, "overview"]], "Paper Publication": [[28, null]], "PettingZoo Environments": [[0, "pettingzoo-environments"], [24, null]], "Preimplemented Wind Models": [[15, "preimplemented-wind-models"]], "Preprint": [[28, "preprint"]], "PyFlyt - UAV Simulation Environments for Reinforcement Learning Research": [[27, null]], "PyFlyt/Fixedwing-Waypoints-v3": [[17, null]], "PyFlyt/QuadX-Ball-In-Cup-v2": [[18, null]], "PyFlyt/QuadX-Hover-v3": [[19, null]], "PyFlyt/QuadX-Pole-Balance-v3": [[20, null]], "PyFlyt/QuadX-Pole-Waypoints-v3": [[21, null]], "PyFlyt/QuadX-Waypoints-v3": [[22, null]], "PyFlyt/Rocket-Landing-v3": [[23, null]], "QuadX": [[13, null]], "Required Attributes": [[3, "required-attributes"]], "Required Methods": [[3, "required-methods"], [15, "required-methods"]], "Rocket": [[14, null]], "Setting Drone Options": [[10, "setting-drone-options"]], "Simple Custom Wind Modelling": [[15, "simple-custom-wind-modelling"]], "Single Drone Physics Stepping": [[10, "single-drone-physics-stepping"]], "Spawning Custom Drones": [[10, "spawning-custom-drones"]], "Task Description": [[17, "task-description"], [18, "task-description"], [19, "task-description"], [20, "task-description"], [21, "task-description"], [22, "task-description"], [23, "task-description"], [25, "task-description"], [26, "task-description"]], "Tutorials": [[29, null]], "Usage": [[2, "usage"], [10, "usage"], [17, "usage"], [18, "usage"], [19, "usage"], [20, "usage"], [21, "usage"], [22, "usage"], [23, "usage"], [25, "usage"], [26, "usage"]], "Variants": [[12, "variants"], [13, "variants"]], "Wind": [[15, null]], "Windows": [[0, "windows"]]}, "docnames": ["documentation", "documentation/core", "documentation/core/abstractions", "documentation/core/abstractions/base_drone", "documentation/core/abstractions/boosters", "documentation/core/abstractions/boring_bodies", "documentation/core/abstractions/camera", "documentation/core/abstractions/gimbals", "documentation/core/abstractions/lifting_surfaces", "documentation/core/abstractions/motors", "documentation/core/aviary", "documentation/core/drones", "documentation/core/drones/fixedwing", "documentation/core/drones/quadx", "documentation/core/drones/rocket", "documentation/core/wind", "documentation/gym_envs", "documentation/gym_envs/fixedwing_waypoints_env", "documentation/gym_envs/quadx_ball_in_cup_env", "documentation/gym_envs/quadx_hover_env", "documentation/gym_envs/quadx_pole_balance_env", "documentation/gym_envs/quadx_pole_waypoints_env", "documentation/gym_envs/quadx_waypoints_env", "documentation/gym_envs/rocket_landing_env", "documentation/pz_envs", "documentation/pz_envs/ma_fixedwing_dogfight_env", "documentation/pz_envs/ma_quadx_hover_env", "index", "paper", "tutorials"], "envversion": {"sphinx": 63, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["documentation.md", "documentation/core.md", "documentation/core/abstractions.md", "documentation/core/abstractions/base_drone.md", "documentation/core/abstractions/boosters.md", "documentation/core/abstractions/boring_bodies.md", "documentation/core/abstractions/camera.md", "documentation/core/abstractions/gimbals.md", "documentation/core/abstractions/lifting_surfaces.md", "documentation/core/abstractions/motors.md", "documentation/core/aviary.md", "documentation/core/drones.md", "documentation/core/drones/fixedwing.md", "documentation/core/drones/quadx.md", "documentation/core/drones/rocket.md", "documentation/core/wind.md", "documentation/gym_envs.md", "documentation/gym_envs/fixedwing_waypoints_env.md", "documentation/gym_envs/quadx_ball_in_cup_env.md", "documentation/gym_envs/quadx_hover_env.md", "documentation/gym_envs/quadx_pole_balance_env.md", "documentation/gym_envs/quadx_pole_waypoints_env.md", "documentation/gym_envs/quadx_waypoints_env.md", "documentation/gym_envs/rocket_landing_env.md", "documentation/pz_envs.md", "documentation/pz_envs/ma_fixedwing_dogfight_env.md", "documentation/pz_envs/ma_quadx_hover_env.md", "index.md", "paper.md", "tutorials.md"], "indexentries": {"__call__() (in module pyflyt.core.abstractions.droneclass)": [[15, "PyFlyt.core.abstractions.DroneClass.__call__", false]], "__init__() (in module pyflyt.core.abstractions.windfieldclass)": [[15, "PyFlyt.core.abstractions.WindFieldClass.__init__", false]], "all_aux_states (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.all_aux_states", false]], "all_states (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.all_states", false]], "aux_state (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.aux_state", false]], "aux_state() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.aux_state", false]], "aviary (class in pyflyt.core)": [[10, "PyFlyt.core.Aviary", false]], "aviary_steps (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.aviary_steps", false]], "boosters (class in pyflyt.core.abstractions)": [[4, "PyFlyt.core.abstractions.Boosters", false]], "boringbodies (class in pyflyt.core.abstractions)": [[5, "PyFlyt.core.abstractions.BoringBodies", false]], "camera (class in pyflyt.core.abstractions)": [[6, "PyFlyt.core.abstractions.Camera", false]], "capture_image() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.capture_image", false]], "compute_rotation() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.compute_rotation", false]], "contact_array (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.contact_array", false]], "control_period (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.control_period", false]], "depthimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.depthImg", false]], "disable_artificial_damping() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.disable_artificial_damping", false]], "drone_path (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.drone_path", false]], "droneclass (class in pyflyt.core.abstractions)": [[3, "PyFlyt.core.abstractions.DroneClass", false]], "drones (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.drones", false]], "elapsed_ime (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.elapsed_ime", false]], "fixedwing (class in pyflyt.core.drones)": [[12, "PyFlyt.core.drones.Fixedwing", false]], "fixedwingwaypointsenv (class in pyflyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env)": [[17, "PyFlyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env.FixedwingWaypointsEnv", false]], "get_joint_info() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.get_joint_info", false]], "get_states() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.get_states", false]], "get_states() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.get_states", false]], "get_states() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.get_states", false]], "get_states() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.get_states", false]], "get_states() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.get_states", false]], "get_states() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.get_states", false]], "get_states() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.get_states", false]], "gimbals (class in pyflyt.core.abstractions)": [[7, "PyFlyt.core.abstractions.Gimbals", false]], "id (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.Id", false]], "instanced_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.instanced_controllers", false]], "liftingsurface (class in pyflyt.core.abstractions)": [[8, "PyFlyt.core.abstractions.LiftingSurface", false]], "liftingsurfaces (class in pyflyt.core.abstractions)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces", false]], "mafixedwingdogfightenv (class in pyflyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env)": [[25, "PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env.MAFixedwingDogfightEnv", false]], "maquadxhoverenv (class in pyflyt.pz_envs.quadx_envs.ma_quadx_hover_env)": [[26, "PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env.MAQuadXHoverEnv", false]], "motors (class in pyflyt.core.abstractions.motors)": [[9, "PyFlyt.core.abstractions.motors.Motors", false]], "np_random (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.np_random", false]], "np_random (pyflyt.core.abstractions.windfieldclass property)": [[15, "PyFlyt.core.abstractions.WindFieldClass.np_random", false]], "param_path (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.param_path", false]], "physics_period (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.physics_period", false]], "physics_steps (pyflyt.core.aviary property)": [[10, "PyFlyt.core.Aviary.physics_steps", false]], "physics_update() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.physics_update", false]], "physics_update() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.physics_update", false]], "physics_update() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.physics_update", false]], "physics_update() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.physics_update", false]], "physics_update() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.physics_update", false]], "physics_update() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.physics_update", false]], "physics_update() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.physics_update", false]], "print_all_bodies() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.print_all_bodies", false]], "quadx (class in pyflyt.core.drones)": [[13, "PyFlyt.core.drones.QuadX", false]], "quadxballincupenv (class in pyflyt.gym_envs.quadx_envs.quadx_ball_in_cup_env)": [[18, "PyFlyt.gym_envs.quadx_envs.quadx_ball_in_cup_env.QuadXBallInCupEnv", false]], "quadxhoverenv (class in pyflyt.gym_envs.quadx_envs.quadx_hover_env)": [[19, "PyFlyt.gym_envs.quadx_envs.quadx_hover_env.QuadXHoverEnv", false]], "quadxpolebalanceenv (class in pyflyt.gym_envs.quadx_envs.quadx_pole_balance_env)": [[20, "PyFlyt.gym_envs.quadx_envs.quadx_pole_balance_env.QuadXPoleBalanceEnv", false]], "quadxpolewaypointsenv (class in pyflyt.gym_envs.quadx_envs.quadx_pole_waypoints_env)": [[21, "PyFlyt.gym_envs.quadx_envs.quadx_pole_waypoints_env.QuadXPoleWaypointsEnv", false]], "quadxwaypointsenv (class in pyflyt.gym_envs.quadx_envs.quadx_waypoints_env)": [[22, "PyFlyt.gym_envs.quadx_envs.quadx_waypoints_env.QuadXWaypointsEnv", false]], "register_all_new_bodies() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.register_all_new_bodies", false]], "register_controller() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.register_controller", false]], "register_controller() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.register_controller", false]], "registered_base_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.registered_base_controllers", false]], "registered_controllers (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.registered_controllers", false]], "reset() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.reset", false]], "reset() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.reset", false]], "reset() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.reset", false]], "reset() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.reset", false]], "reset() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.reset", false]], "reset() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.reset", false]], "reset() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.reset", false]], "reset() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.reset", false]], "reset() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.reset", false]], "reset() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.reset", false]], "reset() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.reset", false]], "rgbaimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.rgbaImg", false]], "rocket (class in pyflyt.core.drones)": [[14, "PyFlyt.core.drones.Rocket", false]], "rocketlandingenv (class in pyflyt.gym_envs.rocket_envs.rocket_landing_env)": [[23, "PyFlyt.gym_envs.rocket_envs.rocket_landing_env.RocketLandingEnv", false]], "segimg (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.segImg", false]], "set_all_setpoints() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_all_setpoints", false]], "set_armed() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_armed", false]], "set_mode() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.set_mode", false]], "set_mode() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_mode", false]], "set_mode() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.set_mode", false]], "set_mode() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.set_mode", false]], "set_mode() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.set_mode", false]], "set_setpoint() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.set_setpoint", false]], "setpoint (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.setpoint", false]], "starting_fuel_ratio (pyflyt.core.drones.rocket attribute)": [[14, "PyFlyt.core.drones.Rocket.starting_fuel_ratio", false]], "starting_velocity (pyflyt.core.drones.fixedwing attribute)": [[12, "PyFlyt.core.drones.Fixedwing.starting_velocity", false]], "state (pyflyt.core.abstractions.droneclass property)": [[3, "PyFlyt.core.abstractions.DroneClass.state", false]], "state() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.state", false]], "state_update() (pyflyt.core.abstractions.boosters method)": [[4, "PyFlyt.core.abstractions.Boosters.state_update", false]], "state_update() (pyflyt.core.abstractions.boringbodies method)": [[5, "PyFlyt.core.abstractions.BoringBodies.state_update", false]], "state_update() (pyflyt.core.abstractions.camera method)": [[6, "PyFlyt.core.abstractions.Camera.state_update", false]], "state_update() (pyflyt.core.abstractions.gimbals method)": [[7, "PyFlyt.core.abstractions.Gimbals.state_update", false]], "state_update() (pyflyt.core.abstractions.liftingsurface method)": [[8, "PyFlyt.core.abstractions.LiftingSurface.state_update", false]], "state_update() (pyflyt.core.abstractions.liftingsurfaces method)": [[8, "PyFlyt.core.abstractions.LiftingSurfaces.state_update", false]], "state_update() (pyflyt.core.abstractions.motors.motors method)": [[9, "PyFlyt.core.abstractions.motors.Motors.state_update", false]], "step() (in module pyflyt.core.aviary)": [[10, "PyFlyt.core.Aviary.step", false]], "update_control() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_control", false]], "update_control() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_control", false]], "update_control() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_control", false]], "update_control() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_control", false]], "update_last() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_last", false]], "update_last() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_last", false]], "update_last() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_last", false]], "update_last() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_last", false]], "update_physics() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_physics", false]], "update_physics() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_physics", false]], "update_physics() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_physics", false]], "update_physics() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_physics", false]], "update_state() (in module pyflyt.core.abstractions.droneclass)": [[3, "PyFlyt.core.abstractions.DroneClass.update_state", false]], "update_state() (pyflyt.core.drones.fixedwing method)": [[12, "PyFlyt.core.drones.Fixedwing.update_state", false]], "update_state() (pyflyt.core.drones.quadx method)": [[13, "PyFlyt.core.drones.QuadX.update_state", false]], "update_state() (pyflyt.core.drones.rocket method)": [[14, "PyFlyt.core.drones.Rocket.update_state", false]], "view_mat (pyflyt.core.abstractions.camera property)": [[6, "PyFlyt.core.abstractions.Camera.view_mat", false]], "windfieldclass (class in pyflyt.core.abstractions)": [[15, "PyFlyt.core.abstractions.WindFieldClass", false]]}, "objects": {"PyFlyt.core": [[10, 0, 1, "", "Aviary"]], "PyFlyt.core.Aviary": [[10, 1, 1, "", "all_aux_states"], [10, 1, 1, "", "all_states"], [10, 2, 1, "", "aux_state"], [10, 1, 1, "", "aviary_steps"], [10, 1, 1, "", "contact_array"], [10, 1, 1, "", "drones"], [10, 1, 1, "", "elapsed_ime"], [10, 1, 1, "", "physics_steps"], [10, 2, 1, "", "print_all_bodies"], [10, 2, 1, "", "register_all_new_bodies"], [10, 2, 1, "", "reset"], [10, 2, 1, "", "set_all_setpoints"], [10, 2, 1, "", "set_armed"], [10, 2, 1, "", "set_mode"], [10, 2, 1, "", "set_setpoint"], [10, 2, 1, "", "state"], [10, 2, 1, "", "step"]], "PyFlyt.core.abstractions": [[4, 0, 1, "", "Boosters"], [5, 0, 1, "", "BoringBodies"], [6, 0, 1, "", "Camera"], [3, 0, 1, "", "DroneClass"], [7, 0, 1, "", "Gimbals"], [8, 0, 1, "", "LiftingSurface"], [8, 0, 1, "", "LiftingSurfaces"], [15, 0, 1, "", "WindFieldClass"]], "PyFlyt.core.abstractions.Boosters": [[4, 3, 1, "", "get_states"], [4, 3, 1, "", "physics_update"], [4, 3, 1, "", "reset"], [4, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.BoringBodies": [[5, 3, 1, "", "get_states"], [5, 3, 1, "", "physics_update"], [5, 3, 1, "", "reset"], [5, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.Camera": [[6, 3, 1, "", "capture_image"], [6, 3, 1, "", "get_states"], [6, 3, 1, "", "physics_update"], [6, 3, 1, "", "state_update"], [6, 1, 1, "", "view_mat"]], "PyFlyt.core.abstractions.DroneClass": [[3, 1, 1, "", "Id"], [15, 2, 1, "", "__call__"], [3, 1, 1, "", "aux_state"], [3, 1, 1, "", "control_period"], [3, 1, 1, "", "depthImg"], [3, 2, 1, "", "disable_artificial_damping"], [3, 1, 1, "", "drone_path"], [3, 2, 1, "", "get_joint_info"], [3, 1, 1, "", "instanced_controllers"], [3, 1, 1, "", "np_random"], [3, 1, 1, "", "param_path"], [3, 1, 1, "", "physics_period"], [3, 2, 1, "", "register_controller"], [3, 1, 1, "", "registered_base_controllers"], [3, 1, 1, "", "registered_controllers"], [3, 2, 1, "", "reset"], [3, 1, 1, "", "rgbaImg"], [3, 1, 1, "", "segImg"], [3, 2, 1, "", "set_mode"], [3, 1, 1, "", "setpoint"], [3, 1, 1, "", "state"], [3, 2, 1, "", "update_control"], [3, 2, 1, "", "update_last"], [3, 2, 1, "", "update_physics"], [3, 2, 1, "", "update_state"]], "PyFlyt.core.abstractions.Gimbals": [[7, 3, 1, "", "compute_rotation"], [7, 3, 1, "", "get_states"], [7, 3, 1, "", "physics_update"], [7, 3, 1, "", "reset"], [7, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.LiftingSurface": [[8, 3, 1, "", "get_states"], [8, 3, 1, "", "physics_update"], [8, 3, 1, "", "reset"], [8, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.LiftingSurfaces": [[8, 3, 1, "", "get_states"], [8, 3, 1, "", "physics_update"], [8, 3, 1, "", "reset"], [8, 3, 1, "", "state_update"]], "PyFlyt.core.abstractions.WindFieldClass": [[15, 2, 1, "", "__init__"], [15, 1, 1, "", "np_random"]], "PyFlyt.core.abstractions.motors": [[9, 0, 1, "", "Motors"]], "PyFlyt.core.abstractions.motors.Motors": [[9, 3, 1, "", "get_states"], [9, 3, 1, "", "physics_update"], [9, 3, 1, "", "reset"], [9, 3, 1, "", "state_update"]], "PyFlyt.core.drones": [[12, 0, 1, "", "Fixedwing"], [13, 0, 1, "", "QuadX"], [14, 0, 1, "", "Rocket"]], "PyFlyt.core.drones.Fixedwing": [[12, 3, 1, "", "reset"], [12, 3, 1, "", "set_mode"], [12, 4, 1, "", "starting_velocity"], [12, 3, 1, "", "update_control"], [12, 3, 1, "", "update_last"], [12, 3, 1, "", "update_physics"], [12, 3, 1, "", "update_state"]], "PyFlyt.core.drones.QuadX": [[13, 3, 1, "", "register_controller"], [13, 3, 1, "", "reset"], [13, 3, 1, "", "set_mode"], [13, 3, 1, "", "update_control"], [13, 3, 1, "", "update_last"], [13, 3, 1, "", "update_physics"], [13, 3, 1, "", "update_state"]], "PyFlyt.core.drones.Rocket": [[14, 3, 1, "", "reset"], [14, 3, 1, "", "set_mode"], [14, 4, 1, "", "starting_fuel_ratio"], [14, 3, 1, "", "update_control"], [14, 3, 1, "", "update_last"], [14, 3, 1, "", "update_physics"], [14, 3, 1, "", "update_state"]], "PyFlyt.gym_envs.fixedwing_envs.fixedwing_waypoints_env": [[17, 0, 1, "", "FixedwingWaypointsEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_ball_in_cup_env": [[18, 0, 1, "", "QuadXBallInCupEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_hover_env": [[19, 0, 1, "", "QuadXHoverEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_pole_balance_env": [[20, 0, 1, "", "QuadXPoleBalanceEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_pole_waypoints_env": [[21, 0, 1, "", "QuadXPoleWaypointsEnv"]], "PyFlyt.gym_envs.quadx_envs.quadx_waypoints_env": [[22, 0, 1, "", "QuadXWaypointsEnv"]], "PyFlyt.gym_envs.rocket_envs.rocket_landing_env": [[23, 0, 1, "", "RocketLandingEnv"]], "PyFlyt.pz_envs.fixedwing_envs.ma_fixedwing_dogfight_env": [[25, 0, 1, "", "MAFixedwingDogfightEnv"]], "PyFlyt.pz_envs.quadx_envs.ma_quadx_hover_env": [[26, 0, 1, "", "MAQuadXHoverEnv"]]}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "property", "Python property"], "2": ["py", "function", "Python function"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "objtypes": {"0": "py:class", "1": "py:property", "2": "py:function", "3": "py:method", "4": "py:attribute"}, "terms": {"": [3, 4, 6, 9, 10, 13, 24], "0": [1, 3, 4, 6, 8, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "003": 25, "01305": 28, "05": 14, "07": 25, "1": [1, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 18, 20, 21, 22, 23, 25, 26], "10": [18, 19, 21, 22, 25, 26], "100": 17, "1000": [1, 10, 15], "10th": 14, "120": [3, 10, 12, 13, 14, 15, 17], "128": [3, 12, 13, 14], "2": [1, 3, 5, 7, 10, 12, 13, 14, 15, 17, 21, 22, 25], "20": [12, 13, 20, 21, 25], "200": 23, "2023": 28, "20xx": 0, "225": 5, "2304": 28, "240": [3, 10, 12, 13, 14], "25": 10, "2d": 5, "3": [1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 19, 20, 21, 22, 26], "30": [10, 14, 17, 18, 22, 23, 25, 26], "4": [1, 10, 13, 17, 21, 22], "40": [10, 19, 20, 21, 23, 26], "42": 24, "480": [17, 18, 19, 20, 21, 22, 23], "5": [1, 10, 12, 13, 22, 25], "50": [10, 25], "500": 23, "6": [1, 10, 13], "60": [10, 25], "65": 8, "7": [1, 10, 13, 14, 15], "8": [10, 15], "80": 0, "800": 25, "9": 14, "90": [3, 12, 13, 14], "A": [0, 3, 4, 5, 6, 7, 10, 12, 28], "As": 5, "At": 1, "By": [3, 10], "For": [2, 10, 15, 24], "If": [0, 4, 17, 21, 22, 28], "In": [6, 10], "It": [0, 1, 2, 3, 4, 6, 10, 13, 27], "NOT": 4, "OR": 8, "On": [1, 6], "The": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "Then": [1, 15], "These": [10, 11], "To": [10, 15, 27], "_": [17, 18, 19, 20, 21, 22, 23], "__call__": 15, "__file__": 3, "__init__": [3, 15], "_lowercase_": 10, "a0": 4, "a1": 4, "abil": 9, "abl": 10, "about": [7, 12, 13, 14], "abov": 1, "absolut": 23, "abstract": [1, 3, 4, 5, 6, 7, 8, 9, 15], "accept": [4, 9], "access": 3, "accord": 4, "accur": [3, 5], "achiev": 6, "acrow": [12, 25], "act": [4, 9], "action": [17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "action_spac": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "actual": [4, 9], "actual_duty_cycl": [4, 9], "actuat": [3, 7, 8, 25], "addit": [6, 20], "addition": [4, 9], "adjust": 6, "aerial": 25, "aerodynam": [3, 5, 8], "affect": 5, "after": 7, "agent": [17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "agent_hz": [17, 18, 19, 20, 21, 22, 23, 25, 26], "aggress": [12, 25], "agil": 8, "ai": 25, "aileron": 12, "air": 5, "aircraft": [6, 12, 17, 21, 22, 25], "al": 8, "algorithm": [16, 24, 27], "all": [0, 1, 2, 3, 5, 7, 8, 9, 10, 24, 25, 26], "all_aux_st": 10, "all_param": 3, "all_stat": 10, "allevi": 10, "allow": [1, 2, 4, 9, 10, 17, 18, 19, 20, 21, 22, 25, 26], "along": [9, 10], "alpha_0_bas": 8, "alpha_stall_n_bas": 8, "alpha_stall_p_bas": 8, "also": [4, 10], "altern": 0, "although": 10, "alwai": 4, "amalgam": 1, "amount": [4, 6, 9, 10], "an": [1, 3, 4, 6, 8, 9, 10, 15, 25, 26], "ang_po": [3, 12, 13, 14], "ang_vel": [3, 12, 13, 14], "angl": [6, 8, 10, 22], "angle_represent": [17, 18, 19, 20, 21, 22, 23, 26], "angular": [10, 13, 18, 19, 22, 26], "ani": [3, 5, 10, 20, 21, 27], "anoth": 25, "anyth": [25, 27], "api": [24, 25], "append": 10, "appli": 5, "ar": [0, 1, 2, 3, 4, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "arbitrari": [4, 5, 7, 9], "ardupilot": 13, "area": [5, 17, 18, 19, 20, 21, 22, 23, 25, 26], "arg": 15, "argument": [4, 9, 10, 17, 21, 22], "arm": 10, "around": [4, 7, 9], "arrai": [1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 26], "arrang": 10, "articl": 28, "artifici": 3, "arxiv": 28, "ascend": 10, "asid": 3, "assign": 3, "assisted_flight": 25, "assum": 5, "attach": [4, 6, 15], "attack": 8, "attribut": 1, "author": 28, "automat": [10, 25], "aux": 10, "aux_stat": [3, 10], "auxiliari": [3, 10], "avail": [0, 4, 12, 13, 28], "aviari": [1, 3, 12, 13, 14, 15], "aviary_step": 10, "ax": [1, 5, 7], "axi": [3, 4, 7, 9, 14], "b": [1, 25], "b0": 4, "b1": 4, "backend": 3, "balanc": 21, "bambino": 18, "base": [1, 8], "base_mod": [3, 13], "baselin": [17, 21, 22], "basic": [2, 15], "becaus": [20, 21], "becom": 25, "been": 10, "befor": [3, 22, 25], "begin": 25, "behaviour": 3, "being": [17, 21, 22], "below": [12, 13, 15], "between": [4, 7, 10, 25], "big": 10, "bigger": 12, "bind": [3, 27], "biplan": 27, "bn": 4, "bodi": [1, 4, 6, 10], "body_id": 5, "bool": [3, 4, 6, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 26], "boolean": [4, 10], "booster": [3, 7, 9, 10, 14, 23], "booster_id": 4, "boringbodi": 5, "bottom": 10, "bound": 25, "breakdown": 13, "briefli": 10, "bring": [0, 18], "brusei": 28, "brushless": 9, "bug": 6, "build": 0, "built": [0, 1, 27], "bullet": 27, "bullet_cli": [3, 4, 5, 6, 7, 8, 9], "bulletcli": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14], "burn": 4, "c": [0, 25], "c0": 4, "c1": 4, "c_d": 5, "calcul": 4, "call": [2, 4, 6, 7, 9, 10, 13, 15], "callabl": 10, "camera": 3, "camera_angle_degre": [3, 6, 12, 13, 14], "camera_fov_degre": [3, 6, 12, 13, 14], "camera_fp": [10, 12, 13, 14], "camera_id": 6, "camera_position_offset": [6, 12, 13, 14], "camera_resolut": [3, 6, 12, 13, 14], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27], "cannon": 25, "cannot": 4, "capabl": [1, 15], "captur": [6, 10], "capture_imag": [3, 6], "cardin": 1, "cascad": 13, "case": 1, "caus": 5, "caveat": 10, "cd_0": 8, "cdot": 5, "ceil": 23, "center": 6, "cf2x": 13, "chang": [1, 4, 10, 13], "check": [3, 10], "chord": 8, "cinemat": 6, "circl": 25, "cite": 28, "cl_alpha_2d": 8, "class": [1, 2, 11, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "click": 0, "client": [3, 4, 5, 6, 7, 8, 9], "close": [1, 10, 24, 25, 26], "cmd": [3, 8], "cn": 4, "code": 10, "coeffici": [5, 8, 9], "collis": 10, "command": [3, 4, 8, 9, 17, 20, 21, 25], "command_id": 8, "command_sign": 8, "common": 10, "compat": [17, 21, 22], "complet": [17, 21, 22], "complic": 2, "compon": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "comprehens": [2, 3], "compris": 25, "comput": [5, 9], "compute_rot": 7, "concaten": 3, "concis": [5, 9], "conda": 0, "condit": 8, "cone": 25, "configur": [2, 10, 13, 27], "consid": [3, 17, 21, 22, 25], "consist": 13, "constant": [4, 7, 8, 9, 17, 21, 22], "construct": [2, 3], "consult": 10, "consum": [6, 10], "contact": 10, "contact_arrai": 10, "contain": 10, "context_length": [17, 21, 22], "contribut": 18, "control": [1, 3, 11, 20, 21, 25], "control_hz": [3, 10, 12, 13, 14], "control_period": 3, "controlclass": [3, 13], "controller_constructor": [3, 13], "controller_id": [3, 13], "conveni": [4, 8, 9], "convert": [4, 8, 9], "cooper": 25, "core": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15], "correct": 8, "correspond": [10, 14], "counter": 9, "coupl": 0, "crash": [19, 20, 26], "creat": 3, "creativ": 10, "crucial": 4, "current": [4, 6, 7, 8, 9, 10, 12, 13, 14], "custom": [2, 3, 17, 21, 22, 27], "cycl": [4, 9], "damag": 25, "damage_per_hit": 25, "damp": 3, "datasheet": 14, "deal": 25, "debug": [3, 10], "def": [3, 15], "default": [10, 11, 12, 13, 16, 24], "defin": [1, 3, 9, 10, 15], "deflect": [8, 10, 14], "deflection_limit": 8, "defrag": 18, "degre": [6, 7, 8], "denomin": 10, "densiti": 5, "depend": [3, 4, 5, 6, 9, 10, 15], "deplet": 4, "depth": 6, "depthimg": [3, 6], "describ": [1, 13, 14], "descript": 11, "design": 2, "desir": 1, "desktop": 0, "detail": 0, "develop": 0, "diagon": 4, "dict": [3, 10, 15, 17, 21, 22], "dictionari": 10, "differ": [4, 7, 10, 12, 13, 16, 24], "difficult": 5, "direct": [1, 4, 5, 8, 20, 21], "directli": 25, "directori": 3, "dirnam": 3, "disabl": 3, "disable_artificial_damp": 3, "disconnect": 15, "discret": 27, "displai": 3, "distanc": [6, 17, 18, 21, 22, 23, 25], "do": [3, 9, 10, 15], "document": [2, 3, 12, 13, 27], "doe": [4, 5, 6, 7, 9, 10], "dogfight": 25, "domain": 1, "don": [1, 3], "down": 0, "download": 0, "downtilt": 6, "drag": [5, 8], "drag_coef": 5, "driven": 9, "drone": [1, 2, 4, 5, 6, 8, 9, 12, 13, 14, 18, 19, 20, 25, 27], "drone_index": 10, "drone_model": [3, 10, 12, 13, 14], "drone_opt": 10, "drone_path": 3, "drone_typ": [1, 10, 15], "drone_type_map": 10, "droneclass": [3, 10, 15], "drop": 21, "dtype": [3, 15], "duti": [4, 9], "dynam": [9, 13], "each": [1, 2, 3, 4, 5, 7, 8, 9, 10, 25, 26], "easier": [2, 17, 21, 22], "easili": 9, "east": 1, "edg": 12, "effect": [6, 8, 22, 25], "elabor": 1, "elaps": 10, "elapsed_im": 10, "electr": 9, "element": [4, 10], "elsewher": 2, "enabl": 3, "encourag": 0, "end": [3, 12, 13, 14, 18], "endpoint": 10, "enemi": 25, "engin": [4, 10, 27], "enough": [3, 10], "entiti": 10, "enu": 1, "env": [1, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "environ": [1, 6, 10, 15, 28], "equal": 10, "equat": 5, "equival": 10, "essenti": 1, "et": 8, "eta": 8, "etc": 10, "euler": [3, 10, 17, 18, 19, 20, 21, 22, 23, 26], "even": 10, "everi": [1, 6, 7, 10], "everyth": [0, 12, 13, 14], "exact": [4, 9], "exampl": [0, 2, 3, 15], "except": 9, "exist": 5, "expand": 0, "experienc": [5, 10], "express": 3, "extent": 1, "extinguish": 4, "extract": 14, "f": 3, "f_i": 5, "factor": 8, "falcon": 14, "fall": [5, 23], "fals": [3, 6, 10, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26], "familiar": 5, "fast": [17, 21, 22], "fastest": 24, "featur": 6, "field": [6, 10, 15], "figur": 5, "file": [3, 12, 14], "final": 1, "finlet": 14, "finlet_i": 23, "finlet_rol": 23, "finlet_x": 23, "fire": 25, "first": [0, 1, 7, 10, 14], "fix": [8, 12], "fixedw": [10, 11, 14], "fixedwing_env": [17, 25], "fixedwing_opt": 10, "fixedwing_waypoints_env": 17, "fixedwingwaypointsenv": 17, "flap": [8, 12], "flap_to_chord": 8, "flatten": 2, "flatten_observ": 25, "flattenwaypointenv": [17, 21, 22], "fledg": 0, "flexibl": [1, 27], "fli": 25, "flight": [1, 3, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 26], "flight_dome_s": [17, 18, 19, 20, 21, 22, 25, 26], "flight_mod": [10, 17, 18, 19, 20, 21, 22, 26], "float": [3, 4, 5, 6, 7, 8, 9, 10, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "floor": 10, "fluctuat": [4, 9], "fly": [17, 18, 19, 20, 21, 22, 23, 25, 26], "focu": 6, "folder": 3, "follow": [1, 3, 5, 7, 15], "forc": [4, 5, 8, 9], "form": 3, "forward_unit": 8, "found": [2, 3], "four": 13, "fov": 6, "frac": 5, "frame": [1, 3, 4, 5, 10], "from": [1, 3, 4, 6, 7, 9, 10, 14, 15, 17, 18, 21, 22, 24, 25, 26], "front": 1, "frontal": 5, "fuel": [4, 9, 10, 23], "fuel_burn": 4, "fueltank_id": 4, "full": [4, 8, 25], "fulli": 0, "function": [2, 3, 10, 15, 25], "g": 1, "gener": [3, 4, 5, 6, 7, 8, 9], "geometri": 14, "get": [3, 4, 7, 8, 9, 10, 21, 27], "get_joint_info": 3, "get_stat": [2, 3, 4, 5, 6, 7, 8, 9], "getbasepositionandorient": 3, "getbaseveloc": 3, "geteulerfromquaternion": 3, "getmatrixfromquaternion": 3, "gimbal": [4, 6, 9, 14, 23], "gimbal_command": 7, "gimbal_range_degre": 7, "gimbal_tau": 7, "gimbal_unit_1": 7, "gimbal_unit_2": 7, "github": [6, 10, 18], "give": 10, "go": [0, 23], "goal": [17, 18, 19, 20, 21, 22, 23, 26], "goal_reach_angl": 22, "goal_reach_dist": [17, 18, 21, 22], "goal_reach_veloc": 18, "goe": 10, "gracefulli": [1, 10], "graviti": 1, "greedi": 25, "greedier": 25, "ground": [1, 5, 10, 13, 20], "gun": 25, "gym_env": [16, 17, 18, 19, 20, 21, 22, 23], "gymnasium": [17, 18, 19, 20, 21, 22, 23], "ha": [1, 3, 10, 14, 25], "hand": [7, 9], "handl": [1, 8, 10, 12, 13, 14], "handler": [8, 10], "happen": 3, "have": [1, 2, 3, 4, 9, 10, 15, 17, 21, 22], "health": 25, "height": [6, 15, 25], "help": 0, "here": [0, 10, 28, 29], "high": 25, "higher": 12, "highli": [0, 1], "hit": [20, 25], "hook": 15, "horizon": 6, "horizont": [1, 12, 23], "horri": 28, "hour": 0, "hover": [16, 20, 26], "how": [10, 16, 17, 21, 22, 24, 25], "howev": [10, 17, 21, 22], "human": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "hz": 10, "i": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "id": [3, 4, 5, 6, 7, 8, 9, 10], "idea": 5, "ie": [18, 19, 22, 26], "ignit": [4, 14, 23], "illustr": 5, "imag": [6, 10], "immedi": [17, 21, 22], "implement": [2, 3, 4, 5, 13, 15], "implicit": 6, "import": [1, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "includ": [12, 13, 14, 17, 21, 22], "incur": 25, "index": [1, 4, 10], "indic": 4, "individu": 5, "inertia": 4, "infin": 6, "info": [16, 24, 25, 26], "inform": [2, 3, 10], "inherit": 3, "initi": [3, 12, 13, 14, 15, 16, 24], "innocent": 28, "insert": [24, 25, 26], "inspir": 13, "instanc": [10, 12, 13, 14], "instanced_control": 3, "instanti": [1, 10], "instead": [6, 7, 10, 25], "int": [3, 4, 5, 6, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 26], "integ": [3, 4, 6, 8, 9, 10], "interact": [17, 18, 19, 20, 21, 22, 23, 25, 26], "interfac": 3, "interstag": 14, "introduc": [18, 20, 21], "invalid": 10, "invari": 15, "ipsum": 15, "is_tracking_camera": 6, "issu": [6, 10], "its": [1, 25], "itself": [1, 3, 5, 6, 13], "jame": 28, "jet": 28, "jim": 28, "joint": 3, "journal": 28, "jun": 28, "just": [0, 1], "keep": 20, "kei": [3, 10], "kg": [5, 12], "khan": 8, "kindli": 29, "king": 28, "kwarg": 15, "lab": 13, "last": 10, "latenc": [20, 21], "later": 10, "latest": 0, "launch": 14, "law": 3, "lead": [10, 25], "learn": [16, 17, 21, 22, 24, 25, 28], "left": [1, 12], "let": 20, "lethal": 25, "lethal_angle_radian": 25, "lethal_dist": 25, "level": [8, 9, 25], "li": 1, "librari": [17, 21, 22, 27], "lift": 2, "lifting_surfac": [3, 8], "lifting_unit": 8, "liftingsurfac": [3, 8], "like": [1, 10, 15, 17, 21, 22], "likewis": 4, "limit": [4, 8], "lin_po": [3, 12, 13, 14], "lin_vel": [3, 12, 13, 14], "linear": [9, 10, 13], "link": [4, 5, 6, 7, 8, 9], "liquid": 4, "list": [4, 5, 8, 9, 10], "lit": 4, "liter": [17, 18, 19, 20, 21, 22, 23, 26], "load": [3, 4, 12, 14], "local": [1, 3, 5, 8, 13], "locat": [3, 4, 9], "lock": 6, "log": 15, "logarithm": 15, "long": [19, 20, 21, 26], "longest": [19, 20, 26], "look": 1, "loop": 10, "looprat": [3, 17, 18, 19, 20, 21, 22, 23, 25, 26], "loos": 1, "lorem": 15, "lose": 25, "lower": 25, "lowercas": 10, "m": [5, 10], "m1": 13, "m2": 13, "m3": 13, "m4": 13, "ma_fixedwing_dogfight_env": 25, "ma_quadx_hover_env": 26, "mafixedwingdogfightenv": 25, "magnitud": 10, "mai": [2, 7, 10, 24], "main": [5, 6, 12], "maintain": [18, 24, 25], "make": [16, 17, 18, 19, 20, 21, 22, 23], "mani": [17, 21, 22, 25], "map": [6, 8, 10], "maquadxhoverenv": [24, 26], "mass": [4, 14], "match": 22, "mathbf": 5, "mathemat": 2, "matmul": 3, "matric": [4, 7, 9], "matrix": [4, 6, 9], "mauro": 28, "max": 4, "max_displac": 23, "max_duration_second": [17, 18, 19, 20, 21, 22, 23, 25, 26], "max_fuel_burn": 4, "max_fuel_r": 4, "max_inertia": 4, "max_rpm": 9, "max_thrust": [4, 9], "maximum": [4, 8, 9, 17, 18, 19, 20, 21, 22, 23, 25, 26], "maxradiu": 25, "mean": 25, "meaning": 4, "meter": [1, 20, 21], "method": 2, "microsoft": 0, "min": [4, 25], "min_thrust": 4, "minimum": [4, 18, 25], "missil": 25, "mode": [1, 3, 10, 11, 15, 17, 18, 19, 20, 21, 22, 26], "model": [2, 3, 10, 11, 25], "model_dir": [3, 12, 13, 14], "modern": 25, "modifi": 4, "moment": 4, "more": [2, 3, 4, 5, 9, 10, 12], "most": [17, 21, 22, 24], "motor": [2, 7, 12, 13, 20, 21], "motor_id": 9, "move": 5, "movement": 1, "much": [10, 20, 21, 25], "multi": [1, 24], "multiag": 26, "multipl": [8, 10], "multirotor": 13, "must": [0, 2, 3, 10, 18, 25], "my_paramet": 15, "mycustomdron": 10, "mywindfield": 15, "n": [1, 4, 5, 9, 10, 15], "nadjim": 28, "name": [2, 3, 10], "nativ": 16, "ndarrai": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 26], "need": [2, 4, 6, 7, 9], "neg": [8, 9], "net": 9, "new": [0, 10, 13], "nois": [4, 9, 15], "noise_ratio": [4, 9], "non": [17, 21, 22], "none": [3, 4, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "noqa": 16, "normal": [4, 5, 8, 9], "normal_area": 5, "north": 1, "nose": 25, "note": 10, "noth": 10, "now": 0, "np": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 26], "np_random": [3, 4, 5, 7, 8, 9, 12, 13, 14, 15], "num_boost": 4, "num_dron": [10, 26], "num_gimb": 7, "num_motor": 9, "num_surfac": 8, "num_target": [17, 21, 22], "number": [1, 3, 4, 5, 7, 8, 9, 10, 17, 21, 22, 25], "numpi": [0, 1, 10, 15, 26], "o": 3, "ob": [16, 17, 18, 19, 20, 21, 22, 23], "object": [1, 6, 8, 10], "observ": [16, 17, 21, 22, 24, 25, 26], "obtain": [4, 9], "off": 4, "offer": [11, 27], "offset": 6, "oh": 10, "onboard": [3, 10], "one": [10, 14], "onli": [10, 12, 13, 14, 22, 23, 25], "onto": 18, "open": 3, "optim": 10, "option": [0, 1, 2, 4, 12, 13, 27], "order": [4, 10], "orient": [1, 3, 6, 10, 15, 26], "orthogon": 7, "other": [3, 7, 25], "otherwis": 3, "our": 28, "out": [1, 10, 25], "output": [3, 4, 9], "outsid": [10, 25], "outward": 25, "overhead": [6, 10], "overrid": 15, "overview": 0, "own": [1, 2, 3, 15], "p": [3, 4, 5, 6, 7, 8, 9, 12, 13, 14], "pad": [17, 21, 22, 23], "page": 10, "pair": 7, "parallelenv": 24, "param": 3, "param_path": 3, "paramet": [3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "parameter": 4, "pass": [1, 8, 10], "path": 3, "penalti": 25, "per": 25, "percent": 4, "perform": [6, 25], "period": [4, 5, 7, 8, 9], "persist": 1, "pettingzoo": 25, "phang": 28, "phyiscs_hz": 3, "physic": [1, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 25, 27], "physics_camera_ratio": 3, "physics_control_ratio": 3, "physics_hz": [3, 4, 9, 10, 12, 13, 14], "physics_period": [3, 4, 5, 7, 8, 9], "physics_step": [3, 10, 12, 13, 14], "physics_upd": [2, 3, 4, 5, 6, 7, 8, 9], "pid": 13, "pip3": 0, "pitch": [3, 12, 17], "pixel": 6, "place": 8, "plain": 5, "plane": [1, 25], "platform": 11, "plu": [4, 9, 15], "point": [1, 4, 6, 25], "pointer": [3, 10], "polici": [24, 25, 26], "popular": [15, 17, 21, 22], "posit": [1, 3, 8, 10, 13, 15, 18, 26], "possibl": [0, 1, 10, 15, 17, 19, 20, 21, 22, 26], "presenc": 4, "present": [4, 9], "primari": 5, "primitive_dron": [10, 13], "principl": 5, "print": 10, "print_all_bodi": 10, "prior": 0, "problem": 10, "produc": [4, 9], "propel": 9, "properti": [3, 4, 6, 10, 14, 15], "proport": 4, "propuls": 4, "provid": [0, 3, 10, 12, 13, 14, 15, 16, 24], "put": 1, "pwm": [4, 9, 20, 21], "px4": 13, "pybullet": [0, 3, 4, 5, 6, 7, 8, 9, 10, 13], "pyflyt": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 24, 25, 26, 28], "python": [0, 1, 15, 27], "pz_env": [24, 25, 26], "q": 13, "quad": 13, "quadcopt": 27, "quadrotor": [13, 19, 20, 21, 22], "quadx": [1, 10, 11, 12, 15, 16], "quadx_ball_in_cup_env": 18, "quadx_env": [18, 19, 20, 21, 22, 26], "quadx_hover_env": 19, "quadx_opt": 10, "quadx_pole_balance_env": 20, "quadx_pole_waypoints_env": 21, "quadx_waypoints_env": 22, "quadxballincupenv": 18, "quadxhoverenv": 19, "quadxpolebalanceenv": 20, "quadxpolewaypointsenv": 21, "quadxwaypointsenv": 22, "quaternion": [17, 18, 19, 20, 21, 22, 23, 26], "queri": 10, "r": 13, "radian": [1, 22], "radiu": 25, "ragdol": 10, "rais": 3, "ramp": [4, 8, 9], "randn": 15, "random": [3, 4, 5, 7, 8, 9, 15], "randomst": [3, 4, 5, 7, 8, 9, 12, 13, 14, 15], "rang": [1, 7, 10, 15, 25], "rate": [3, 4, 18, 19, 22, 26], "ratio": [4, 8, 9, 12], "raw": 10, "rb": 3, "re": 5, "reach": [1, 17, 18, 21, 22], "read": [12, 14], "readabl": [17, 21, 22], "readili": [4, 9], "real": 8, "realpath": 3, "reason": 24, "receiv": [3, 10], "recommend": [0, 6, 10], "redirect": [4, 7, 9], "refer": [1, 2, 5, 15, 29], "referenc": 5, "regist": [10, 13], "register_all_new_bodi": 10, "register_control": [3, 11, 13], "register_wind_field_funct": 15, "registered_base_control": 3, "registered_control": 3, "reignit": 4, "reimplement": 2, "reinforc": [16, 17, 21, 22, 24, 25, 28], "rel": [1, 4], "relev": [1, 2, 3, 6, 10], "reli": 4, "remain": [4, 10, 23], "render": [1, 10, 15, 27], "render_mod": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "render_resolut": [17, 18, 19, 20, 21, 22, 23], "repeatedli": 1, "report": 14, "repositori": 0, "repres": [1, 3, 4, 5, 6, 7, 8, 9, 10], "requir": [2, 9], "research": 28, "reserv": 3, "reset": [2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "resetbasepositionandorient": 3, "reshap": 3, "resolut": 6, "resolv": 5, "result": [5, 10, 17, 21, 22], "return": [2, 3, 4, 6, 7, 8, 9, 10, 15], "revers": 9, "rew": [17, 18, 19, 20, 21, 22, 23], "reward": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "rgb_arrai": [17, 18, 19, 20, 21, 22, 23], "rgba": 6, "rgbaimg": [3, 6], "rgbimg": 10, "rho": 5, "right": [7, 9, 12], "rng": 10, "rocket": [4, 10, 11, 27], "rocket_brick": 3, "rocket_env": 23, "rocket_landing_env": 23, "rocket_opt": 10, "rocketbrick": 10, "rocketlandingenv": 23, "roll": [3, 12, 17], "rosetta": [2, 3], "rotat": [3, 4, 7, 9], "rotation_matrix": [5, 8], "rotation_vector": 7, "round": 10, "rpm": 9, "rpy": [1, 10], "rpyt": 25, "rule": [7, 9], "run": [0, 3, 12, 13, 14], "safe_load": 3, "same": [3, 5, 10], "sampl": [4, 9, 10, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "scale": 14, "scroll": 0, "second": [7, 10, 15], "section": [0, 1, 2, 3, 10], "see": [6, 10], "seed": [10, 24], "segimg": [3, 6], "segment": 6, "select": [0, 12, 13], "self": [3, 10, 15], "sequenc": [5, 10, 17, 21, 22], "seri": [4, 5, 7, 9], "serv": [1, 2, 3], "servo": 7, "set": [0, 1, 2, 3, 4, 7, 12, 13, 14, 15, 17, 21, 22], "set_all_setpoint": 10, "set_arm": 10, "set_mod": [1, 3, 10, 11, 12, 13, 14, 15], "set_setpoint": [1, 10], "setpoint": [1, 3, 10, 14], "setup": 15, "sever": [3, 4, 11, 15], "shape": 15, "ship": 10, "shit": 10, "should": [3, 4], "show": 5, "shown": [1, 5], "sign": 5, "signific": [6, 10], "similar": [9, 10, 25], "similarli": [0, 10], "simpl": [0, 19, 20, 26], "simple_wind": 15, "simpli": [8, 10, 15], "simul": [3, 4, 5, 6, 7, 8, 9, 10, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26, 28], "sinc": 10, "singl": [1, 8, 12], "size": [17, 18, 19, 20, 21, 22, 25, 26], "skip": [0, 3], "slope": 8, "small": 12, "so": [10, 15], "solid": 4, "some": [2, 3, 4, 9, 15], "someth": [1, 10], "sourc": [0, 4, 10], "space": [1, 14, 17, 21, 22], "spacex": 14, "span": 8, "spars": [17, 18, 19, 20, 21, 22, 23, 25, 26], "sparse_reward": [17, 18, 19, 20, 21, 22, 23, 25, 26], "spawn": [1, 25], "spawn_max_height": 25, "spawn_max_radiu": 25, "spawn_min_height": 25, "spawn_min_radiu": 25, "special": 2, "specif": 13, "specifi": [3, 4, 17, 21, 22, 26], "stabl": [17, 21, 22], "stack": 3, "stage": 14, "stall": 8, "standard": [4, 9], "start": [1, 3, 10, 15, 18, 25, 26, 27], "start_orn": [1, 3, 10, 12, 13, 14, 15, 26], "start_po": [1, 3, 10, 12, 13, 14, 15, 26], "starting_fuel_ratio": [4, 11, 14], "starting_veloc": [10, 11, 12], "state": [2, 3, 4, 7, 8, 9, 10, 12, 13, 14, 15], "state_upd": [2, 3, 4, 5, 6, 7, 8, 9], "stateless": 15, "step": [1, 3, 4, 6, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "steppabl": 27, "stone": [2, 3], "store": 10, "str": [3, 10, 12, 13, 14, 25, 26], "straight": 0, "strength": 15, "string": [1, 10], "studio": 0, "subclass": 3, "submodul": 2, "subscript": 1, "success": 18, "suggest": 2, "super": [3, 15], "support": [0, 15, 24, 27], "surfac": [2, 5, 10, 12], "surface_id": 8, "surface_veloc": 8, "suspend": 18, "swee": 28, "swing": 18, "system": [13, 25], "t": [1, 3, 10, 13, 18, 19, 22, 26], "tai": 28, "tai2023pyflyt": 28, "tail": 12, "take": 4, "tank": 4, "target": [17, 19, 20, 21, 22, 26], "target_duty_cycl": [4, 9], "task": 10, "tau": [4, 8, 9], "team": 25, "team_siz": 25, "templat": 3, "term": [6, 10, 17, 18, 19, 20, 21, 22, 23], "termin": [16, 23, 24, 25, 26], "test": [16, 24, 27], "text": 5, "th": 10, "theh": 6, "thei": [3, 4, 5, 15], "them": [0, 1, 5, 10, 17, 21, 22], "thermal": 15, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "thing": [1, 3, 10, 12, 13, 14], "think": 27, "those": [17, 21, 22], "three": [1, 5, 10], "throttl": [4, 9, 14, 23], "throttleabl": [4, 14], "through": [0, 1, 5, 8, 10, 12, 13, 14], "throughout": 10, "thrust": [3, 4, 7, 9, 10, 12, 13, 14, 17, 18, 19, 22, 26], "thrust_coef": 9, "thrust_unit": [4, 9], "tilt": 6, "time": [4, 7, 8, 9, 10, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27], "titl": 28, "too": [20, 21], "too_close_dist": 25, "tool": 0, "toronto": 13, "torqu": [4, 8, 9], "torque_coef": 9, "total_fuel_mass": 4, "toward": [17, 21, 22], "track": [6, 10], "trail": 12, "train": 25, "trait": [4, 10], "transform": 4, "travel": 8, "true": [1, 10, 15, 25], "trunc": [17, 18, 19, 20, 21, 22, 23], "truncat": [16, 24, 25, 26], "tube": 12, "tupl": [3, 6, 8, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23], "tutori": [2, 3], "two": [1, 5, 7, 12, 13], "type": [1, 3, 4, 6, 7, 8, 9, 13], "typic": [4, 10], "u": 13, "uav": [8, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 26, 28], "uav_id": [4, 5, 6, 8, 9], "unarm": 10, "under": [8, 10], "underli": [3, 10, 20, 21], "uniformli": 5, "uniqu": [4, 10], "unit": [4, 7, 8, 9], "univers": 13, "unstabl": 10, "up": [1, 4, 9, 18], "updat": [3, 5, 8, 10, 12, 13, 14], "update_control": [3, 11, 12, 13, 14], "update_last": [3, 6, 11, 12, 13, 14], "update_phys": [2, 3, 11, 12, 13, 14], "update_st": [2, 3, 8, 11, 12, 13, 14], "updraft": 15, "upright": 20, "uptil": 6, "upward": 1, "urdf": 3, "us": [0, 1, 3, 4, 5, 7, 8, 9, 10, 13, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26], "usabl": 3, "usag": [4, 15, 16, 24], "use_camera": [3, 10, 12, 13, 14], "use_gimb": [3, 6, 12, 13, 14], "use_yaw_target": 22, "user": [0, 1, 10, 15, 18], "usual": [0, 3, 8, 15], "util": 1, "v": [5, 13], "v1": 14, "v2": [16, 19], "v3": 18, "v_i": 5, "v_x": 5, "v_y": 5, "v_z": 5, "valid": 10, "valu": [3, 4, 6, 7, 9, 14, 25], "valueerror": 3, "vari": 15, "variabl": 15, "variant": 11, "varieti": 4, "variou": [1, 2, 10, 13, 15, 16, 24], "vec3": 8, "vector": [4, 5, 7, 8, 9, 10, 14], "vehicl": [3, 12, 13, 14], "vel": 3, "veloc": [5, 8, 10, 13, 15, 18, 23], "veri": [2, 3, 10], "vertic": [12, 15], "via": 10, "view": 6, "view_mat": 6, "virtual": 0, "viscos": 8, "visit": 27, "visual": 0, "vp": [13, 18, 19, 22, 26], "vq": [13, 18, 19, 22, 26], "vr": [13, 18, 19, 22, 26], "vx": 13, "vy": 13, "vz": 13, "w": 13, "wa": 18, "wai": 0, "want": 10, "we": [0, 1, 3, 4, 10], "weapon": 25, "weight": 12, "well": [1, 15, 24], "were": 14, "what": 10, "wheel": 0, "when": [6, 10, 25], "where": [0, 1, 3, 4, 5, 6, 7, 10, 15, 17, 21, 22, 24, 25, 26], "whether": [3, 4, 6, 10, 17, 18, 19, 20, 21, 22, 23, 25, 26], "which": [5, 10, 17, 21, 22], "while": [0, 2, 3, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "whole": 10, "wide": 24, "width": [6, 25], "wind": 10, "wind_field": 15, "wind_opt": [10, 15], "wind_typ": [10, 15], "windfield": [10, 15], "windfieldclass": [10, 15], "wing": [8, 12], "wish": [0, 10, 28], "within": [2, 6, 10, 25], "without": [2, 17, 21, 22], "won": 10, "wong": 28, "work": 28, "world_scal": 10, "would": [17, 21, 22, 24, 25, 26], "wrapper": [17, 21, 22], "x": [1, 3, 5, 10, 13, 14, 17, 21, 22, 23, 26], "xx": 0, "xy": 15, "xyz": 5, "xz_b": 5, "xz_g": 5, "y": [1, 3, 5, 10, 13, 14, 17, 21, 22, 23], "yaml": [3, 12, 14], "yaw": [1, 3, 12, 14, 17, 22], "year": [0, 28], "ymmv": 0, "you": [0, 1, 10, 17, 21, 22, 24, 25, 26, 27, 28], "your": [2, 3, 24, 25, 26], "z": [1, 3, 5, 10, 13, 15, 17, 21, 22], "zero": [3, 8], "zeros_lik": [10, 15]}, "titles": ["Documentation", "Core", "Abstractions", "Base Drone Class", "Boosters", "Boring Bodies", "Camera", "Gimbals", "Lifting Surfaces", "Motors", "Aviary", "Drones", "Fixedwing", "QuadX", "Rocket", "Wind", "Gymnasium Environments", "PyFlyt/Fixedwing-Waypoints-v3", "PyFlyt/QuadX-Ball-In-Cup-v2", "PyFlyt/QuadX-Hover-v3", "PyFlyt/QuadX-Pole-Balance-v3", "PyFlyt/QuadX-Pole-Waypoints-v3", "PyFlyt/QuadX-Waypoints-v3", "PyFlyt/Rocket-Landing-v3", "PettingZoo Environments", "MAFixedwingDogfightEnvV2", "MAQuadXHoverEnvV2", "PyFlyt - UAV Simulation Environments for Reinforcement Learning Research", "Paper Publication", "Tutorials"], "titleterms": {"In": 18, "abstract": 2, "access": 10, "api": [1, 10], "architectur": 1, "attribut": [3, 10, 15], "aviari": 10, "axi": 1, "balanc": 20, "ball": 18, "base": 3, "bodi": 5, "booster": 4, "bore": 5, "camera": [6, 10], "citat": 28, "class": [3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14], "complex": 15, "control": [10, 12, 13, 14], "convent": 1, "core": [1, 10], "cup": 18, "custom": [10, 15], "default": [3, 15], "descript": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27], "do": 0, "document": 0, "drone": [3, 10, 11], "environ": [0, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27], "exampl": 10, "fixedw": [12, 17], "flatten": [17, 21, 22], "fp": [6, 10], "gener": 1, "gimbal": 7, "gymnasium": [0, 16], "hover": 19, "i": 0, "individu": 10, "instal": 0, "land": 23, "learn": 27, "lift": 8, "linux": 0, "looprat": 10, "maco": 0, "mafixedwingdogfightenvv2": 25, "maquadxhoverenvv2": 26, "mathemat": 8, "method": [3, 10, 15], "mode": [12, 13, 14], "model": [8, 12, 13, 14, 15], "more": [0, 15], "motor": 9, "multi": 10, "option": [3, 10, 17, 18, 19, 20, 21, 22, 23, 25, 26], "overview": [11, 15], "paper": 28, "pettingzoo": [0, 24], "physic": 10, "pole": [20, 21], "preimplement": 15, "preprint": 28, "public": 28, "pyflyt": [17, 18, 19, 20, 21, 22, 23, 27], "quadx": [13, 18, 19, 20, 21, 22], "reinforc": 27, "requir": [3, 15], "research": 27, "rocket": [14, 23], "rule": 25, "set": 10, "setup": 10, "simpl": 15, "simul": 27, "singl": 10, "spawn": 10, "step": 10, "surfac": 8, "task": [17, 18, 19, 20, 21, 22, 23, 25, 26], "tutori": 29, "type": 10, "uav": 27, "usag": [2, 10, 17, 18, 19, 20, 21, 22, 23, 25, 26], "v2": 18, "v3": [17, 19, 20, 21, 22, 23], "variant": [12, 13], "want": 0, "waypoint": [17, 21, 22], "wind": 15, "window": 0}}) \ No newline at end of file diff --git a/docs/tutorials.html b/docs/tutorials.html index 785630f7..817b6528 100644 --- a/docs/tutorials.html +++ b/docs/tutorials.html @@ -407,7 +407,7 @@

      Tutorials

      - Created using Sphinx 7.4.4. + Created using Sphinx 8.0.2.

      diff --git a/pyproject.toml b/pyproject.toml index 98219845..a79ccd2f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "PyFlyt" -version = "0.25.0" +version = "0.26.0" authors = [ { name="Jet", email="taijunjet@hotmail.com" }, ] From cf2076204ec23c30b63174ad70145f9ea172f63d Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 23 Sep 2024 22:15:35 +0900 Subject: [PATCH 146/146] drop aggressiveness --- PyFlyt/models/vehicles/acrowing/acrowing.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PyFlyt/models/vehicles/acrowing/acrowing.yaml b/PyFlyt/models/vehicles/acrowing/acrowing.yaml index 523735ca..192d5991 100644 --- a/PyFlyt/models/vehicles/acrowing/acrowing.yaml +++ b/PyFlyt/models/vehicles/acrowing/acrowing.yaml @@ -28,7 +28,7 @@ left_wing_flapped_params: alpha_stall_P_base: 16 # Positive stall AoA alpha_stall_N_base: -12 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient - deflection_limit: 45 # Control surface deflection limit in degrees + deflection_limit: 30 # Control surface deflection limit in degrees tau: 0.05 right_wing_flapped_params: @@ -41,7 +41,7 @@ right_wing_flapped_params: alpha_stall_P_base: 16 # Positive stall AoA alpha_stall_N_base: -12 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient - deflection_limit: 45 # Control surface deflection limit in degrees + deflection_limit: 30 # Control surface deflection limit in degrees tau: 0.05 horizontal_tail_params: @@ -54,7 +54,7 @@ horizontal_tail_params: alpha_stall_P_base: 11 # Positive stall AoA alpha_stall_N_base: -11 # Positive stall AoA Cd_0: 0.01 # Skin friction coefficient - deflection_limit: 30 # Control surface deflection limit in degrees + deflection_limit: 20 # Control surface deflection limit in degrees tau: 0.05 vertical_tail_params: