diff --git a/M2/Reinforcement Learning/project/Project_RL_DANJOU_VON-SIEMENS.ipynb b/M2/Reinforcement Learning/project/Project_RL_DANJOU_VON-SIEMENS.ipynb index 11332d9..81734cd 100644 --- a/M2/Reinforcement Learning/project/Project_RL_DANJOU_VON-SIEMENS.ipynb +++ b/M2/Reinforcement Learning/project/Project_RL_DANJOU_VON-SIEMENS.ipynb @@ -17,27 +17,16 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 51, "id": "b50d7174", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using device: mps\n" - ] - } - ], + "outputs": [], "source": [ "import pickle\n", "from collections import deque\n", "from pathlib import Path\n", "\n", "import ale_py # noqa: F401 — registers ALE environments\n", - "import gymnasium as gym\n", - "import supersuit as ss\n", - "from gymnasium.wrappers import FrameStackObservation, ResizeObservation\n", "from pettingzoo.atari import tennis_v3\n", "from tqdm.auto import tqdm\n", "\n", @@ -45,10 +34,7 @@ "import numpy as np\n", "\n", "import torch\n", - "from torch import nn, optim\n", - "\n", - "DEVICE = torch.device(\"mps\" if torch.backends.mps.is_available() else \"cuda\" if torch.cuda.is_available() else \"cpu\")\n", - "print(f\"Using device: {DEVICE}\")\n" + "from torch import nn, optim\n" ] }, { @@ -66,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 52, "id": "ff3486a4", "metadata": {}, "outputs": [], @@ -102,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 53, "id": "be85c130", "metadata": {}, "outputs": [], @@ -110,9 +96,6 @@ "def normalize_obs(observation: np.ndarray) -> np.ndarray:\n", " \"\"\"Flatten and normalize an observation to a 1D float64 vector.\n", "\n", - " Replicates the /255.0 normalization used in all agents from the original project.\n", - " For image observations of shape (4, 84, 84), this produces a vector of length 28_224.\n", - "\n", " Args:\n", " observation: Raw observation array from the environment.\n", "\n", @@ -155,7 +138,6 @@ " if rng.random() < epsilon:\n", " return int(rng.integers(0, q_values.size))\n", "\n", - " # Handle NaN/Inf values safely\n", " finite_mask = np.isfinite(q_values)\n", " if not np.any(finite_mask):\n", " return int(rng.integers(0, q_values.size))\n", @@ -186,7 +168,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 54, "id": "ded9b1fb", "metadata": {}, "outputs": [], @@ -214,8 +196,9 @@ " next_state: np.ndarray,\n", " done: bool,\n", " next_action: int | None = None,\n", + " agent_id: str = \"single\",\n", " ) -> None:\n", - " \"\"\"Update agent parameters from one transition.\"\"\"\n", + " \"\"\"Update the agent's internal state based on a transition.\"\"\"\n", "\n", " def save(self, filename: str) -> None:\n", " \"\"\"Save the agent state to disk using pickle.\"\"\"\n", @@ -225,7 +208,21 @@ " def load(self, filename: str) -> None:\n", " \"\"\"Load the agent state from disk.\"\"\"\n", " with Path(filename).open(\"rb\") as f:\n", - " self.__dict__.update(pickle.load(f)) # noqa: S301\n" + " path = Path(filename).resolve()\n", + " ckpt_root = CHECKPOINT_DIR.resolve()\n", + " if ckpt_root not in path.parents:\n", + " msg = f\"Refusing to load checkpoint outside '{ckpt_root}': {path}\"\n", + " raise ValueError(msg)\n", + " if path.suffix != \".pkl\":\n", + " msg = f\"Unsupported checkpoint format: {path.suffix}\"\n", + " raise ValueError(msg)\n", + "\n", + " state = pickle.load(f) # noqa: S301 - trusted local checkpoints only\n", + " if not isinstance(state, dict):\n", + " msg = \"Invalid checkpoint payload: expected a dict.\"\n", + " raise TypeError(msg)\n", + "\n", + " self.__dict__.update(state)\n" ] }, { @@ -240,7 +237,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 55, "id": "78bdc9d2", "metadata": {}, "outputs": [], @@ -273,7 +270,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 56, "id": "c124ed9a", "metadata": {}, "outputs": [], @@ -312,8 +309,6 @@ " self.n_features = n_features\n", " self.alpha = alpha\n", " self.gamma = gamma\n", - " # Weight matrix: one row per action, analogous to Lab 7's self.w\n", - " # but organized as (n_actions, n_features) for dense features.\n", " self.W = np.zeros((n_actions, n_features), dtype=np.float64)\n", "\n", " def _q_values(self, phi: np.ndarray) -> np.ndarray:\n", @@ -329,7 +324,7 @@ " Array of Q-values, shape (n_actions,).\n", "\n", " \"\"\"\n", - " return self.W @ phi # shape (n_actions,)\n", + " return self.W @ phi\n", "\n", " def get_action(self, observation: np.ndarray, epsilon: float = 0.0) -> int:\n", " \"\"\"Select action using ε-greedy policy over linear Q-values.\n", @@ -349,6 +344,7 @@ " next_state: np.ndarray,\n", " done: bool,\n", " next_action: int | None = None,\n", + " agent_id: str = \"single\",\n", " ) -> None:\n", " \"\"\"Perform one semi-gradient SARSA update.\n", "\n", @@ -359,37 +355,25 @@ " In continuous form with linear approximation (Lab 7 SarsaAgent.update):\n", " delta = target - q(s, a)\n", " W[a] += alpha * delta * phi(s)\n", - "\n", - " Args:\n", - " state: Current observation.\n", - " action: Action taken.\n", - " reward: Reward received.\n", - " next_state: Next observation.\n", - " done: Whether the episode ended.\n", - " next_action: Action chosen in next state (required for SARSA).\n", - "\n", " \"\"\"\n", " phi = np.nan_to_num(normalize_obs(state), nan=0.0, posinf=0.0, neginf=0.0)\n", - " q_sa = float(self.W[action] @ phi) # current estimate q(s, a)\n", + " q_sa = float(self.W[action] @ phi)\n", " if not np.isfinite(q_sa):\n", " q_sa = 0.0\n", "\n", " if done:\n", - " # Terminal: no future value (Lab 5B: gamma * Q[s2, a2] * 0)\n", " target = reward\n", " else:\n", - " # On-policy: use q(s', a') where a' is the actual next action\n", - " # This is the key SARSA property (Lab 5B)\n", - " phi_next = np.nan_to_num(normalize_obs(next_state), nan=0.0, posinf=0.0, neginf=0.0)\n", + " phi_next = np.nan_to_num(\n", + " normalize_obs(next_state), nan=0.0, posinf=0.0, neginf=0.0,\n", + " )\n", " if next_action is None:\n", - " next_action = 0 # fallback, should not happen in practice\n", + " next_action = 0\n", " q_sp_ap = float(self.W[next_action] @ phi_next)\n", " if not np.isfinite(q_sp_ap):\n", " q_sp_ap = 0.0\n", " target = float(reward) + self.gamma * q_sp_ap\n", "\n", - " # Semi-gradient update: W[a] += alpha * delta * phi(s)\n", - " # Analogous to Lab 7: self.w[idx] += self.alpha * delta\n", " if not np.isfinite(target):\n", " return\n", "\n", @@ -418,7 +402,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 57, "id": "f5b5b9ea", "metadata": {}, "outputs": [], @@ -476,6 +460,7 @@ " next_state: np.ndarray,\n", " done: bool,\n", " next_action: int | None = None,\n", + " agent_id: str = \"single\",\n", " ) -> None:\n", " \"\"\"Perform one Q-learning update.\n", "\n", @@ -487,21 +472,19 @@ " delta = target - q(s, a)\n", " W[a] += alpha * delta * phi(s)\n", " \"\"\"\n", - " _ = next_action # Q-learning is off-policy: next_action is not used\n", + " _ = next_action\n", " phi = np.nan_to_num(normalize_obs(state), nan=0.0, posinf=0.0, neginf=0.0)\n", " q_sa = float(self.W[action] @ phi)\n", " if not np.isfinite(q_sa):\n", " q_sa = 0.0\n", "\n", " if done:\n", - " # Terminal state: no future value\n", - " # Lab 5B: gamma * np.max(Q[s2]) * (0 if terminated else 1)\n", " target = reward\n", " else:\n", - " # Off-policy: use max over all actions in next state\n", - " # This is the key Q-learning property (Lab 5B)\n", - " phi_next = np.nan_to_num(normalize_obs(next_state), nan=0.0, posinf=0.0, neginf=0.0)\n", - " q_next_all = self._q_values(phi_next) # q(s', a') for all a'\n", + " phi_next = np.nan_to_num(\n", + " normalize_obs(next_state), nan=0.0, posinf=0.0, neginf=0.0,\n", + " )\n", + " q_next_all = self._q_values(phi_next)\n", " q_next_max = float(np.max(q_next_all))\n", " if not np.isfinite(q_next_max):\n", " q_next_max = 0.0\n", @@ -540,28 +523,13 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 58, "id": "7a3aa454", "metadata": {}, "outputs": [], "source": [ "class MonteCarloAgent(Agent):\n", - " \"\"\"Monte Carlo control agent with linear function approximation.\n", - "\n", - " Inspired by Lab 4 mc_control_epsilon_soft:\n", - " - Accumulates transitions in an episode buffer\n", - " - At episode end (done=True), computes discounted returns backward:\n", - " G = gamma * G + r (same as Lab 4's reversed loop)\n", - " - Updates weights with semi-gradient: W[a] += alpha * (G - q(s,a)) * phi(s)\n", - "\n", - " Unlike TD methods (SARSA, Q-Learning), no update occurs until the episode ends.\n", - "\n", - " Performance optimizations over naive per-step implementation:\n", - " - float32 weights & features (halves memory bandwidth, faster SIMD)\n", - " - Raw observations stored compactly as uint8, batch-normalized at episode end\n", - " - Vectorized return computation & chunk-based weight updates via einsum\n", - " - Single weight sanitization per episode instead of per-step\n", - " \"\"\"\n", + " \"\"\"Monte Carlo control agent with linear function approximation.\"\"\"\n", "\n", " def __init__(\n", " self,\n", @@ -577,15 +545,16 @@ " self.alpha = alpha\n", " self.gamma = gamma\n", " self.W = np.zeros((n_actions, n_features), dtype=np.float32)\n", - " self._obs_buf: list[np.ndarray] = []\n", - " self._act_buf: list[int] = []\n", - " self._rew_buf: list[float] = []\n", + " self._obs_buf: dict[str, list[np.ndarray]] = {}\n", + " self._act_buf: dict[str, list[int]] = {}\n", + " self._rew_buf: dict[str, list[float]] = {}\n", "\n", " def _q_values(self, phi: np.ndarray) -> np.ndarray:\n", + " \"\"\"Compute Q-values.\"\"\"\n", " return self.W @ phi\n", "\n", " def get_action(self, observation: np.ndarray, epsilon: float = 0.0) -> int:\n", - " \"\"\"Select action using ε-greedy policy over linear Q-values.\"\"\"\n", + " \"\"\"Select action using epsilon-greedy policy over linear Q-values.\"\"\"\n", " phi = observation.flatten().astype(np.float32) / np.float32(255.0)\n", " q_vals = self._q_values(phi)\n", " return epsilon_greedy(q_vals, epsilon, self.rng)\n", @@ -598,25 +567,31 @@ " next_state: np.ndarray,\n", " done: bool,\n", " next_action: int | None = None,\n", + " agent_id: str = \"single\",\n", " ) -> None:\n", " \"\"\"Accumulate episode transitions and update weights at episode end.\"\"\"\n", " _ = next_state, next_action\n", "\n", - " self._obs_buf.append(state)\n", - " self._act_buf.append(action)\n", - " self._rew_buf.append(reward)\n", + " if agent_id not in self._obs_buf:\n", + " self._obs_buf[agent_id] = []\n", + " self._act_buf[agent_id] = []\n", + " self._rew_buf[agent_id] = []\n", + "\n", + " self._obs_buf[agent_id].append(state)\n", + " self._act_buf[agent_id].append(action)\n", + " self._rew_buf[agent_id].append(reward)\n", "\n", " if not done:\n", " return\n", "\n", - " n = len(self._rew_buf)\n", - " actions = np.array(self._act_buf, dtype=np.intp)\n", + " n = len(self._rew_buf[agent_id])\n", + " actions = np.array(self._act_buf[agent_id], dtype=np.intp)\n", "\n", " returns = np.empty(n, dtype=np.float32)\n", " G = np.float32(0.0)\n", " gamma32 = np.float32(self.gamma)\n", " for i in range(n - 1, -1, -1):\n", - " G = gamma32 * G + np.float32(self._rew_buf[i])\n", + " G = gamma32 * G + np.float32(self._rew_buf[agent_id][i])\n", " returns[i] = G\n", "\n", " alpha32 = np.float32(self.alpha)\n", @@ -625,7 +600,7 @@ " end = min(start + chunk_size, n)\n", " cs = end - start\n", "\n", - " raw = np.array(self._obs_buf[start:end])\n", + " raw = np.array(self._obs_buf[agent_id][start:end])\n", " phi = raw.reshape(cs, -1).astype(np.float32)\n", " phi /= np.float32(255.0)\n", "\n", @@ -642,9 +617,24 @@ "\n", " self.W = np.nan_to_num(self.W, nan=0.0, posinf=1e6, neginf=-1e6)\n", "\n", + " self._obs_buf[agent_id].clear()\n", + " self._act_buf[agent_id].clear()\n", + " self._rew_buf[agent_id].clear()\n", + "\n", + " def save(self, filename: str) -> None:\n", + " \"\"\"Save agent state, clearing episode buffers first to avoid stale data.\"\"\"\n", " self._obs_buf.clear()\n", " self._act_buf.clear()\n", - " self._rew_buf.clear()\n" + " self._rew_buf.clear()\n", + " super().save(filename)\n", + "\n", + " def load(self, filename: str) -> None:\n", + " \"\"\"Load agent state and ensure correct dtype for weights.\"\"\"\n", + " super().load(filename)\n", + " self.W = np.asarray(self.W, dtype=np.float32)\n", + " self._obs_buf = {}\n", + " self._act_buf = {}\n", + " self._rew_buf = {}\n" ] }, { @@ -670,7 +660,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 59, "id": "9c777493", "metadata": {}, "outputs": [], @@ -738,8 +728,9 @@ " lr: float = 1e-4,\n", " gamma: float = 0.99,\n", " buffer_size: int = 50_000,\n", - " batch_size: int = 128,\n", + " batch_size: int = 64,\n", " target_update_freq: int = 1000,\n", + " train_freq: int = 4,\n", " seed: int = 42,\n", " ) -> None:\n", " \"\"\"Initialize DQN agent.\n", @@ -752,6 +743,7 @@ " buffer_size: Maximum replay buffer capacity.\n", " batch_size: Minibatch size for updates.\n", " target_update_freq: Steps between target network syncs.\n", + " train_freq: Number of steps between each training update.\n", " seed: RNG seed.\n", "\n", " \"\"\"\n", @@ -761,19 +753,20 @@ " self.gamma = gamma\n", " self.batch_size = batch_size\n", " self.target_update_freq = target_update_freq\n", + " self.train_freq = train_freq\n", " self.update_step = 0\n", + " self.train_step = 0\n", "\n", - " # Q-network and target network on GPU\n", " torch.manual_seed(seed)\n", - " self.q_net = QNetwork(n_features, n_actions).to(DEVICE)\n", - " self.target_net = QNetwork(n_features, n_actions).to(DEVICE)\n", + " self.device = torch.device(\"cpu\")\n", + " self.q_net = QNetwork(n_features, n_actions).to(self.device)\n", + " self.target_net = QNetwork(n_features, n_actions).to(self.device)\n", " self.target_net.load_state_dict(self.q_net.state_dict())\n", " self.target_net.eval()\n", "\n", " self.optimizer = optim.Adam(self.q_net.parameters(), lr=lr)\n", - " self.loss_fn = nn.SmoothL1Loss() # Huber loss — more robust than MSE\n", + " self.loss_fn = nn.SmoothL1Loss()\n", "\n", - " # Experience replay buffer\n", " self.replay_buffer = ReplayBuffer(buffer_size)\n", "\n", " def get_action(self, observation: np.ndarray, epsilon: float = 0.0) -> int:\n", @@ -783,8 +776,8 @@ "\n", " phi = normalize_obs(observation)\n", " with torch.no_grad():\n", - " state_t = torch.from_numpy(phi).float().unsqueeze(0).to(DEVICE)\n", - " q_vals = self.q_net(state_t).cpu().numpy().squeeze(0)\n", + " state_t = torch.from_numpy(phi).float().unsqueeze(0).to(self.device)\n", + " q_vals = self.q_net(state_t).numpy().squeeze(0)\n", " return epsilon_greedy(q_vals, 0.0, self.rng)\n", "\n", " def update(\n", @@ -795,49 +788,51 @@ " next_state: np.ndarray,\n", " done: bool,\n", " next_action: int | None = None,\n", + " agent_id: str = \"single\",\n", " ) -> None:\n", " \"\"\"Store transition and perform a minibatch DQN update.\"\"\"\n", - " _ = next_action # DQN is off-policy\n", + " _ = next_action\n", "\n", - " # Store transition\n", " phi_s = normalize_obs(state)\n", " phi_sp = normalize_obs(next_state)\n", " self.replay_buffer.push(phi_s, action, reward, phi_sp, done)\n", "\n", - " if len(self.replay_buffer) < self.batch_size:\n", + " self.update_step += 1\n", + " # Optimize: only train every `train_freq` steps to save computation\n", + " if (\n", + " len(self.replay_buffer) < self.batch_size\n", + " or self.update_step % self.train_freq != 0\n", + " ):\n", " return\n", "\n", - " # Sample minibatch\n", - " states_b, actions_b, rewards_b, next_states_b, dones_b = self.replay_buffer.sample(\n", - " self.batch_size, self.rng,\n", + " states_b, actions_b, rewards_b, next_states_b, dones_b = (\n", + " self.replay_buffer.sample(\n", + " self.batch_size,\n", + " self.rng,\n", + " )\n", " )\n", "\n", - " # Convert to tensors on device\n", - " states_t = torch.from_numpy(states_b).float().to(DEVICE)\n", - " actions_t = torch.from_numpy(actions_b).long().to(DEVICE)\n", - " rewards_t = torch.from_numpy(rewards_b).float().to(DEVICE)\n", - " next_states_t = torch.from_numpy(next_states_b).float().to(DEVICE)\n", - " dones_t = torch.from_numpy(dones_b).float().to(DEVICE)\n", + " states_t = torch.from_numpy(states_b).float().to(self.device)\n", + " actions_t = torch.from_numpy(actions_b).long().to(self.device)\n", + " rewards_t = torch.from_numpy(rewards_b).float().to(self.device)\n", + " next_states_t = torch.from_numpy(next_states_b).float().to(self.device)\n", + " dones_t = torch.from_numpy(dones_b).float().to(self.device)\n", "\n", - " # Current Q-values for taken actions\n", " q_values = self.q_net(states_t)\n", " q_curr = q_values.gather(1, actions_t.unsqueeze(1)).squeeze(1)\n", "\n", - " # Target Q-values (off-policy: max over actions in next state)\n", " with torch.no_grad():\n", " q_next = self.target_net(next_states_t).max(dim=1).values\n", " targets = rewards_t + (1.0 - dones_t) * self.gamma * q_next\n", "\n", - " # Compute loss and update\n", " loss = self.loss_fn(q_curr, targets)\n", " self.optimizer.zero_grad()\n", " loss.backward()\n", " nn.utils.clip_grad_norm_(self.q_net.parameters(), max_norm=10.0)\n", " self.optimizer.step()\n", "\n", - " # Sync target network periodically\n", - " self.update_step += 1\n", - " if self.update_step % self.target_update_freq == 0:\n", + " self.train_step += 1\n", + " if self.train_step % self.target_update_freq == 0:\n", " self.target_net.load_state_dict(self.q_net.state_dict())\n", "\n", " def save(self, filename: str) -> None:\n", @@ -847,23 +842,30 @@ " \"q_net\": self.q_net.state_dict(),\n", " \"target_net\": self.target_net.state_dict(),\n", " \"optimizer\": self.optimizer.state_dict(),\n", - " \"update_step\": self.update_step,\n", + " \"train_step\": self.train_step,\n", " \"n_features\": self.n_features,\n", " \"action_space\": self.action_space,\n", + " \"lr\": self.lr,\n", + " \"gamma\": self.gamma,\n", + " \"batch_size\": self.batch_size,\n", + " \"target_update_freq\": self.target_update_freq,\n", " },\n", " filename,\n", " )\n", "\n", " def load(self, filename: str) -> None:\n", " \"\"\"Load agent state from a torch checkpoint.\"\"\"\n", - " checkpoint = torch.load(filename, map_location=DEVICE, weights_only=False)\n", + " checkpoint = torch.load(filename, map_location=self.device, weights_only=False)\n", " self.q_net.load_state_dict(checkpoint[\"q_net\"])\n", " self.target_net.load_state_dict(checkpoint[\"target_net\"])\n", + " self.train_step = checkpoint.get(\"train_step\", 0)\n", + " self.optimizer = optim.Adam(self.q_net.parameters(), lr=self.lr)\n", " self.optimizer.load_state_dict(checkpoint[\"optimizer\"])\n", - " self.update_step = checkpoint[\"update_step\"]\n", - " self.q_net.to(DEVICE)\n", - " self.target_net.to(DEVICE)\n", - " self.target_net.eval()\n" + "\n", + " buffer_capacity = self.replay_buffer.buffer.maxlen\n", + " if buffer_capacity is None:\n", + " buffer_capacity = 50_000\n", + " self.replay_buffer = ReplayBuffer(buffer_capacity)\n" ] }, { @@ -885,26 +887,14 @@ }, { "cell_type": "code", - "execution_count": 52, - "id": "f9a973dd", + "execution_count": 60, + "id": "13b99a28", "metadata": {}, "outputs": [], "source": [ - "def create_env() -> gym.Env:\n", - " \"\"\"Create the ALE/Tennis-v5 environment with preprocessing wrappers.\n", - "\n", - " Applies:\n", - " - obs_type=\"grayscale\": grayscale observation (210, 160)\n", - " - ResizeObservation(84, 84): downscale to 84x84\n", - " - FrameStackObservation(4): stack 4 consecutive frames -> (4, 84, 84)\n", - "\n", - " Returns:\n", - " Gymnasium environment ready for training.\n", - "\n", - " \"\"\"\n", - " env = gym.make(\"ALE/Tennis-v5\", obs_type=\"grayscale\")\n", - " env = ResizeObservation(env, shape=(84, 84))\n", - " return FrameStackObservation(env, stack_size=4)\n" + "def create_env() -> tennis_v3.env:\n", + " \"\"\"Create a PettingZoo Tennis environment with grayscale, resized, frame-stacked observations.\"\"\"\n", + " return tennis_v3.env(obs_type=\"ram\")\n" ] }, { @@ -922,137 +912,155 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 61, "id": "06b91580", "metadata": {}, "outputs": [], "source": [ - "AGENT_COLORS = {\n", - " \"Random\": \"#95a5a6\",\n", - " \"SARSA\": \"#3498db\",\n", - " \"Q-Learning\": \"#e74c3c\",\n", - " \"MonteCarlo\": \"#2ecc71\",\n", - " \"DQN\": \"#9b59b6\",\n", - "}\n", - "\n", - "\n", "def train_agent(\n", - " env: gym.Env,\n", + " env: tennis_v3.env,\n", " agent: Agent,\n", " name: str,\n", - " *,\n", " episodes: int = 5000,\n", " epsilon_start: float = 1.0,\n", " epsilon_end: float = 0.05,\n", - " epsilon_decay: float = 0.999,\n", + " total_decay_steps: int = 500_000,\n", " max_steps: int = 5000,\n", - ") -> list[float]:\n", - " \"\"\"Pre-train an agent against the built-in Atari AI opponent.\n", - "\n", - " Each agent learns independently by playing full episodes. This is the\n", - " self-play pre-training phase: the agent interacts with the environment's\n", - " built-in opponent and updates its parameters after each transition.\n", - "\n", - " Args:\n", - " env: Gymnasium ALE/Tennis-v5 environment.\n", - " agent: Agent instance to train.\n", - " name: Display name for the progress bar.\n", - " episodes: Number of training episodes.\n", - " epsilon_start: Initial exploration rate.\n", - " epsilon_end: Minimum exploration rate.\n", - " epsilon_decay: Multiplicative decay per episode.\n", - " max_steps: Maximum steps per episode.\n", - "\n", - " Returns:\n", - " List of total rewards per episode.\n", - "\n", - " \"\"\"\n", - " rewards_history: list[float] = []\n", - " epsilon = epsilon_start\n", - "\n", + ") -> dict[str, list[float]]:\n", + " \"\"\"Train the given agent in the environment and return training history.\"\"\"\n", + " history = {\"avg_rewards\": [], \"abs_rewards\": [], \"lengths\": []}\n", + " global_step = 0\n", " pbar = tqdm(range(episodes), desc=f\"Training {name}\", leave=True)\n", "\n", " for _ep in pbar:\n", - " obs, _info = env.reset()\n", - " obs = np.asarray(obs)\n", - " total_reward = 0.0\n", + " env.reset()\n", + " last_obs = {}\n", + " last_action = {}\n", + " total_reward = {\"first_0\": 0.0, \"second_0\": 0.0}\n", + " steps_in_episode = 0\n", "\n", - " action = agent.get_action(obs, epsilon=epsilon)\n", - "\n", - " for _step in range(max_steps):\n", - " next_obs, reward, terminated, truncated, _info = env.step(action)\n", - " next_obs = np.asarray(next_obs)\n", - " done = terminated or truncated\n", - " reward = float(reward)\n", - " total_reward += reward\n", - "\n", - " next_action = agent.get_action(next_obs, epsilon=epsilon) if not done else None\n", - "\n", - " agent.update(\n", - " state=obs,\n", - " action=action,\n", - " reward=reward,\n", - " next_state=next_obs,\n", - " done=done,\n", - " next_action=next_action,\n", - " )\n", - "\n", - " if done:\n", + " for step_idx, agent_id in enumerate(env.agent_iter()):\n", + " if step_idx >= max_steps:\n", " break\n", "\n", - " obs = next_obs\n", - " action = next_action\n", + " steps_in_episode = step_idx\n", + " obs, reward, termination, truncation, _info = env.last()\n", + " done = termination or truncation\n", + " obs_arr = np.asarray(obs)\n", "\n", - " rewards_history.append(total_reward)\n", - " epsilon = max(epsilon_end, epsilon * epsilon_decay)\n", + " total_reward[agent_id] += float(reward)\n", "\n", - " recent_window = 50\n", - " if len(rewards_history) >= recent_window:\n", - " recent_avg = np.mean(rewards_history[-recent_window:])\n", - " pbar.set_postfix(\n", - " avg50=f\"{recent_avg:.1f}\",\n", - " eps=f\"{epsilon:.3f}\",\n", - " rew=f\"{total_reward:.0f}\",\n", + " epsilon = max(\n", + " epsilon_end,\n", + " epsilon_start\n", + " - global_step / total_decay_steps * (epsilon_start - epsilon_end),\n", " )\n", "\n", - " return rewards_history\n", + " action = None if done else agent.get_action(obs_arr, epsilon=epsilon)\n", + "\n", + " if agent_id in last_obs:\n", + " agent.update(\n", + " state=last_obs[agent_id],\n", + " action=last_action[agent_id],\n", + " reward=float(reward),\n", + " next_state=obs_arr,\n", + " done=done,\n", + " next_action=action,\n", + " agent_id=agent_id,\n", + " )\n", + "\n", + " if action is not None:\n", + " last_obs[agent_id] = obs_arr\n", + " last_action[agent_id] = action\n", + " global_step += 1\n", + "\n", + " env.step(action)\n", + "\n", + " history[\"avg_rewards\"].append(\n", + " (total_reward[\"first_0\"] + total_reward[\"second_0\"]) / 2.0,\n", + " )\n", + " history[\"abs_rewards\"].append(abs(total_reward[\"first_0\"]))\n", + " history[\"lengths\"].append(float(steps_in_episode))\n", + "\n", + " recent_window = 50\n", + " if len(history[\"avg_rewards\"]) >= recent_window:\n", + " recent_avg = np.mean(history[\"avg_rewards\"][-recent_window:])\n", + " pbar.set_postfix(\n", + " avg50=f\"{recent_avg:.1f}\",\n", + " eps=f\"{epsilon:.3f}\",\n", + " len=f\"{steps_in_episode}\",\n", + " steps=f\"{global_step}\",\n", + " )\n", + "\n", + " return history\n", "\n", "def plot_training_curves(\n", - " training_histories: dict[str, list[float]],\n", + " training_histories: dict[str, dict[str, list[float]]],\n", " path: str,\n", " window: int = 100,\n", ") -> None:\n", - " \"\"\"Plot training reward curves for all agents on a single figure.\n", + " \"\"\"Plot training curves for multiple agents, showing average rewards, reward intensity, and episode lengths.\"\"\"\n", + " fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(13, 10), sharex=True)\n", "\n", - " Uses a moving average to smooth the curves.\n", - "\n", - " Args:\n", - " training_histories: Dict mapping agent names to reward lists.\n", - " path: File path to save the plot image.\n", - " window: Moving average window size.\n", - "\n", - " \"\"\"\n", - " fig, ax = plt.subplots(figsize=(13, 6))\n", - "\n", - " for name, rewards in training_histories.items():\n", + " for name, data in training_histories.items():\n", " color = AGENT_COLORS.get(name, \"#7f8c8d\")\n", - " if len(rewards) >= window:\n", - " ma = np.convolve(rewards, np.ones(window) / window, mode=\"valid\")\n", - " x = np.arange(window - 1, len(rewards))\n", - " ax.plot(x, ma, label=name, color=color, linewidth=2)\n", - " ax.fill_between(x, ma - np.std(rewards) * 0.3, ma + np.std(rewards) * 0.3,\n", - " color=color, alpha=0.1)\n", - " else:\n", - " ax.plot(rewards, label=f\"{name} (raw)\", color=color, linewidth=1.5, alpha=0.7)\n", "\n", - " ax.set_xlabel(\"Episodes\", fontsize=12)\n", - " ax.set_ylabel(f\"Average Reward (window = {window})\", fontsize=12)\n", - " ax.set_title(\"Training Curves (vs Built-in AI)\", fontsize=14, fontweight=\"bold\")\n", - " ax.legend(fontsize=10, framealpha=0.9)\n", - " ax.grid(visible=True, alpha=0.3, linestyle=\"--\")\n", - " ax.axhline(y=0, color=\"gray\", linewidth=0.8, linestyle=\":\", alpha=0.5)\n", - " ax.spines[\"top\"].set_visible(False)\n", - " ax.spines[\"right\"].set_visible(False)\n", + " rewards = data[\"avg_rewards\"]\n", + " abs_rewards = data[\"abs_rewards\"]\n", + " if len(rewards) >= window:\n", + " ma_rew = np.convolve(rewards, np.ones(window) / window, mode=\"valid\")\n", + " ma_abs = np.convolve(abs_rewards, np.ones(window) / window, mode=\"valid\")\n", + " x = np.arange(window - 1, len(rewards))\n", + "\n", + " ax1.plot(x, ma_rew, label=f\"{name} (Average)\", color=color, linewidth=2)\n", + " ax1.plot(\n", + " x,\n", + " ma_abs,\n", + " label=f\"{name} (Intensity)\",\n", + " color=color,\n", + " linewidth=1.5,\n", + " linestyle=\"--\",\n", + " alpha=0.6,\n", + " )\n", + " ax1.fill_between(\n", + " x,\n", + " ma_rew - np.std(rewards) * 0.2,\n", + " ma_rew + np.std(rewards) * 0.2,\n", + " color=color,\n", + " alpha=0.1,\n", + " )\n", + "\n", + " lengths = data[\"lengths\"]\n", + " if len(lengths) >= window:\n", + " ma_len = np.convolve(lengths, np.ones(window) / window, mode=\"valid\")\n", + " ax2.plot(x, ma_len, label=name, color=color, linewidth=2)\n", + " ax2.fill_between(\n", + " x,\n", + " ma_len - np.std(lengths) * 0.2,\n", + " ma_len + np.std(lengths) * 0.2,\n", + " color=color,\n", + " alpha=0.1,\n", + " )\n", + "\n", + " ax1.set_ylabel(f\"Reward (MA {window})\", fontsize=12)\n", + " ax1.set_title(\n", + " \"Training Rewards & Intensity (Self-Play)\", fontsize=14, fontweight=\"bold\",\n", + " )\n", + " ax1.legend(fontsize=9, loc=\"upper left\", ncol=2)\n", + " ax1.grid(alpha=0.3, linestyle=\"--\")\n", + " ax1.axhline(y=0, color=\"black\", linewidth=0.8, alpha=0.4)\n", + "\n", + " ax2.set_xlabel(\"Episodes\", fontsize=12)\n", + " ax2.set_ylabel(f\"Steps per Episode (MA {window})\", fontsize=12)\n", + " ax2.set_title(\n", + " \"Episode Duration (Stability/Survival)\", fontsize=14, fontweight=\"bold\",\n", + " )\n", + " ax2.grid(alpha=0.3, linestyle=\"--\")\n", + "\n", + " for ax in [ax1, ax2]:\n", + " ax.spines[\"top\"].set_visible(False)\n", + " ax.spines[\"right\"].set_visible(False)\n", + "\n", " fig.tight_layout()\n", " plt.savefig(path, dpi=150, bbox_inches=\"tight\")\n", " plt.show()\n" @@ -1083,37 +1091,22 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 72, "id": "6f6ba8df", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Observation shape : (4, 84, 84)\n", - "Feature vector dim: 28224\n", - "Number of actions : 18\n" - ] - } - ], + "outputs": [], "source": [ - "# Create environment\n", "env = create_env()\n", - "obs, _info = env.reset()\n", + "env.reset()\n", + "obs, *_ = env.last()\n", "\n", - "n_actions = int(env.action_space.n)\n", - "n_features = int(np.prod(obs.shape))\n", + "n_actions = env.action_space(\"first_0\").n\n", + "n_features = 128\n", "\n", - "print(f\"Observation shape : {obs.shape}\")\n", - "print(f\"Feature vector dim: {n_features}\")\n", - "print(f\"Number of actions : {n_actions}\")\n", - "\n", - "# Instantiate agents\n", "agent_random = RandomAgent(seed=42, action_space=int(n_actions))\n", - "agent_sarsa = SarsaAgent(n_features=n_features, n_actions=n_actions, alpha=1e-5)\n", - "agent_q = QLearningAgent(n_features=n_features, n_actions=n_actions, alpha=1e-5)\n", - "agent_mc = MonteCarloAgent(n_features=n_features, n_actions=n_actions, alpha=1e-5)\n", + "agent_sarsa = SarsaAgent(n_features=n_features, n_actions=n_actions, alpha=1e-4)\n", + "agent_q = QLearningAgent(n_features=n_features, n_actions=n_actions, alpha=1e-4)\n", + "agent_mc = MonteCarloAgent(n_features=n_features, n_actions=n_actions, alpha=1e-4)\n", "agent_dqn = DQNAgent(n_features=n_features, n_actions=n_actions)\n", "\n", "agents = {\n", @@ -1122,12 +1115,20 @@ " \"Q-Learning\": agent_q,\n", " \"MonteCarlo\": agent_mc,\n", " \"DQN\": agent_dqn,\n", + "}\n", + "\n", + "AGENT_COLORS = {\n", + " \"Random\": \"#95a5a6\",\n", + " \"SARSA\": \"#3498db\",\n", + " \"Q-Learning\": \"#e74c3c\",\n", + " \"MonteCarlo\": \"#2ecc71\",\n", + " \"DQN\": \"#9b59b6\",\n", "}\n" ] }, { "cell_type": "code", - "execution_count": 55, + "execution_count": null, "id": "4d449701", "metadata": {}, "outputs": [ @@ -1135,139 +1136,88 @@ "name": "stdout", "output_type": "stream", "text": [ - "Selected agent: Q-Learning\n", - "Checkpoint path: checkpoints/q_learning.pkl\n", - "\n", - "============================================================\n", - "Training: Q-Learning (3000 episodes)\n", - "============================================================\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Selected agent: Q-Learning\n", - "Checkpoint path: checkpoints/q_learning.pkl\n", - "\n", - "============================================================\n", - "Training: Q-Learning (3000 episodes)\n", - "============================================================\n" + "Starting training for Q-Learning...\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0c3a441131c648749a7d938732265143", + "model_id": "0f0c108ba22041e9a6077cbfcbbd96ed", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Training Q-Learning: 0%| | 0/3000 [00:00 \u001b[39m\u001b[32m28\u001b[39m training_histories[AGENT_TO_TRAIN] = \u001b[43mtrain_agent\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 29\u001b[39m \u001b[43m \u001b[49m\u001b[43menv\u001b[49m\u001b[43m=\u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 30\u001b[39m \u001b[43m \u001b[49m\u001b[43magent\u001b[49m\u001b[43m=\u001b[49m\u001b[43magent\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 31\u001b[39m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m=\u001b[49m\u001b[43mAGENT_TO_TRAIN\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 32\u001b[39m \u001b[43m \u001b[49m\u001b[43mepisodes\u001b[49m\u001b[43m=\u001b[49m\u001b[43mTRAINING_EPISODES\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 33\u001b[39m \u001b[43m \u001b[49m\u001b[43mepsilon_start\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m1.0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 34\u001b[39m \u001b[43m \u001b[49m\u001b[43mepsilon_end\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0.05\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 35\u001b[39m \u001b[43m \u001b[49m\u001b[43mepsilon_decay\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0.999\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 36\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 38\u001b[39m avg_last_100 = np.mean(training_histories[AGENT_TO_TRAIN][-\u001b[32m100\u001b[39m:])\n\u001b[32m 39\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m-> \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mAGENT_TO_TRAIN\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m avg reward (last 100 eps): \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mavg_last_100\u001b[38;5;132;01m:\u001b[39;00m\u001b[33m.2f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[53]\u001b[39m\u001b[32m, line 45\u001b[39m, in \u001b[36mtrain_agent\u001b[39m\u001b[34m(env, agent, name, episodes, epsilon_start, epsilon_end, epsilon_decay, max_steps)\u001b[39m\n\u001b[32m 42\u001b[39m action = agent.get_action(obs, epsilon=epsilon)\n\u001b[32m 44\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m _step \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(max_steps):\n\u001b[32m---> \u001b[39m\u001b[32m45\u001b[39m next_obs, reward, terminated, truncated, _info = \u001b[43menv\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 46\u001b[39m next_obs = np.asarray(next_obs)\n\u001b[32m 47\u001b[39m done = terminated \u001b[38;5;129;01mor\u001b[39;00m truncated\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Workspace/studies/.venv/lib/python3.13/site-packages/gymnasium/wrappers/stateful_observation.py:425\u001b[39m, in \u001b[36mFrameStackObservation.step\u001b[39m\u001b[34m(self, action)\u001b[39m\n\u001b[32m 414\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mstep\u001b[39m(\n\u001b[32m 415\u001b[39m \u001b[38;5;28mself\u001b[39m, action: WrapperActType\n\u001b[32m 416\u001b[39m ) -> \u001b[38;5;28mtuple\u001b[39m[WrapperObsType, SupportsFloat, \u001b[38;5;28mbool\u001b[39m, \u001b[38;5;28mbool\u001b[39m, \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any]]:\n\u001b[32m 417\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Steps through the environment, appending the observation to the frame buffer.\u001b[39;00m\n\u001b[32m 418\u001b[39m \n\u001b[32m 419\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 423\u001b[39m \u001b[33;03m Stacked observations, reward, terminated, truncated, and info from the environment\u001b[39;00m\n\u001b[32m 424\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m425\u001b[39m obs, reward, terminated, truncated, info = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43menv\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 426\u001b[39m \u001b[38;5;28mself\u001b[39m.obs_queue.append(obs)\n\u001b[32m 428\u001b[39m updated_obs = deepcopy(\n\u001b[32m 429\u001b[39m concatenate(\u001b[38;5;28mself\u001b[39m.env.observation_space, \u001b[38;5;28mself\u001b[39m.obs_queue, \u001b[38;5;28mself\u001b[39m.stacked_obs)\n\u001b[32m 430\u001b[39m )\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Workspace/studies/.venv/lib/python3.13/site-packages/gymnasium/core.py:560\u001b[39m, in \u001b[36mObservationWrapper.step\u001b[39m\u001b[34m(self, action)\u001b[39m\n\u001b[32m 556\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mstep\u001b[39m(\n\u001b[32m 557\u001b[39m \u001b[38;5;28mself\u001b[39m, action: ActType\n\u001b[32m 558\u001b[39m ) -> \u001b[38;5;28mtuple\u001b[39m[WrapperObsType, SupportsFloat, \u001b[38;5;28mbool\u001b[39m, \u001b[38;5;28mbool\u001b[39m, \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any]]:\n\u001b[32m 559\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Modifies the :attr:`env` after calling :meth:`step` using :meth:`self.observation` on the returned observations.\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m560\u001b[39m observation, reward, terminated, truncated, info = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43menv\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 561\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.observation(observation), reward, terminated, truncated, info\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Workspace/studies/.venv/lib/python3.13/site-packages/gymnasium/wrappers/common.py:393\u001b[39m, in \u001b[36mOrderEnforcing.step\u001b[39m\u001b[34m(self, action)\u001b[39m\n\u001b[32m 391\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m._has_reset:\n\u001b[32m 392\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ResetNeeded(\u001b[33m\"\u001b[39m\u001b[33mCannot call env.step() before calling env.reset()\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m393\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Workspace/studies/.venv/lib/python3.13/site-packages/gymnasium/core.py:327\u001b[39m, in \u001b[36mWrapper.step\u001b[39m\u001b[34m(self, action)\u001b[39m\n\u001b[32m 323\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mstep\u001b[39m(\n\u001b[32m 324\u001b[39m \u001b[38;5;28mself\u001b[39m, action: WrapperActType\n\u001b[32m 325\u001b[39m ) -> \u001b[38;5;28mtuple\u001b[39m[WrapperObsType, SupportsFloat, \u001b[38;5;28mbool\u001b[39m, \u001b[38;5;28mbool\u001b[39m, \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any]]:\n\u001b[32m 326\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Uses the :meth:`step` of the :attr:`env` that can be overwritten to change the returned data.\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m327\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43menv\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Workspace/studies/.venv/lib/python3.13/site-packages/gymnasium/wrappers/common.py:285\u001b[39m, in \u001b[36mPassiveEnvChecker.step\u001b[39m\u001b[34m(self, action)\u001b[39m\n\u001b[32m 283\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m env_step_passive_checker(\u001b[38;5;28mself\u001b[39m.env, action)\n\u001b[32m 284\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m285\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43menv\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Workspace/studies/.venv/lib/python3.13/site-packages/ale_py/env.py:305\u001b[39m, in \u001b[36mAtariEnv.step\u001b[39m\u001b[34m(self, action)\u001b[39m\n\u001b[32m 303\u001b[39m reward = \u001b[32m0.0\u001b[39m\n\u001b[32m 304\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m _ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(frameskip):\n\u001b[32m--> \u001b[39m\u001b[32m305\u001b[39m reward += \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43male\u001b[49m\u001b[43m.\u001b[49m\u001b[43mact\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrength\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 307\u001b[39m is_terminal = \u001b[38;5;28mself\u001b[39m.ale.game_over(with_truncation=\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[32m 308\u001b[39m is_truncated = \u001b[38;5;28mself\u001b[39m.ale.game_truncated()\n", - "\u001b[31mKeyboardInterrupt\u001b[39m: " - ] } ], "source": [ "AGENT_TO_TRAIN = \"Q-Learning\"\n", - "TRAINING_EPISODES = 3000\n", + "EPISODES = 10_000\n", "FORCE_RETRAIN = True\n", "\n", - "if AGENT_TO_TRAIN not in agents:\n", - " msg = f\"Unknown agent '{AGENT_TO_TRAIN}'. Available: {list(agents)}\"\n", - " raise ValueError(msg)\n", "\n", - "training_histories: dict[str, list[float]] = {}\n", + "training_histories = {}\n", "agent = agents[AGENT_TO_TRAIN]\n", "checkpoint_path = get_path(AGENT_TO_TRAIN)\n", "\n", - "print(f\"Selected agent: {AGENT_TO_TRAIN}\")\n", - "print(f\"Checkpoint path: {checkpoint_path}\")\n", - "\n", - "if AGENT_TO_TRAIN == \"Random\":\n", - " print(\"Random is a baseline and is not trained.\")\n", - " training_histories[AGENT_TO_TRAIN] = []\n", - "elif checkpoint_path.exists() and not FORCE_RETRAIN:\n", + "if checkpoint_path.exists() and not FORCE_RETRAIN:\n", " agent.load(str(checkpoint_path))\n", - " print(\"Checkpoint found -> weights loaded, training skipped.\")\n", - " training_histories[AGENT_TO_TRAIN] = []\n", + " training_histories[AGENT_TO_TRAIN] = {\n", + " \"avg_rewards\": [],\n", + " \"abs_rewards\": [],\n", + " \"lengths\": [],\n", + " }\n", + " print(f\"Loaded {AGENT_TO_TRAIN} from checkpoint.\")\n", "else:\n", - " print(f\"\\n{'='*60}\")\n", - " print(f\"Training: {AGENT_TO_TRAIN} ({TRAINING_EPISODES} episodes)\")\n", - " print(f\"{'='*60}\")\n", + " print(f\"Starting training for {AGENT_TO_TRAIN}...\")\n", + "\n", + " d_steps = 500_000 if AGENT_TO_TRAIN in [\"DQN\", \"MonteCarlo\"] else 1_000_000\n", + " e_end = 0.05 if AGENT_TO_TRAIN in [\"DQN\", \"MonteCarlo\"] else 0.01\n", "\n", " training_histories[AGENT_TO_TRAIN] = train_agent(\n", " env=env,\n", " agent=agent,\n", " name=AGENT_TO_TRAIN,\n", - " episodes=TRAINING_EPISODES,\n", + " episodes=EPISODES,\n", " epsilon_start=1.0,\n", - " epsilon_end=0.05,\n", - " epsilon_decay=0.999,\n", + " epsilon_end=e_end,\n", + " total_decay_steps=d_steps,\n", + " max_steps=5000,\n", " )\n", "\n", - " avg_last_100 = np.mean(training_histories[AGENT_TO_TRAIN][-100:])\n", - " print(f\"-> {AGENT_TO_TRAIN} avg reward (last 100 eps): {avg_last_100:.2f}\")\n", - "\n", " agent.save(str(checkpoint_path))\n", - " print(\"Checkpoint saved.\")\n" + " rewards = training_histories[AGENT_TO_TRAIN][\"avg_rewards\"]\n", + " if rewards:\n", + " avg_val = float(np.mean(rewards[-100:]))\n", + " print(f\"Final average reward for {AGENT_TO_TRAIN}: {avg_val:.2f}\")\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 74, "id": "a13a65df", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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2fbZZx+bOHGiFRUVWU1Njc2cOdMlu37605/aAw88MOTLki+0vX/2s5+5f6tMuuCCC0Z6kQAAeSI80gsAAACGz7rrrmsXXXRR/PcxY8awubta6rS1tdnKlSvd47333rM777zT/u///s/+8pe/uKRhEOy9995WWVnp/q0kTrZ6+eWX7a677nL/3mKLLWzXXXdN+Psrr7xie+yxh9XV1SU8v2TJEvd466237JZbbrH99tvPRo8ebUHaHyMdw7fffrv76Y+JI4880v7xj38kvK6+vt49lKh84okn7LPPPnNJxGyl7ejfrtrO2eTb3/62/c///I8tX77crrrqKjv99NNt8uTJI71YAICAI0kIAMAIUyuorbfeutvz6m42WNOnT4+3SEFiqzUladSNTwmNF1980T2vhOHXv/51u/HGG+3www8f1k3W0dFhra2tVl5ePmzfscMOO7hHtvvjH/8Y/3eq7f7DH/4wniBUK0LFzDrrrGPt7e324Ycf2lNPPWXz58+3bDeQ/TGSMaxkupe89ZKE999/f0KCcM6cOS4ZqOSn4kkJ3WeffTZjy6iWdlVVVf1+n7rxZnPZqNaZKouuueYad0NDXdzPOOOMkV4sAEDQRQEAQEY99thjUVXB3uPaa6/t8z3z5s1LeI8+4+9//3t0q622ipaWlkbHjx8fPeaYY6KLFy/u9bv0OZ7Vq1dHzzvvvOiWW24ZraysjIbDYfc5W2yxRfR73/te9L777uu2HO+//370hBNOiG6wwQbRsrIy91h//fWjxx9/fPTdd99Nueyffvpp9PDDD4+OHj06Wl5eHt15552jDz30kFtv/7Ila2lpiV5++eXu9XpvUVFRdNKkSdFDDjkk+swzz0T745xzzulxO8gdd9wRLSkpif9d22Pp0qXxvx911FHxv+26665pb+Pk93322WfR73znO9EJEyZEQ6FQ9Pbbb3ev+8tf/hL9xje+Ed1oo42iY8eOdfuiqqrK7YvTTjstumzZsh6/L9XDO6b86z1jxoxu22XlypXuGJgzZ060urrabeMpU6ZEDzrooOiDDz7Y7fXJ+0z76Je//KU7BoqLi6NTp06Nnnrqqe75dDU1Nbl19T7zgw8+SPh7XV1dwnded911KT/nhRdeiG+n/myjTz75JPrTn/40utNOO0WnTZvmjlGti7bDl7/85ehdd93V53Zoa2uL/uIXv4iuu+667jiaOXOm266tra0J7+ttf+h37296XV/HV1/rp2Pvr3/9a/x3xeqqVasSvrO2ttbtc+81N998c7dtque1LTo7O91zJ598cvz16623XjQSiXTbPtpnTz/9dNrrnqp86+l9y5cvj/7whz90x1pBQYHbztpnvZWnhx56aPzve+21V6/fqfjsKdbl3nvvjf9d3//555/H99N3v/tdV56qnNIxpG2uY+Loo4+OvvHGG90+q7dyRRSD/m0NAMBwI0kIAEAOJgn32GOPlImBddZZJyG51VsCa7fddus1yXDYYYclLMMtt9ziEpI9vV7JkZtuuqnbcuuCOfm1SpDtv//+PSYJtQ6zZ8/u8bt0cX7ZZZcNWZJQLrroooTX/OpXvxrSJKESacnbwksSKknX275QQmTBggX9ToD1lph55513XFKst89R8qy35JgSa6ned8QRR6S9bx599NH4+5SkTrZixYqEz/7Zz36WMjHV2z7pbRv95z//6fO1SkT1th0OOOCAlO/76le/Gk+ujUSSsLm52SWdveeuvPLKhO/0JxGViE9O7p555pnubz/4wQ/iz5144onx94wbNy760Ucf9bovhjJJqO9TIt3/2ksvvdQdb97ve++9d8JnNzQ0uGSd9/cbb7yx1+985JFHEsqZL774IuHzevouJcd72x9KGurmSH+ShPX19a6s7K3cAgBgKNHdGACAEabuexp3Kpm6VKqrYSqPPvqo7b777rbzzjvbf//7X3vkkUfc85988okbu+qvf/1rr9/57rvvxmfz1CQeGmNsgw02cMsxb968bjN9fvTRR3bEEUe47rGiCT+OOuooN8D+3/72N/c+/U3Pqfvh+uuv71734x//2BYvXhz/nK985Su25ZZb2n333Wf33ntvj8un73rttdfcv9WV8Fvf+pZNmzbNrau2lya4OPnkk1037R133NGGwne/+103YUYs/2L22GOPDWn3PnWLFXUh1Lh7GrPNG5duwoQJbttoXDSNlaZZfhcsWGD//Oc/bcWKFe7fv/zlL+0Pf/hDfIy6Bx980B566CH3fo3Dpy7Unm222abXZYlEInbQQQe5yUBE36dtrm18xx13uDH+5He/+51ttdVW7vhI5emnn3afs/HGG9sNN9wQnzhD//5//+//2ZQpU/rcLuoq7NGxk0zbY8aMGW57ycUXX2zXXnut2+86lrbffns3WYYmMvH0ZxuFw2GbPXu2O5bGjx/vuqE2Nja6Y03HgPziF7+wY4891qZOnZpyHXQsa/uttdZa9q9//cuNcSnqqquuuT1tv8HQ+n388cduwh2P1s8bk1HDFZSWltpxxx3n9oX8+c9/dl23Pbfeemv834ox/zbsaTxCHQ8exb3KDW0/bU/tP5VL66233pCvr/d9euy1115u/6t7syZOOeaYY+JdoFUWLl261MWU6Hhubm52/x41apQ7Xnuj5dckNzqWVc5ogpZTTz3V/U2fo8/z6Hs96gavsTQ1kY6O2bKyMhe799xzjytv1WX4Jz/5ib3zzjtpr6/Kvg033DB+PClWgjgBDwAgiwxpyhEAAPQpnVZOya1pklu9qAWL10JJP/W7v8VKY2Njyu/yWqK88sor8edmzZqV0NpJ1FJL3YQ9alHmb13z5ptvxv+mf+u55NZnCxcuTGgFo258HnXP3GSTTRKWzfP6668nPK+WZn7+FojqFjtULQlF3YC912y88cZD2pJQj95aP2qfPfzww9Frrrkmeskll7iWjV/72tcSWon2tE6puhL39hq1YPQv1x/+8IeE7r/+Vm3q8txTC7qTTjop/rfXXnst4W+puummcuSRR8bfc9xxx6V8zb///e+EYyn5UVNT41r7JbcwTGcb+bvSq7uturhffPHFbvv7u7Gqe39P2+GCCy5I6GqrFm/e33bcccdhaUnY19886uJeWFgYf83LL78c72ru72rsPe9Rt29v2ypePe3t7dGtt96617JLLUx1PAx1S8LkY86j8ktdvL3XaB+mKi/8LSJ7+85zzz03/rxa+fpbU/fW8rKjoyP6/PPPuy7xinUdQ6ecckrC93jdk9NpSSjqHp3quAAAYDgUjHSSEgAA9N93vvMd14pP9FMzYXrUYuXNN9/s9f2zZs1yrQFFrVzU8ueQQw5xLZHUcqa2tta13vL4JyJQayH/pCr6t78FmPdazVjrtcoT/zJqUP5DDz005bKpBZefZrXVOnoPfwvEZ555xoaSf3mHmlp4/ehHP0r5t0suucS1iFILqeOPP95OOeUUN7OpZlz2eK3+hkLyxBL+lm5qAeXfN2+88YY1NTWl/Bx/qzS1ePLTMZQOtQbra+Zetf5S61kdC2r5mkyTmpxzzjmuxV9/qcWYWqVp+TVpyoknnugmtND29693b9tfrQg9aomoVqEeTeQxktS68Wtf+1r89z/96U/up1rEaeIX2XzzzRNaCPpbEe6///4uXj1qeal9oVa2OmZ7amH6pS99KWHfDpWzzjqr23MqF44++uj47zfddJP7qZZ8XkvS5JZ/vdFneeWryjGvFbD3ufLNb34zoeWlvmfmzJm27bbbuvefdNJJ7hhSbPv1N469clqGY3sCAOBHkhAAgBGmrpNd4wQnPNSFsideVzpP8sX6qlWrev1OdUO85ZZbXALB66asbpIXXnihu/hVt0r/xa1m/e3pu5Kf85JDycvQ1zKn+q6+DOVFs77X3+27p66lyYlErwt2X9QFVgmWZErWqDvj6tWre32/kr9Dxb+NNSutukr2tG+0vj0dT/6uj8ldVdVVcygpHtSVVMuu7urnnntut1nBL7300n5/rrrSppNs7m0/93Zsq4tqusfIcFE3V48SXUp+Kv79Xe2Ted1qU3XPVTfYX/3qV7Zo0SLXNf0vf/mLG2rAP8uwYtM/C/JQxNC4ceMSkmZ+Ssx5CWQlwZX8VXdqLxGqmxl9dcP36AaJEtIezXauRLT/BoV/my1cuNAdR59//nmfn93fY2E4b1wAAJCMMQkBAMhBGnPLb8mSJQm/a+ytvugiWOMPqqWTxv/TuINKlmjcKyWk1Armq1/9qmtl6G/hlfxdyc95Y6IlL0Nfy9xTa7Lzzz/ftW7LVLLW408S+FuveeObebxWRn1JTsR5NO6gP2H373//2401qUSuxiDsqfXhYPi3sZKTGoPPv3z+faMWVT0dT/4WZl7Lq/5S4qc/rQ81juO+++7rHmo9qLECvTE46+vr3bL3lIBO9v7779vrr7+eMC7fb37zGzeWotZHyb90EtE6tv3jh/q3n/ZjcgI107yx8tTCWMmuP/7xj/FxTIuLixNa+YrGEX3uuefccu+33349fq620SabbOIeSpopcatkuJcg9sfGcMaQ6IaHYvbhhx92cawW0Uom97cVof/13jZSYlWf7yX41PLS33r6P//5T0Kr09/+9rfuuNSxqjEItX2GIqGvMTMBABhOtCQEACAHXX/99fGEln5qogiPLvqVEOhNS0uL62asC3e1xvre977nJjd44okn4pNp6ELfS6DssMMO8feq+93bb78d/10tifScx3utui/6E0f+ZVTrHn9LJj//d3lJJHX/TH4oebHddtvZULj77rsT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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plot_training_curves(\n", - " training_histories, f\"plots/{AGENT_TO_TRAIN}_training_curves.png\", window=100,\n", + " training_histories,\n", + " f\"plots/{AGENT_TO_TRAIN}_training_curves.png\",\n", + " window=100,\n", ")\n" ] }, @@ -1291,15 +1241,24 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 65, "id": "5315eb02", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning: Missing checkpoint for Random\n", + "Warning: Missing checkpoint for MonteCarlo\n" + ] + } + ], "source": [ - "for name in [\"SARSA\", \"Q-Learning\"]:\n", + "for name, agent in agents.items():\n", " checkpoint_path = get_path(name)\n", " if checkpoint_path.exists():\n", - " agents[name].load(str(checkpoint_path))\n", + " agent.load(str(checkpoint_path))\n", " else:\n", " print(f\"Warning: Missing checkpoint for {name}\")\n" ] @@ -1318,30 +1277,19 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 66, "id": "d04d37e0", "metadata": {}, "outputs": [], "source": [ - "def create_tournament_env() -> gym.Env:\n", - " \"\"\"Create PettingZoo Tennis env with preprocessing compatible with our agents.\"\"\"\n", - " env = tennis_v3.env(obs_type=\"grayscale_image\")\n", - " env = ss.resize_v1(env, x_size=84, y_size=84)\n", - " env = ss.frame_stack_v1(env, 4)\n", - " return ss.observation_lambda_v0(env, lambda obs, _: np.transpose(obs, (2, 0, 1)))\n", - "\n", - "\n", "def run_match(\n", - " env: gym.Env,\n", + " env: tennis_v3.env,\n", " agent_first: Agent,\n", " agent_second: Agent,\n", " episodes: int = 10,\n", " max_steps: int = 4000,\n", ") -> dict[str, int]:\n", - " \"\"\"Run multiple PettingZoo episodes between two agents.\n", - "\n", - " Returns wins for global labels {'first': ..., 'second': ..., 'draw': ...}.\n", - " \"\"\"\n", + " \"\"\"Run head-to-head matches between two agents and count wins/draws.\"\"\"\n", " wins = {\"first\": 0, \"second\": 0, \"draw\": 0}\n", "\n", " for _ep in range(episodes):\n", @@ -1349,11 +1297,14 @@ " rewards = {\"first_0\": 0.0, \"second_0\": 0.0}\n", "\n", " for step_idx, agent_id in enumerate(env.agent_iter()):\n", + " if step_idx >= max_steps:\n", + " break\n", + "\n", " obs, reward, termination, truncation, _info = env.last()\n", " done = termination or truncation\n", " rewards[agent_id] += float(reward)\n", "\n", - " if done or step_idx >= max_steps:\n", + " if done:\n", " action = None\n", " else:\n", " current_agent = agent_first if agent_id == \"first_0\" else agent_second\n", @@ -1361,10 +1312,6 @@ "\n", " env.step(action)\n", "\n", - " if step_idx + 1 >= max_steps:\n", - " break\n", - "\n", - " # Determine winner for the current episode\n", " if rewards[\"first_0\"] > rewards[\"second_0\"]:\n", " wins[\"first\"] += 1\n", " elif rewards[\"second_0\"] > rewards[\"first_0\"]:\n", @@ -1375,129 +1322,6 @@ " return wins\n" ] }, - { - "cell_type": "markdown", - "id": "8fd8215a", - "metadata": {}, - "source": [ - "### Observation Space Alignment Check: Gymnasium vs PettingZoo" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "fd235ac7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Gymnasium: (4, 84, 84) uint8 0 214\n", - "PettingZoo: (4, 84, 84) uint8 0 214\n" - ] - } - ], - "source": [ - "env_gym = create_env()\n", - "obs_gym, _ = env_gym.reset()\n", - "print(\n", - " \"Gymnasium:\",\n", - " np.asarray(obs_gym).shape,\n", - " np.asarray(obs_gym).dtype,\n", - " np.asarray(obs_gym).min(),\n", - " np.asarray(obs_gym).max(),\n", - ")\n", - "\n", - "env_pz = create_tournament_env()\n", - "env_pz.reset()\n", - "for agent_id in env_pz.agent_iter():\n", - " obs_pz, *_ = env_pz.last()\n", - " print(\n", - " \"PettingZoo:\",\n", - " np.asarray(obs_pz).shape,\n", - " np.asarray(obs_pz).dtype,\n", - " np.asarray(obs_pz).min(),\n", - " np.asarray(obs_pz).max(),\n", - " )\n", - " break\n" - ] - }, - { - "cell_type": "markdown", - "id": "5cfcfdb0", - "metadata": {}, - "source": [ - "## Evaluate against Atari pre-trained agents" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bee640bb", - "metadata": {}, - "outputs": [], - "source": [ - "def evaluate_vs_atari(\n", - " env: gym.Env,\n", - " agents: dict[str, Agent],\n", - " episodes: int = 20,\n", - " max_steps: int = 5000,\n", - ") -> dict[str, float]:\n", - " \"\"\"Evaluate each agent against the built-in Atari AI opponent over multiple episodes.\"\"\"\n", - " results = {}\n", - " for name, agent in agents.items():\n", - " total_rewards = []\n", - " for _ in range(episodes):\n", - " obs, _info = env.reset()\n", - " obs = np.asarray(obs)\n", - " ep_reward = 0.0\n", - "\n", - " for _ in range(max_steps):\n", - " action = agent.get_action(obs, epsilon=0.0)\n", - " next_obs, reward, terminated, truncated, _info = env.step(action)\n", - " ep_reward += float(reward)\n", - "\n", - " if terminated or truncated:\n", - " break\n", - "\n", - " obs = np.asarray(next_obs)\n", - "\n", - " total_rewards.append(ep_reward)\n", - "\n", - " avg_reward = float(np.mean(total_rewards))\n", - " results[name] = avg_reward\n", - " print(\n", - " f\"{name} vs Atari AI: Score moyen = {avg_reward:.2f} sur {episodes} épisodes\",\n", - " )\n", - "\n", - " return results\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "94a804cc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Evaluation against built-in Atari AI opponent:\n", - "Random vs Atari AI: Score moyen = -23.90 sur 10 épisodes\n", - "SARSA vs Atari AI: Score moyen = 0.00 sur 10 épisodes\n", - "Q-Learning vs Atari AI: Score moyen = 0.00 sur 10 épisodes\n", - "MonteCarlo vs Atari AI: Score moyen = -23.80 sur 10 épisodes\n", - "DQN vs Atari AI: Score moyen = -24.00 sur 10 épisodes\n" - ] - } - ], - "source": [ - "print(\"Evaluation against built-in Atari AI opponent:\")\n", - "atari_results = evaluate_vs_atari(env, agents, episodes=10)\n" - ] - }, { "cell_type": "markdown", "id": "150e6764", @@ -1512,7 +1336,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 67, "id": "1b85a88f", "metadata": {}, "outputs": [], @@ -1524,7 +1348,7 @@ ") -> dict[str, float]:\n", " \"\"\"Evaluate each agent against the specified random agent and compute win rates.\"\"\"\n", " win_rates = {}\n", - " env = create_tournament_env()\n", + " env = create_env()\n", " agent_random = agents[random_agent_name]\n", "\n", " for name, agent in agents.items():\n", @@ -1549,55 +1373,50 @@ " env.close()\n", " return win_rates\n", "\n", + "\n", "def plot_evaluation_results(\n", - " atari_results: dict[str, float],\n", " random_win_rates: dict[str, float],\n", " save_path: str = \"plots/evaluation_results.png\",\n", ") -> None:\n", - " \"\"\"Plot evaluation results as two side-by-side subplots.\"\"\"\n", - " agent_names = list(atari_results.keys())\n", + " \"\"\"Plot evaluation results: bar chart of win rates against Random agent.\"\"\"\n", + " agent_names = list(random_win_rates.keys())\n", + " rates_pct = [random_win_rates[n] * 100 for n in agent_names]\n", " colors = [AGENT_COLORS.get(n, \"#7f8c8d\") for n in agent_names]\n", "\n", - " fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))\n", + " fig, ax = plt.subplots(figsize=(8, 6))\n", "\n", - " # --- Left panel: Average reward vs Atari AI ---\n", - " atari_scores = [atari_results[n] for n in agent_names]\n", " x = np.arange(len(agent_names))\n", - " bars1 = ax1.bar(x, atari_scores, color=colors, edgecolor=\"white\", width=0.6)\n", - " ax1.set_xticks(x)\n", - " ax1.set_xticklabels(agent_names, rotation=30, ha=\"right\", fontsize=10)\n", - " ax1.set_ylabel(\"Average Reward\", fontsize=11)\n", - " ax1.set_title(\"Performance vs Atari Built-in AI\", fontsize=13, fontweight=\"bold\")\n", - " ax1.axhline(y=0, color=\"gray\", linestyle=\"--\", linewidth=0.8, alpha=0.5)\n", - " ax1.grid(axis=\"y\", alpha=0.3, linestyle=\"--\")\n", - " ax1.spines[\"top\"].set_visible(False)\n", - " ax1.spines[\"right\"].set_visible(False)\n", - " for bar, score in zip(bars1, atari_scores):\n", - " va = \"bottom\" if score >= 0 else \"top\"\n", - " ax1.text(bar.get_x() + bar.get_width() / 2, bar.get_height(),\n", - " f\"{score:+.1f}\", ha=\"center\", va=va, fontsize=9, fontweight=\"bold\")\n", + " bars = ax.bar(x, rates_pct, color=colors, edgecolor=\"white\", width=0.6)\n", "\n", - " # --- Right panel: Win rate vs Random ---\n", - " trained = [n for n in agent_names if n in random_win_rates]\n", - " trained_colors = [AGENT_COLORS.get(n, \"#7f8c8d\") for n in trained]\n", - " rates_pct = [random_win_rates[n] * 100 for n in trained]\n", - " x2 = np.arange(len(trained))\n", - " bars2 = ax2.bar(x2, rates_pct, color=trained_colors, edgecolor=\"white\", width=0.6)\n", - " ax2.set_xticks(x2)\n", - " ax2.set_xticklabels(trained, rotation=30, ha=\"right\", fontsize=10)\n", - " ax2.set_ylabel(\"Win Rate (%)\", fontsize=11)\n", - " ax2.set_title(\"Win Rate vs Random Baseline\", fontsize=13, fontweight=\"bold\")\n", - " ax2.set_ylim(0, 110)\n", - " ax2.axhline(y=50, color=\"gray\", linestyle=\"--\", linewidth=0.8, alpha=0.5, label=\"50 % baseline\")\n", - " ax2.legend(fontsize=8, loc=\"upper right\")\n", - " ax2.grid(axis=\"y\", alpha=0.3, linestyle=\"--\")\n", - " ax2.spines[\"top\"].set_visible(False)\n", - " ax2.spines[\"right\"].set_visible(False)\n", - " for bar, wr in zip(bars2, rates_pct):\n", - " ax2.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 1.5,\n", - " f\"{wr:.0f} %\", ha=\"center\", va=\"bottom\", fontsize=9, fontweight=\"bold\")\n", + " ax.set_xticks(x)\n", + " ax.set_xticklabels(agent_names, rotation=30, ha=\"right\", fontsize=11)\n", + " ax.set_ylabel(\"Win Rate (%)\", fontsize=12)\n", + " ax.set_title(\"Win Rate vs Random Baseline\", fontsize=14, fontweight=\"bold\")\n", + " ax.set_ylim(0, 110)\n", + " ax.axhline(\n", + " y=50,\n", + " color=\"gray\",\n", + " linestyle=\"--\",\n", + " linewidth=1.2,\n", + " alpha=0.7,\n", + " label=\"50 % baseline\",\n", + " )\n", + " ax.legend(fontsize=10, loc=\"upper right\")\n", + " ax.grid(axis=\"y\", alpha=0.3, linestyle=\"--\")\n", + " ax.spines[\"top\"].set_visible(False)\n", + " ax.spines[\"right\"].set_visible(False)\n", + "\n", + " for bar, wr in zip(bars, rates_pct, strict=False):\n", + " ax.text(\n", + " bar.get_x() + bar.get_width() / 2,\n", + " bar.get_height() + 2,\n", + " f\"{wr:.1f} %\",\n", + " ha=\"center\",\n", + " va=\"bottom\",\n", + " fontsize=10,\n", + " fontweight=\"bold\",\n", + " )\n", "\n", - " fig.suptitle(\"Agent Evaluation Summary\", fontsize=15, fontweight=\"bold\", y=1.02)\n", " fig.tight_layout()\n", " plt.savefig(save_path, dpi=150, bbox_inches=\"tight\")\n", " plt.show()\n" @@ -1605,7 +1424,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "id": "a053644e", "metadata": {}, "outputs": [ @@ -1613,18 +1432,31 @@ "name": "stdout", "output_type": "stream", "text": [ - "Evaluation against the Random agent\n", - "SARSA vs Random: 0 wins out of 20 decisive matches (Win rate: 0.0%)\n", - "Q-Learning vs Random: 0 wins out of 20 decisive matches (Win rate: 0.0%)\n", - "MonteCarlo vs Random: 8 wins out of 18 decisive matches (Win rate: 44.4%)\n", - "DQN vs Random: 6 wins out of 12 decisive matches (Win rate: 50.0%)\n" + "Evaluation against the Random agent\n" + ] + }, + { + "ename": "ValueError", + "evalue": "matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 128 is different from 28224)", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[68]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[33mEvaluation against the Random agent\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m win_rates_vs_random = \u001b[43mevaluate_vs_random\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 3\u001b[39m \u001b[43m \u001b[49m\u001b[43magents\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 4\u001b[39m \u001b[43m \u001b[49m\u001b[43mrandom_agent_name\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mRandom\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 5\u001b[39m \u001b[43m \u001b[49m\u001b[43mepisodes_per_leg\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m10\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 6\u001b[39m \u001b[43m)\u001b[49m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[67]\u001b[39m\u001b[32m, line 15\u001b[39m, in \u001b[36mevaluate_vs_random\u001b[39m\u001b[34m(agents, random_agent_name, episodes_per_leg)\u001b[39m\n\u001b[32m 12\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m name == random_agent_name:\n\u001b[32m 13\u001b[39m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m15\u001b[39m leg1 = \u001b[43mrun_match\u001b[49m\u001b[43m(\u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43magent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43magent_random\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mepisodes\u001b[49m\u001b[43m=\u001b[49m\u001b[43mepisodes_per_leg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 16\u001b[39m leg2 = run_match(env, agent_random, agent, episodes=episodes_per_leg)\n\u001b[32m 18\u001b[39m total_wins = leg1[\u001b[33m\"\u001b[39m\u001b[33mfirst\u001b[39m\u001b[33m\"\u001b[39m] + leg2[\u001b[33m\"\u001b[39m\u001b[33msecond\u001b[39m\u001b[33m\"\u001b[39m]\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[66]\u001b[39m\u001b[32m, line 27\u001b[39m, in \u001b[36mrun_match\u001b[39m\u001b[34m(env, agent_first, agent_second, episodes, max_steps)\u001b[39m\n\u001b[32m 25\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 26\u001b[39m current_agent = agent_first \u001b[38;5;28;01mif\u001b[39;00m agent_id == \u001b[33m\"\u001b[39m\u001b[33mfirst_0\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m agent_second\n\u001b[32m---> \u001b[39m\u001b[32m27\u001b[39m action = \u001b[43mcurrent_agent\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_action\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnp\u001b[49m\u001b[43m.\u001b[49m\u001b[43masarray\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mepsilon\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m0.0\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 29\u001b[39m env.step(action)\n\u001b[32m 31\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m rewards[\u001b[33m\"\u001b[39m\u001b[33mfirst_0\u001b[39m\u001b[33m\"\u001b[39m] > rewards[\u001b[33m\"\u001b[39m\u001b[33msecond_0\u001b[39m\u001b[33m\"\u001b[39m]:\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[56]\u001b[39m\u001b[32m, line 59\u001b[39m, in \u001b[36mSarsaAgent.get_action\u001b[39m\u001b[34m(self, observation, epsilon)\u001b[39m\n\u001b[32m 53\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Select action using ε-greedy policy over linear Q-values.\u001b[39;00m\n\u001b[32m 54\u001b[39m \n\u001b[32m 55\u001b[39m \u001b[33;03mSame pattern as Lab 7 SarsaAgent.eps_greedy:\u001b[39;00m\n\u001b[32m 56\u001b[39m \u001b[33;03mcompute q-values for all actions, then apply epsilon_greedy.\u001b[39;00m\n\u001b[32m 57\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 58\u001b[39m phi = normalize_obs(observation)\n\u001b[32m---> \u001b[39m\u001b[32m59\u001b[39m q_vals = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_q_values\u001b[49m\u001b[43m(\u001b[49m\u001b[43mphi\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 60\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m epsilon_greedy(q_vals, epsilon, \u001b[38;5;28mself\u001b[39m.rng)\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[56]\u001b[39m\u001b[32m, line 50\u001b[39m, in \u001b[36mSarsaAgent._q_values\u001b[39m\u001b[34m(self, phi)\u001b[39m\n\u001b[32m 37\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_q_values\u001b[39m(\u001b[38;5;28mself\u001b[39m, phi: np.ndarray) -> np.ndarray:\n\u001b[32m 38\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Compute Q-values for all actions given feature vector phi(s).\u001b[39;00m\n\u001b[32m 39\u001b[39m \n\u001b[32m 40\u001b[39m \u001b[33;03m Equivalent to Lab 7's self.q(s, a) = self.w[idx].sum()\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 48\u001b[39m \n\u001b[32m 49\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m50\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mW\u001b[49m\u001b[43m \u001b[49m\u001b[43m@\u001b[49m\u001b[43m \u001b[49m\u001b[43mphi\u001b[49m\n", + "\u001b[31mValueError\u001b[39m: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 128 is different from 28224)" ] } ], "source": [ "print(\"Evaluation against the Random agent\")\n", "win_rates_vs_random = evaluate_vs_random(\n", - " agents, random_agent_name=\"Random\", episodes_per_leg=10,\n", + " agents,\n", + " random_agent_name=\"Random\",\n", + " episodes_per_leg=10,\n", ")\n" ] }, @@ -1671,7 +1503,8 @@ ], "source": [ "plot_evaluation_results(\n", - " atari_results, win_rates_vs_random, save_path=\"plots/evaluation_results.png\",\n", + " win_rates_vs_random,\n", + " save_path=\"plots/evaluation_results.png\",\n", ")\n" ] }, @@ -1680,15 +1513,13 @@ "id": "b9cb30f5", "metadata": {}, "source": [ - "## Championship Match: SARSA vs Q-Learning\n", + "## Full Round-Robin Tournament\n", "\n", - "The final showdown pits the two trained agents against each other: **SARSA** (on-policy) versus **Q-Learning** (off-policy).\n", + "All agents play a **round-robin tournament** where each pair faces off in both positions (`first_0` / `second_0`).\n", "\n", - "This match directly compares the two TD learning strategies:\n", - "- **SARSA** updates its weights following the policy it actually executes (on-policy): $\\delta = r + \\gamma \\hat{q}(s', a') - \\hat{q}(s, a)$\n", - "- **Q-Learning** learns the optimal policy independently of exploration (off-policy): $\\delta = r + \\gamma \\max_{a'} \\hat{q}(s', a') - \\hat{q}(s, a)$\n", - "\n", - "The championship is played over **2 × 20 episodes** with swapped positions to ensure fairness." + "The resulting $n \\times n$ matchup matrix is analyzed with:\n", + "- **Aggregated ranking**: wins from both positions are combined for each agent\n", + "- **Binomial significance test** ($H_0: p = 0.5$): determines whether the win rate for each matchup is statistically different from a coin flip" ] }, { @@ -1701,14 +1532,10 @@ "def run_all_matchups(\n", " agents: dict[str, Agent],\n", " episodes_per_leg: int = 20,\n", - ") -> np.ndarray:\n", - " \"\"\"Run a full round-robin tournament and return an n*n win matrix.\n", - "\n", - " matrix[i][j] = wins of agent_i (as first_0) vs agent_j (as second_0).\n", - " Diagonal entries are NaN (no self-play).\n", - " \"\"\"\n", - " env = create_tournament_env()\n", - " names = list(agents.keys())\n", + ") -> tuple[np.ndarray, list[str]]:\n", + " \"\"\"Run round-robin matches between all pairs of agents and return the matchup matrix.\"\"\"\n", + " env = create_env()\n", + " names = [name for name in agents if name != \"Random\"]\n", " n = len(names)\n", " matrix = np.full((n, n), np.nan)\n", "\n", @@ -1717,12 +1544,15 @@ " if i == j:\n", " continue\n", " result = run_match(\n", - " env, agents[names[i]], agents[names[j]], episodes=episodes_per_leg,\n", + " env,\n", + " agents[names[i]],\n", + " agents[names[j]],\n", + " episodes=episodes_per_leg,\n", " )\n", " matrix[i, j] = result[\"first\"]\n", "\n", " env.close()\n", - " return matrix\n", + " return matrix, names\n", "\n", "\n", "def plot_matchup_matrix(\n", @@ -1731,13 +1561,13 @@ " episodes_per_leg: int = 20,\n", " save_path: str = \"plots/championship_matrix.png\",\n", ") -> None:\n", - " \"\"\"Plot the n*n matchup matrix as an annotated heatmap.\"\"\"\n", + " \"\"\"Plot the matchup matrix as a heatmap with win counts and percentages.\"\"\"\n", " n = len(agent_names)\n", " pct_matrix = matrix / episodes_per_leg * 100\n", "\n", " fig, ax = plt.subplots(figsize=(8, 7))\n", " masked = np.ma.array(pct_matrix, mask=np.isnan(pct_matrix))\n", - " cmap = plt.cm.RdYlGn.copy()\n", + " cmap = plt.get_cmap(\"RdYlGn\").copy()\n", " cmap.set_bad(color=\"#f0f0f0\")\n", "\n", " im = ax.imshow(masked, cmap=cmap, vmin=0, vmax=100, aspect=\"equal\")\n", @@ -1758,9 +1588,17 @@ " wins = int(matrix[i, j])\n", " pct = pct_matrix[i, j]\n", " txt_color = \"white\" if pct > 70 or pct < 30 else \"black\"\n", - " ax.text(j, i, f\"{wins}\\n({pct:.0f} %)\",\n", - " ha=\"center\", va=\"center\", color=txt_color,\n", - " fontsize=9, fontweight=\"bold\", linespacing=1.4)\n", + " ax.text(\n", + " j,\n", + " i,\n", + " f\"{wins}\\n({pct:.0f} %)\",\n", + " ha=\"center\",\n", + " va=\"center\",\n", + " color=txt_color,\n", + " fontsize=9,\n", + " fontweight=\"bold\",\n", + " linespacing=1.4,\n", + " )\n", "\n", " cbar = fig.colorbar(im, ax=ax, fraction=0.046, pad=0.04)\n", " cbar.set_label(f\"Win Rate (%) — {episodes_per_leg} eps per matchup\", fontsize=10)\n", @@ -1807,7 +1645,7 @@ } ], "source": [ - "matchup_matrix = run_all_matchups(agents, episodes_per_leg=20)\n" + "matchup_matrix, tournament_names = run_all_matchups(agents, episodes_per_leg=20)\n" ] }, { @@ -1829,7 +1667,7 @@ } ], "source": [ - "plot_matchup_matrix(matchup_matrix, list(agents.keys()), episodes_per_leg=20)\n" + "plot_matchup_matrix(matchup_matrix, tournament_names, episodes_per_leg=20)\n" ] }, { @@ -1854,11 +1692,10 @@ "- **DQN**: MLP network (28,224 → 256 → 256 → 18) trained with Adam optimizer, Huber loss, and periodic target network sync\n", "\n", "**Methodology**:\n", - "1. **Pre-training** each agent individually against Atari's built-in AI (5,000 episodes, ε decaying from 1.0 to 0.05)\n", + "1. **Sequential pre-training** of all agents against Atari's built-in AI (3,000 episodes, ε decaying linearly from 1.0 to 0.05 over 500k steps)\n", "2. **Evaluation vs Random** to validate learning (expected win rate > 50%)\n", - "3. **Head-to-head tournament** in matches via PettingZoo (2 × 20 episodes)\n", - "\n", - "> ⚠️ **Known Issue**: Monte Carlo and DQN agent checkpoints have loading issues. Their code is preserved here for reference." + "3. **Evaluation vs Atari AI** with per-episode reward statistics (mean ± std) and distributions\n", + "4. **Full round-robin tournament** via PettingZoo (20 episodes per matchup per position) with statistical significance analysis" ] }, { diff --git a/M2/Reinforcement Learning/project/checkpoints/dqn.pkl b/M2/Reinforcement Learning/project/checkpoints/dqn.pkl new file mode 100644 index 0000000..2dd831f Binary files /dev/null and b/M2/Reinforcement Learning/project/checkpoints/dqn.pkl differ diff --git a/M2/Reinforcement Learning/project/checkpoints/q_learning.pkl b/M2/Reinforcement Learning/project/checkpoints/q_learning.pkl index d76233b..4a66503 100644 Binary files a/M2/Reinforcement Learning/project/checkpoints/q_learning.pkl and b/M2/Reinforcement Learning/project/checkpoints/q_learning.pkl differ diff --git a/M2/Reinforcement Learning/project/checkpoints/sarsa.pkl b/M2/Reinforcement Learning/project/checkpoints/sarsa.pkl index 1bd88bd..f3fa673 100644 Binary files a/M2/Reinforcement Learning/project/checkpoints/sarsa.pkl and b/M2/Reinforcement Learning/project/checkpoints/sarsa.pkl differ diff --git a/M2/Reinforcement Learning/project/plots/DQN_training_curves.png b/M2/Reinforcement Learning/project/plots/DQN_training_curves.png new file mode 100644 index 0000000..63bcf3d Binary files /dev/null and b/M2/Reinforcement Learning/project/plots/DQN_training_curves.png differ diff --git a/M2/Reinforcement Learning/project/plots/Q-Learning_training_curves.png b/M2/Reinforcement Learning/project/plots/Q-Learning_training_curves.png index fa4eb22..f524c8e 100644 Binary files a/M2/Reinforcement Learning/project/plots/Q-Learning_training_curves.png and b/M2/Reinforcement Learning/project/plots/Q-Learning_training_curves.png differ diff --git a/M2/Reinforcement Learning/project/plots/SARSA_training_curves.png b/M2/Reinforcement Learning/project/plots/SARSA_training_curves.png index 76f9d35..f80f103 100644 Binary files a/M2/Reinforcement Learning/project/plots/SARSA_training_curves.png and b/M2/Reinforcement Learning/project/plots/SARSA_training_curves.png differ diff --git a/M2/Reinforcement Learning/project/plots/championship_results.png b/M2/Reinforcement Learning/project/plots/championship_results.png new file mode 100644 index 0000000..6008d95 Binary files /dev/null and b/M2/Reinforcement Learning/project/plots/championship_results.png differ diff --git a/M2/Reinforcement Learning/project/plots/evaluation_results.png b/M2/Reinforcement Learning/project/plots/evaluation_results.png new file mode 100644 index 0000000..10814eb Binary files /dev/null and b/M2/Reinforcement Learning/project/plots/evaluation_results.png differ diff --git a/M2/Time Series/TD4.qmd b/M2/Time Series/TD4.qmd new file mode 100644 index 0000000..93b6e34 --- /dev/null +++ b/M2/Time Series/TD4.qmd @@ -0,0 +1,154 @@ +# Exercise 1 : + +```{r} +set.seed(123) + +n <- 100 +t <- 1:n +eps <- rnorm(n, mean = 0, sd = 1) + +X <- eps +Y <- 3 * t + 2 + 15 * eps +Z <- 3 * t + 2 + 15 * eps + 55 * sin(t * pi / 6) + +par(mfrow = c(3, 1)) + +plot(ts(X), main = "Série X_t : Bruit blanc", ylab = "X_t", col = "blue") +plot(ts(Y), main = "Série Y_t : Tendance + bruit", ylab = "Y_t", col = "red") +plot( + ts(Z), + main = "Série Z_t : Tendance + saisonnalité + bruit", + ylab = "Z_t", + col = "darkgreen" +) +``` + +```{r} +library(forecast) + +alpha_vals <- c(0.1, 0.3, 0.5, 0.7, 0.9) + +mse_simple <- function(series) { + mse <- c() + + for (a in alpha_vals) { + fit <- ses(series, alpha = a, initial = "simple", h = 1) + + fitted_vals <- fitted(fit) + mse <- c(mse, mean((series - fitted_vals)^2, na.rm = TRUE)) + } + + data.frame(alpha = alpha_vals, MSE = mse) +} + +mse_simple(X) +mse_simple(Y) +mse_simple(Z) +``` + +```{r} +holt_mse <- function(series) { + beta_vals <- seq(0.1, 0.9, 0.2) + alpha_vals <- seq(0.1, 0.9, 0.2) + + res <- expand.grid(alpha = alpha_vals, beta = beta_vals) + res$MSE <- NA_real_ + + for (i in seq_len(nrow(res))) { + fit <- tryCatch( + suppressWarnings(forecast::holt( + series, + alpha = res$alpha[i], + beta = res$beta[i], + h = 1 + )), + error = function(e) NULL + ) + + if (!is.null(fit)) { + fitted_vals <- stats::fitted(fit) + res$MSE[i] <- mean((series - fitted_vals)^2, na.rm = TRUE) + } else { + res$MSE[i] <- NA_real_ + } + } + + res[order(res$MSE, na.last = TRUE), , drop = FALSE][1:5, ] +} + +holt_mse(X) +holt_mse(Y) +holt_mse(Z) +``` + +```{r} +fit_X <- ses(X) +fit_Y <- ses(Y) +fit_Z <- ses(Z) + +accuracy(fit_X) +accuracy(fit_Y) +accuracy(fit_Z) +``` + +```{r} +fit_X_holt <- holt(X) +fit_Y_holt <- holt(Y) +fit_Z_holt <- holt(Z) + +accuracy(fit_X_holt) +accuracy(fit_Y_holt) +accuracy(fit_Z_holt) +``` + +# Exercise 2 + +```{r} +library(tseries) +library(forecast) +data("AirPassengers") +log_air <- log(AirPassengers) + +n <- length(log_air) +n_test <- 12 +train <- window(log_air, end = c(1959, 12)) +test <- window(log_air, start = c(1960, 1)) + +plot(log_air, main = "Série AirPassengers (Log)") +lines(train, col = "blue") +lines(test, col = "red") +legend("topleft", legend = c("Train", "Test"), col = c("blue", "red"), lty = 1) +``` + +```{r} +library(forecast) + +fit_simple <- ses(train, h = n_test) +fit_holt <- holt(train, h = n_test) + +plot(log_air) +lines(fit_simple$mean, col = "green", lwd = 2) +lines(fit_holt$mean, col = "orange", lwd = 2) +legend( + "topleft", + legend = c("Série", "Simple", "Holt"), + col = c("black", "green", "orange"), + lty = 1 +) + +accuracy(fit_simple, test) +accuracy(fit_holt, test) +``` + +```{r} +fit_hw_add <- hw(train, h = n_test, seasonal = "additive") +fit_hw_mult <- hw(train, h = n_test, seasonal = "multiplicative") + +plot(log_air) +lines(fit_hw_add$mean, col = "purple", lwd = 2) +lines(fit_hw_mult$mean, col = "darkgreen", lwd = 2) +legend("topleft", legend = c("Série", "HW Additif", "HW Multiplicatif"), col = c("black", "purple", "darkgreen"), lty = 1) + +accuracy(fit_hw_add, test) +accuracy(fit_hw_mult, test) +``` diff --git a/pyproject.toml b/pyproject.toml index 6762760..1e22747 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,51 +5,27 @@ description = "A curated collection of mathematics and data science projects dev readme = "README.md" requires-python = ">= 3.12,<3.14" dependencies = [ - "accelerate>=1.12.0", "ale-py>=0.11.2", "catboost>=1.2.10", - "datasets>=4.6.1", - "faiss-cpu>=1.13.2", - "folium>=0.20.0", - "geopandas>=1.1.2", - "google-api-python-client>=2.191.0", - "google-auth-oauthlib>=1.3.0", - "google-generativeai>=0.8.6", - "gymnasium[toy-text]>=1.2.3", - "imblearn>=0.0", "ipykernel>=7.2.0", "ipywidgets>=8.1.8", "langchain>=1.2.10", - "langchain-community>=0.4.1", "langchain-core>=1.2.17", "langchain-huggingface>=1.2.1", "langchain-mistralai>=1.1.1", - "langchain-ollama>=1.0.1", - "langchain-openai>=1.1.10", - "langchain-text-splitters>=1.1.1", - "mapclassify>=2.10.0", "matplotlib>=3.10.8", - "nbformat>=5.10.4", "numpy>=2.4.2", "opencv-python>=4.13.0.92", - "openpyxl>=3.1.5", "pandas>=3.0.1", "pandas-stubs>=3.0.0.260204", "pettingzoo[atari]>=1.24.3", "plotly>=6.6.0", - "polars>=1.38.1", - "pypdf>=6.7.5", - "rasterio>=1.5.0", - "requests>=2.32.5", "scikit-learn>=1.8.0", "scipy>=1.17.1", "seaborn>=0.13.2", - "sentence-transformers>=5.2.3", # "sequenzo>=0.1.20", "shap>=0.50.0", "spacy>=3.8.11", - "statsmodels>=0.14.6", - "supersuit>=3.10.0", "tensorflow>=2.20.0", "tf-keras>=2.20.1", "tiktoken>=0.12.0", @@ -57,9 +33,7 @@ dependencies = [ "torch>=2.10.0", "umap-learn>=0.5.11", "uv>=0.10.7", - "wbdata>=1.1.0", "xgboost>=3.2.0", - "yfinance>=1.2.0", ] [dependency-groups] diff --git a/uv.lock b/uv.lock index e8fb828..8f82c9a 100644 --- a/uv.lock +++ b/uv.lock @@ -21,106 +21,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/a6/907a406bb7d359e6a63f99c313846d9eec4f7e6f7437809e03aa00fa3074/absl_py-2.4.0-py3-none-any.whl", hash = "sha256:88476fd881ca8aab94ffa78b7b6c632a782ab3ba1cd19c9bd423abc4fb4cd28d", size = 135750, upload-time = "2026-01-28T10:17:04.19Z" }, ] -[[package]] -name = "accelerate" -version = "1.12.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "psutil" }, - { name = "pyyaml" }, - { name = "safetensors" }, - { name = "torch" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4a/8e/ac2a9566747a93f8be36ee08532eb0160558b07630a081a6056a9f89bf1d/accelerate-1.12.0.tar.gz", hash = "sha256:70988c352feb481887077d2ab845125024b2a137a5090d6d7a32b57d03a45df6", size = 398399, upload-time = "2025-11-21T11:27:46.973Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d2/c581486aa6c4fbd7394c23c47b83fa1a919d34194e16944241daf9e762dd/accelerate-1.12.0-py3-none-any.whl", hash = "sha256:3e2091cd341423207e2f084a6654b1efcd250dc326f2a37d6dde446e07cabb11", size = 380935, upload-time = "2025-11-21T11:27:44.522Z" }, -] - -[[package]] -name = "affine" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/69/98/d2f0bb06385069e799fc7d2870d9e078cfa0fa396dc8a2b81227d0da08b9/affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea", size = 17132, upload-time = "2023-01-19T23:44:30.696Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/f7/85273299ab57117850cc0a936c64151171fac4da49bc6fba0dad984a7c5f/affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92", size = 15662, upload-time = "2023-01-19T23:44:28.833Z" }, -] - -[[package]] -name = "aiohappyeyeballs" -version = "2.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, -] - -[[package]] -name = "aiohttp" -version = "3.13.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache" }, - { name = "yarl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, - { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, - { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, - { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, - { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, - { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, - { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, - { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, - { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, - { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, - { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, - { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, - { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, - { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, - { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, - { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, - { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, - { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, - { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, - { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, - { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, - { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, - { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, -] - -[[package]] -name = "aiosignal" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frozenlist" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, -] - [[package]] name = "ale-py" version = "0.11.2" @@ -173,15 +73,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] -[[package]] -name = "appdirs" -version = "1.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, -] - [[package]] name = "appnope" version = "0.1.4" @@ -213,37 +104,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8", size = 12732, upload-time = "2019-12-22T18:12:11.297Z" }, ] -[[package]] -name = "attrs" -version = "25.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, -] - -[[package]] -name = "backoff" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, -] - -[[package]] -name = "beautifulsoup4" -version = "4.14.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "soupsieve" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, -] - [[package]] name = "blis" version = "1.3.3" @@ -269,27 +129,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/07/4cdc81a47bf862c0b06d91f1bc6782064e8b69ac9b5d4ff51d97e4ff03da/blis-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:7a0fc4b237a3a453bdc3c7ab48d91439fcd2d013b665c46948d9eaf9c3e45a97", size = 6192624, upload-time = "2025-11-17T12:28:14.197Z" }, ] -[[package]] -name = "branca" -version = "0.8.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jinja2" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/32/14/9d409124bda3f4ab7af3802aba07181d1fd56aa96cc4b999faea6a27a0d2/branca-0.8.2.tar.gz", hash = "sha256:e5040f4c286e973658c27de9225c1a5a7356dd0702a7c8d84c0f0dfbde388fe7", size = 27890, upload-time = "2025-10-06T10:28:20.305Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/50/fc9680058e63161f2f63165b84c957a0df1415431104c408e8104a3a18ef/branca-0.8.2-py3-none-any.whl", hash = "sha256:2ebaef3983e3312733c1ae2b793b0a8ba3e1c4edeb7598e10328505280cf2f7c", size = 26193, upload-time = "2025-10-06T10:28:19.255Z" }, -] - -[[package]] -name = "cachetools" -version = "5.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload-time = "2025-02-20T21:01:19.524Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, -] - [[package]] name = "catalogue" version = "2.0.10" @@ -421,18 +260,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] -[[package]] -name = "cligj" -version = "0.7.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ea/0d/837dbd5d8430fd0f01ed72c4cfb2f548180f4c68c635df84ce87956cff32/cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", size = 9803, upload-time = "2021-05-28T21:23:27.935Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/86/43fa9f15c5b9fb6e82620428827cd3c284aa933431405d1bcf5231ae3d3e/cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df", size = 7069, upload-time = "2021-05-28T21:23:26.877Z" }, -] - [[package]] name = "cloudpathlib" version = "0.23.0" @@ -526,45 +353,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, ] -[[package]] -name = "cryptography" -version = "46.0.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, - { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, - { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, - { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, - { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, - { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, - { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, - { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, - { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, - { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, - { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, - { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, - { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, - { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, - { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, - { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, - { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, -] - [[package]] name = "cuda-bindings" version = "12.9.4" @@ -586,27 +374,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/60/d8f1dbfb7f06b94c662e98c95189e6f39b817da638bc8fcea0d003f89e5d/cuda_pathfinder-1.4.0-py3-none-any.whl", hash = "sha256:437079ca59e7b61ae439ecc501d69ed87b3accc34d58153ef1e54815e2c2e118", size = 38406, upload-time = "2026-02-25T22:13:00.807Z" }, ] -[[package]] -name = "curl-cffi" -version = "0.13.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4e/3d/f39ca1f8fdf14408888e7c25e15eed63eac5f47926e206fb93300d28378c/curl_cffi-0.13.0.tar.gz", hash = "sha256:62ecd90a382bd5023750e3606e0aa7cb1a3a8ba41c14270b8e5e149ebf72c5ca", size = 151303, upload-time = "2025-08-06T13:05:42.988Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/d1/acabfd460f1de26cad882e5ef344d9adde1507034528cb6f5698a2e6a2f1/curl_cffi-0.13.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:434cadbe8df2f08b2fc2c16dff2779fb40b984af99c06aa700af898e185bb9db", size = 5686337, upload-time = "2025-08-06T13:05:28.985Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1c/cdb4fb2d16a0e9de068e0e5bc02094e105ce58a687ff30b4c6f88e25a057/curl_cffi-0.13.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:59afa877a9ae09efa04646a7d068eeea48915a95d9add0a29854e7781679fcd7", size = 2994613, upload-time = "2025-08-06T13:05:31.027Z" }, - { url = "https://files.pythonhosted.org/packages/04/3e/fdf617c1ec18c3038b77065d484d7517bb30f8fb8847224eb1f601a4e8bc/curl_cffi-0.13.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d06ed389e45a7ca97b17c275dbedd3d6524560270e675c720e93a2018a766076", size = 7931353, upload-time = "2025-08-06T13:05:32.273Z" }, - { url = "https://files.pythonhosted.org/packages/3d/10/6f30c05d251cf03ddc2b9fd19880f3cab8c193255e733444a2df03b18944/curl_cffi-0.13.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4e0de45ab3b7a835c72bd53640c2347415111b43421b5c7a1a0b18deae2e541", size = 7486378, upload-time = "2025-08-06T13:05:33.672Z" }, - { url = "https://files.pythonhosted.org/packages/77/81/5bdb7dd0d669a817397b2e92193559bf66c3807f5848a48ad10cf02bf6c7/curl_cffi-0.13.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8eb4083371bbb94e9470d782de235fb5268bf43520de020c9e5e6be8f395443f", size = 8328585, upload-time = "2025-08-06T13:05:35.28Z" }, - { url = "https://files.pythonhosted.org/packages/ce/c1/df5c6b4cfad41c08442e0f727e449f4fb5a05f8aa564d1acac29062e9e8e/curl_cffi-0.13.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:28911b526e8cd4aa0e5e38401bfe6887e8093907272f1f67ca22e6beb2933a51", size = 8739831, upload-time = "2025-08-06T13:05:37.078Z" }, - { url = "https://files.pythonhosted.org/packages/1a/91/6dd1910a212f2e8eafe57877bcf97748eb24849e1511a266687546066b8a/curl_cffi-0.13.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6d433ffcb455ab01dd0d7bde47109083aa38b59863aa183d29c668ae4c96bf8e", size = 8711908, upload-time = "2025-08-06T13:05:38.741Z" }, - { url = "https://files.pythonhosted.org/packages/6d/e4/15a253f9b4bf8d008c31e176c162d2704a7e0c5e24d35942f759df107b68/curl_cffi-0.13.0-cp39-abi3-win_amd64.whl", hash = "sha256:66a6b75ce971de9af64f1b6812e275f60b88880577bac47ef1fa19694fa21cd3", size = 1614510, upload-time = "2025-08-06T13:05:40.451Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0f/9c5275f17ad6ff5be70edb8e0120fdc184a658c9577ca426d4230f654beb/curl_cffi-0.13.0-cp39-abi3-win_arm64.whl", hash = "sha256:d438a3b45244e874794bc4081dc1e356d2bb926dcc7021e5a8fef2e2105ef1d8", size = 1365753, upload-time = "2025-08-06T13:05:41.879Z" }, -] - [[package]] name = "cycler" version = "0.12.1" @@ -648,59 +415,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/3f/35701c13e1fc7b0895198c8b20068c569a841e0daf8e0b14d1dc0816b28f/cymem-2.0.13-cp313-cp313t-win_arm64.whl", hash = "sha256:042e8611ef862c34a97b13241f5d0da86d58aca3cecc45c533496678e75c5a1f", size = 38964, upload-time = "2025-11-14T14:58:02.87Z" }, ] -[[package]] -name = "dataclasses-json" -version = "0.6.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "marshmallow" }, - { name = "typing-inspect" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227, upload-time = "2024-06-09T16:20:19.103Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" }, -] - -[[package]] -name = "datasets" -version = "4.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dill" }, - { name = "filelock" }, - { name = "fsspec", extra = ["http"] }, - { name = "httpx" }, - { name = "huggingface-hub" }, - { name = "multiprocess" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pandas" }, - { name = "pyarrow" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "tqdm" }, - { name = "xxhash" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d7/94/eb81c6fe32e9b6ef92223141b5a553aeff2e9456968424a8533cbe88f476/datasets-4.6.1.tar.gz", hash = "sha256:140ce500bc41939ff6ce995702d66b1f4b2ee7f117bb9b07512fab6804d4070a", size = 593865, upload-time = "2026-02-27T23:26:49.482Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/f0/99fe6eb530c7ee9ee1faee48059eb8a6437f80c893a496b98a78864e0fc6/datasets-4.6.1-py3-none-any.whl", hash = "sha256:f53228e6dadc9f837037b1bf3051d7d8c054abbb3eb29f1f022926e08090e0da", size = 520667, upload-time = "2026-02-27T23:26:46.855Z" }, -] - -[[package]] -name = "dateparser" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, - { name = "pytz" }, - { name = "regex" }, - { name = "tzlocal" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/668dfb8c073a5dde3efb80fa382de1502e3b14002fd386a8c1b0b49e92a9/dateparser-1.3.0.tar.gz", hash = "sha256:5bccf5d1ec6785e5be71cc7ec80f014575a09b4923e762f850e57443bddbf1a5", size = 337152, upload-time = "2026-02-04T16:00:06.162Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/c7/95349670e193b2891176e1b8e5f43e12b31bff6d9994f70e74ab385047f6/dateparser-1.3.0-py3-none-any.whl", hash = "sha256:8dc678b0a526e103379f02ae44337d424bd366aac727d3c6cf52ce1b01efbb5a", size = 318688, upload-time = "2026-02-04T16:00:04.652Z" }, -] - [[package]] name = "debugpy" version = "1.8.20" @@ -727,33 +441,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] -[[package]] -name = "dill" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, -] - -[[package]] -name = "et-xmlfile" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, -] - [[package]] name = "executing" version = "2.2.1" @@ -763,27 +450,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] -[[package]] -name = "faiss-cpu" -version = "1.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "packaging" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/c9/671f66f6b31ec48e5825d36435f0cb91189fa8bb6b50724029dbff4ca83c/faiss_cpu-1.13.2-cp310-abi3-macosx_14_0_arm64.whl", hash = "sha256:a9064eb34f8f64438dd5b95c8f03a780b1a3f0b99c46eeacb1f0b5d15fc02dc1", size = 3452776, upload-time = "2025-12-24T10:27:01.419Z" }, - { url = "https://files.pythonhosted.org/packages/5a/4a/97150aa1582fb9c2bca95bd8fc37f27d3b470acec6f0a6833844b21e4b40/faiss_cpu-1.13.2-cp310-abi3-macosx_14_0_x86_64.whl", hash = "sha256:c8d097884521e1ecaea6467aeebbf1aa56ee4a36350b48b2ca6b39366565c317", size = 7896434, upload-time = "2025-12-24T10:27:03.592Z" }, - { url = "https://files.pythonhosted.org/packages/0b/d0/0940575f059591ca31b63a881058adb16a387020af1709dcb7669460115c/faiss_cpu-1.13.2-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ee330a284042c2480f2e90450a10378fd95655d62220159b1408f59ee83ebf1", size = 11485825, upload-time = "2025-12-24T10:27:05.681Z" }, - { url = "https://files.pythonhosted.org/packages/e7/e1/a5acac02aa593809f0123539afe7b4aff61d1db149e7093239888c9053e1/faiss_cpu-1.13.2-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab88ee287c25a119213153d033f7dd64c3ccec466ace267395872f554b648cd7", size = 23845772, upload-time = "2025-12-24T10:27:08.194Z" }, - { url = "https://files.pythonhosted.org/packages/9c/7b/49dcaf354834ec457e85ca769d50bc9b5f3003fab7c94a9dcf08cf742793/faiss_cpu-1.13.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85511129b34f890d19c98b82a0cd5ffb27d89d1cec2ee41d2621ee9f9ef8cf3f", size = 13477567, upload-time = "2025-12-24T10:27:10.822Z" }, - { url = "https://files.pythonhosted.org/packages/f7/6b/12bb4037921c38bb2c0b4cfc213ca7e04bbbebbfea89b0b5746248ce446e/faiss_cpu-1.13.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b32eb4065bac352b52a9f5ae07223567fab0a976c7d05017c01c45a1c24264f", size = 25102239, upload-time = "2025-12-24T10:27:13.476Z" }, - { url = "https://files.pythonhosted.org/packages/87/ff/35ed875423200c17bdd594ce921abfc1812ddd21e09355290b9a94e170ab/faiss_cpu-1.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:b82c01d30430dd7b1fa442001b9099735d1a82f6bb72033acdc9206d5ac66a64", size = 18890300, upload-time = "2025-12-24T10:27:24.194Z" }, - { url = "https://files.pythonhosted.org/packages/c5/3a/bbdf5deaf6feb34b46b469c0a0acd40216c3d3c6ecf5aeb71d56b8a650e3/faiss_cpu-1.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2c4f696ae76e7c97cbc12311db83aaf1e7f4f7be06a3ffea7e5b0e8ec1fd805b", size = 8553157, upload-time = "2025-12-24T10:27:26.38Z" }, - { url = "https://files.pythonhosted.org/packages/60/4b/903d85bf3a8264d49964ec799e45c7ffc91098606b8bc9ef2c904c1a56cb/faiss_cpu-1.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:cb4b5ee184816a4b099162ac93c0d7f0033d81a88e7c1291d0a9cc41ec348984", size = 18891330, upload-time = "2025-12-24T10:27:28.806Z" }, - { url = "https://files.pythonhosted.org/packages/b2/52/5d10642da628f63544aab27e48416be4a7ea25c6b81d8bd65016d8538b00/faiss_cpu-1.13.2-cp313-cp313-win_arm64.whl", hash = "sha256:1243967eeb2298791ff7f3683a4abd2100d7e6ec7542ca05c3b75d47a7f621e5", size = 8553088, upload-time = "2025-12-24T10:27:31.325Z" }, -] - [[package]] name = "farama-notifications" version = "0.0.4" @@ -793,15 +459,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/05/2c/ffc08c54c05cdce6fbed2aeebc46348dbe180c6d2c541c7af7ba0aa5f5f8/Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae", size = 2511, upload-time = "2023-02-27T18:28:39.447Z" }, ] -[[package]] -name = "fastjsonschema" -version = "2.21.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, -] - [[package]] name = "filelock" version = "3.25.0" @@ -819,22 +476,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661, upload-time = "2025-12-19T23:16:13.622Z" }, ] -[[package]] -name = "folium" -version = "0.20.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "branca" }, - { name = "jinja2" }, - { name = "numpy" }, - { name = "requests" }, - { name = "xyzservices" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c7/76/84a1b1b00ce71f9c0c44af7d80f310c02e2e583591fe7d4cb03baecd0d3f/folium-0.20.0.tar.gz", hash = "sha256:a0d78b9d5a36ba7589ca9aedbd433e84e9fcab79cd6ac213adbcff922e454cb9", size = 109932, upload-time = "2025-06-16T20:22:51.803Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/a8/5f764f333204db0390362a4356d03a43626997f26818a0e9396f1b3bd8c9/folium-0.20.0-py2.py3-none-any.whl", hash = "sha256:f0bc2a92acde20bca56367aa5c1c376c433f450608d058daebab2fc9bf8198bf", size = 113394, upload-time = "2025-06-16T20:22:50.318Z" }, -] - [[package]] name = "fonttools" version = "4.61.1" @@ -860,72 +501,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, ] -[[package]] -name = "frozendict" -version = "2.4.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/b2/2a3d1374b7780999d3184e171e25439a8358c47b481f68be883c14086b4c/frozendict-2.4.7.tar.gz", hash = "sha256:e478fb2a1391a56c8a6e10cc97c4a9002b410ecd1ac28c18d780661762e271bd", size = 317082, upload-time = "2025-11-11T22:40:14.251Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/74/f94141b38a51a553efef7f510fc213894161ae49b88bffd037f8d2a7cb2f/frozendict-2.4.7-py3-none-any.whl", hash = "sha256:972af65924ea25cf5b4d9326d549e69a9a4918d8a76a9d3a7cd174d98b237550", size = 16264, upload-time = "2025-11-11T22:40:12.836Z" }, -] - -[[package]] -name = "frozenlist" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, - { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, - { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, - { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, - { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, - { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, - { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, - { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, - { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, - { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, - { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, - { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, - { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, - { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, - { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, - { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, - { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, - { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, - { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, - { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, - { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, - { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, - { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, - { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, - { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, - { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, - { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, - { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, - { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, - { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, - { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, - { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, -] - [[package]] name = "fsspec" version = "2026.2.0" @@ -935,11 +510,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload-time = "2026-02-05T21:50:51.819Z" }, ] -[package.optional-dependencies] -http = [ - { name = "aiohttp" }, -] - [[package]] name = "gast" version = "0.7.0" @@ -949,134 +519,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/33/f1c6a276de27b7d7339a34749cc33fa87f077f921969c47185d34a887ae2/gast-0.7.0-py3-none-any.whl", hash = "sha256:99cbf1365633a74099f69c59bd650476b96baa5ef196fec88032b00b31ba36f7", size = 22966, upload-time = "2025-11-29T15:30:03.983Z" }, ] -[[package]] -name = "geopandas" -version = "1.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "packaging" }, - { name = "pandas" }, - { name = "pyogrio" }, - { name = "pyproj" }, - { name = "shapely" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8d/24/5eb5685d7bf89d64218919379f882d19a60f8219d66d833c83b1cf264c95/geopandas-1.1.2.tar.gz", hash = "sha256:33f7b33565c46a45b8459a2ab699ec943fdbb5716e58e251b3c413cf7783106c", size = 336037, upload-time = "2025-12-22T21:06:13.749Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/e4/fac19dc34cb686c96011388b813ff7b858a70681e5ce6ce7698e5021b0f4/geopandas-1.1.2-py3-none-any.whl", hash = "sha256:2bb0b1052cb47378addb4ba54c47f8d4642dcbda9b61375638274f49d9f0bb0d", size = 341734, upload-time = "2025-12-22T21:06:12.498Z" }, -] - -[[package]] -name = "google-ai-generativelanguage" -version = "0.6.15" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-api-core", extra = ["grpc"] }, - { name = "google-auth" }, - { name = "proto-plus" }, - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/11/d1/48fe5d7a43d278e9f6b5ada810b0a3530bbeac7ed7fcbcd366f932f05316/google_ai_generativelanguage-0.6.15.tar.gz", hash = "sha256:8f6d9dc4c12b065fe2d0289026171acea5183ebf2d0b11cefe12f3821e159ec3", size = 1375443, upload-time = "2025-01-13T21:50:47.459Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/a3/67b8a6ff5001a1d8864922f2d6488dc2a14367ceb651bc3f09a947f2f306/google_ai_generativelanguage-0.6.15-py3-none-any.whl", hash = "sha256:5a03ef86377aa184ffef3662ca28f19eeee158733e45d7947982eb953c6ebb6c", size = 1327356, upload-time = "2025-01-13T21:50:44.174Z" }, -] - -[[package]] -name = "google-api-core" -version = "2.25.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-auth" }, - { name = "googleapis-common-protos" }, - { name = "proto-plus" }, - { name = "protobuf" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/cd/63f1557235c2440fe0577acdbc32577c5c002684c58c7f4d770a92366a24/google_api_core-2.25.2.tar.gz", hash = "sha256:1c63aa6af0d0d5e37966f157a77f9396d820fba59f9e43e9415bc3dc5baff300", size = 166266, upload-time = "2025-10-03T00:07:34.778Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/d8/894716a5423933f5c8d2d5f04b16f052a515f78e815dab0c2c6f1fd105dc/google_api_core-2.25.2-py3-none-any.whl", hash = "sha256:e9a8f62d363dc8424a8497f4c2a47d6bcda6c16514c935629c257ab5d10210e7", size = 162489, upload-time = "2025-10-03T00:07:32.924Z" }, -] - -[package.optional-dependencies] -grpc = [ - { name = "grpcio" }, - { name = "grpcio-status" }, -] - -[[package]] -name = "google-api-python-client" -version = "2.191.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-api-core" }, - { name = "google-auth" }, - { name = "google-auth-httplib2" }, - { name = "httplib2" }, - { name = "uritemplate" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/60/58/7d0843b7419a5ac51a27965e7233ef7c26ad693b490a74ab26548d0fd231/google_api_python_client-2.191.0.tar.gz", hash = "sha256:858c22fd46f51a65cee365a78aec2054e6d47b50434bee4ba62e91ac0944aea1", size = 14195310, upload-time = "2026-03-02T16:58:59.965Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/a4/da3a66c90f94b9eb433f0844f1bf79b5789bfa0859e55c0cd02c1139fed8/google_api_python_client-2.191.0-py3-none-any.whl", hash = "sha256:0768dde3202121abb3e897c4ee5150e58a25f32ee843780f6bee636dccc7ef23", size = 14769138, upload-time = "2026-03-02T16:58:57.665Z" }, -] - -[[package]] -name = "google-auth" -version = "2.48.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cryptography" }, - { name = "pyasn1-modules" }, - { name = "rsa" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0c/41/242044323fbd746615884b1c16639749e73665b718209946ebad7ba8a813/google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce", size = 326522, upload-time = "2026-01-26T19:22:47.157Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/1d/d6466de3a5249d35e832a52834115ca9d1d0de6abc22065f049707516d47/google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f", size = 236499, upload-time = "2026-01-26T19:22:45.099Z" }, -] - -[[package]] -name = "google-auth-httplib2" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-auth" }, - { name = "httplib2" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d5/ad/c1f2b1175096a8d04cf202ad5ea6065f108d26be6fc7215876bde4a7981d/google_auth_httplib2-0.3.0.tar.gz", hash = "sha256:177898a0175252480d5ed916aeea183c2df87c1f9c26705d74ae6b951c268b0b", size = 11134, upload-time = "2025-12-15T22:13:51.825Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/99/d5/3c97526c8796d3caf5f4b3bed2b05e8a7102326f00a334e7a438237f3b22/google_auth_httplib2-0.3.0-py3-none-any.whl", hash = "sha256:426167e5df066e3f5a0fc7ea18768c08e7296046594ce4c8c409c2457dd1f776", size = 9529, upload-time = "2025-12-15T22:13:51.048Z" }, -] - -[[package]] -name = "google-auth-oauthlib" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-auth" }, - { name = "requests-oauthlib" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ac/b4/1b19567e4c567b796f5c593d89895f3cfae5a38e04f27c6af87618fd0942/google_auth_oauthlib-1.3.0.tar.gz", hash = "sha256:cd39e807ac7229d6b8b9c1e297321d36fcc8a9e4857dff4301870985df51a528", size = 21777, upload-time = "2026-02-27T14:13:01.489Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/56/909fd5632226d3fba31d7aeffd4754410735d49362f5809956fe3e9af344/google_auth_oauthlib-1.3.0-py3-none-any.whl", hash = "sha256:386b3fb85cf4a5b819c6ad23e3128d975216b4cac76324de1d90b128aaf38f29", size = 19308, upload-time = "2026-02-27T14:12:47.865Z" }, -] - -[[package]] -name = "google-generativeai" -version = "0.8.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-ai-generativelanguage" }, - { name = "google-api-core" }, - { name = "google-api-python-client" }, - { name = "google-auth" }, - { name = "protobuf" }, - { name = "pydantic" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/0f/ef33b5bb71437966590c6297104c81051feae95d54b11ece08533ef937d3/google_generativeai-0.8.6-py3-none-any.whl", hash = "sha256:37a0eaaa95e5bbf888828e20a4a1b2c196cc9527d194706e58a68ff388aeb0fa", size = 155098, upload-time = "2025-12-16T17:53:58.61Z" }, -] - [[package]] name = "google-pasta" version = "0.2.0" @@ -1089,18 +531,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", size = 57471, upload-time = "2020-03-13T18:57:48.872Z" }, ] -[[package]] -name = "googleapis-common-protos" -version = "1.72.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e5/7b/adfd75544c415c487b33061fe7ae526165241c1ea133f9a9125a56b39fd8/googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5", size = 147433, upload-time = "2025-11-06T18:29:24.087Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload-time = "2025-11-06T18:29:13.14Z" }, -] - [[package]] name = "graphviz" version = "0.21" @@ -1110,30 +540,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl", hash = "sha256:54f33de9f4f911d7e84e4191749cac8cc5653f815b06738c54db9a15ab8b1e42", size = 47300, upload-time = "2025-06-15T09:35:04.433Z" }, ] -[[package]] -name = "greenlet" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", size = 188267, upload-time = "2026-02-20T20:54:15.531Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, - { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, - { url = "https://files.pythonhosted.org/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", size = 611792, upload-time = "2026-02-20T20:55:58.423Z" }, - { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, - { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, - { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, - { url = "https://files.pythonhosted.org/packages/9b/40/cc802e067d02af8b60b6771cea7d57e21ef5e6659912814babb42b864713/greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", size = 231081, upload-time = "2026-02-20T20:17:28.121Z" }, - { url = "https://files.pythonhosted.org/packages/58/2e/fe7f36ff1982d6b10a60d5e0740c759259a7d6d2e1dc41da6d96de32fff6/greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", size = 230331, upload-time = "2026-02-20T20:17:23.34Z" }, - { url = "https://files.pythonhosted.org/packages/ac/48/f8b875fa7dea7dd9b33245e37f065af59df6a25af2f9561efa8d822fde51/greenlet-3.3.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", size = 279120, upload-time = "2026-02-20T20:19:01.9Z" }, - { url = "https://files.pythonhosted.org/packages/49/8d/9771d03e7a8b1ee456511961e1b97a6d77ae1dea4a34a5b98eee706689d3/greenlet-3.3.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", size = 603238, upload-time = "2026-02-20T20:47:32.873Z" }, - { url = "https://files.pythonhosted.org/packages/59/0e/4223c2bbb63cd5c97f28ffb2a8aee71bdfb30b323c35d409450f51b91e3e/greenlet-3.3.2-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", size = 614219, upload-time = "2026-02-20T20:55:59.817Z" }, - { url = "https://files.pythonhosted.org/packages/7a/34/259b28ea7a2a0c904b11cd36c79b8cef8019b26ee5dbe24e73b469dea347/greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", size = 616774, upload-time = "2026-02-20T20:21:02.454Z" }, - { url = "https://files.pythonhosted.org/packages/0a/03/996c2d1689d486a6e199cb0f1cf9e4aa940c500e01bdf201299d7d61fa69/greenlet-3.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", size = 1571277, upload-time = "2026-02-20T20:49:34.795Z" }, - { url = "https://files.pythonhosted.org/packages/d9/c4/2570fc07f34a39f2caf0bf9f24b0a1a0a47bc2e8e465b2c2424821389dfc/greenlet-3.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", size = 1640455, upload-time = "2026-02-20T20:21:10.261Z" }, - { url = "https://files.pythonhosted.org/packages/91/39/5ef5aa23bc545aa0d31e1b9b55822b32c8da93ba657295840b6b34124009/greenlet-3.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:a7945dd0eab63ded0a48e4dcade82939783c172290a7903ebde9e184333ca124", size = 230961, upload-time = "2026-02-20T20:16:58.461Z" }, - { url = "https://files.pythonhosted.org/packages/62/6b/a89f8456dcb06becff288f563618e9f20deed8dd29beea14f9a168aef64b/greenlet-3.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:394ead29063ee3515b4e775216cb756b2e3b4a7e55ae8fd884f17fa579e6b327", size = 230221, upload-time = "2026-02-20T20:17:37.152Z" }, -] - [[package]] name = "grpcio" version = "1.78.0" @@ -1165,20 +571,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4d/27/d86b89e36de8a951501fb06a0f38df19853210f341d0b28f83f4aa0ffa08/grpcio-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:f2d4e43ee362adfc05994ed479334d5a451ab7bc3f3fee1b796b8ca66895acb4", size = 4797393, upload-time = "2026-02-06T09:56:17.882Z" }, ] -[[package]] -name = "grpcio-status" -version = "1.71.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "googleapis-common-protos" }, - { name = "grpcio" }, - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/d1/b6e9877fedae3add1afdeae1f89d1927d296da9cf977eca0eb08fb8a460e/grpcio_status-1.71.2.tar.gz", hash = "sha256:c7a97e176df71cdc2c179cd1847d7fc86cca5832ad12e9798d7fed6b7a1aab50", size = 13677, upload-time = "2025-06-28T04:24:05.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/58/317b0134129b556a93a3b0afe00ee675b5657f0155509e22fcb853bafe2d/grpcio_status-1.71.2-py3-none-any.whl", hash = "sha256:803c98cb6a8b7dc6dbb785b1111aed739f241ab5e9da0bba96888aa74704cfd3", size = 14424, upload-time = "2025-06-28T04:23:42.136Z" }, -] - [[package]] name = "gymnasium" version = "1.2.3" @@ -1194,11 +586,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/56/d3/ea5f088e3638dbab12e5c20d6559d5b3bdaeaa1f2af74e526e6815836285/gymnasium-1.2.3-py3-none-any.whl", hash = "sha256:e6314bba8f549c7fdcc8677f7cd786b64908af6e79b57ddaa5ce1825bffb5373", size = 952113, upload-time = "2025-12-18T16:51:08.445Z" }, ] -[package.optional-dependencies] -toy-text = [ - { name = "pygame" }, -] - [[package]] name = "h11" version = "0.16.0" @@ -1272,18 +659,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] -[[package]] -name = "httplib2" -version = "0.31.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyparsing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c1/1f/e86365613582c027dda5ddb64e1010e57a3d53e99ab8a72093fa13d565ec/httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24", size = 250800, upload-time = "2026-01-23T11:04:44.165Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349", size = 91099, upload-time = "2026-01-23T11:04:42.78Z" }, -] - [[package]] name = "httpx" version = "0.28.1" @@ -1336,35 +711,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, ] -[[package]] -name = "imbalanced-learn" -version = "0.14.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "numpy" }, - { name = "scikit-learn" }, - { name = "scipy" }, - { name = "sklearn-compat" }, - { name = "threadpoolctl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c1/7d/f1384d3c0eefb5531b4dc05c191aba260f78e4d4bdd31a0c2a3394de5c8d/imbalanced_learn-0.14.1.tar.gz", hash = "sha256:46eeb5773a96b6fa92426356da66f3e4390a7ed8e715a633c6fb68ee4a3ccdcb", size = 1190412, upload-time = "2025-12-21T21:59:16.457Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/b5/56f1ceb568676c0231d12b2fed17ebfd606dd1f627e7372aaed5dd56bd97/imbalanced_learn-0.14.1-py3-none-any.whl", hash = "sha256:fcdff8d27870d6992ea3496230788b97ff98e24302e7f6c598701da525ae440f", size = 235365, upload-time = "2025-12-21T21:59:14.959Z" }, -] - -[[package]] -name = "imblearn" -version = "0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "imbalanced-learn" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/32/0a/f83099534a77757abf27427d339590c83cc68c3386690d4741d6454e185f/imblearn-0.0.tar.gz", hash = "sha256:d8fbb662919c1b16f438ad91a8256220e53bcf6815c9ad5502c518b798de34f2", size = 945, upload-time = "2017-01-19T11:52:35.89Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/a7/4179e6ebfd654bd0eac0b9c06125b8b4c96a9d0a8ff9e9507eb2a26d2d7e/imblearn-0.0-py2.py3-none-any.whl", hash = "sha256:d42c2d709d22c00d2b9a91e638d57240a8b79b4014122d92181fcd2549a2f79a", size = 1874, upload-time = "2017-01-19T11:52:37.416Z" }, -] - [[package]] name = "ipykernel" version = "7.2.0" @@ -1462,49 +808,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] -[[package]] -name = "jiter" -version = "0.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/30/7687e4f87086829955013ca12a9233523349767f69653ebc27036313def9/jiter-0.13.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0a2bd69fc1d902e89925fc34d1da51b2128019423d7b339a45d9e99c894e0663", size = 307958, upload-time = "2026-02-02T12:35:57.165Z" }, - { url = "https://files.pythonhosted.org/packages/c3/27/e57f9a783246ed95481e6749cc5002a8a767a73177a83c63ea71f0528b90/jiter-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f917a04240ef31898182f76a332f508f2cc4b57d2b4d7ad2dbfebbfe167eb505", size = 318597, upload-time = "2026-02-02T12:35:58.591Z" }, - { url = "https://files.pythonhosted.org/packages/cf/52/e5719a60ac5d4d7c5995461a94ad5ef962a37c8bf5b088390e6fad59b2ff/jiter-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1e2b199f446d3e82246b4fd9236d7cb502dc2222b18698ba0d986d2fecc6152", size = 348821, upload-time = "2026-02-02T12:36:00.093Z" }, - { url = "https://files.pythonhosted.org/packages/61/db/c1efc32b8ba4c740ab3fc2d037d8753f67685f475e26b9d6536a4322bcdd/jiter-0.13.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04670992b576fa65bd056dbac0c39fe8bd67681c380cb2b48efa885711d9d726", size = 364163, upload-time = "2026-02-02T12:36:01.937Z" }, - { url = "https://files.pythonhosted.org/packages/55/8a/fb75556236047c8806995671a18e4a0ad646ed255276f51a20f32dceaeec/jiter-0.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a1aff1fbdb803a376d4d22a8f63f8e7ccbce0b4890c26cc7af9e501ab339ef0", size = 483709, upload-time = "2026-02-02T12:36:03.41Z" }, - { url = "https://files.pythonhosted.org/packages/7e/16/43512e6ee863875693a8e6f6d532e19d650779d6ba9a81593ae40a9088ff/jiter-0.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b3fb8c2053acaef8580809ac1d1f7481a0a0bdc012fd7f5d8b18fb696a5a089", size = 370480, upload-time = "2026-02-02T12:36:04.791Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4c/09b93e30e984a187bc8aaa3510e1ec8dcbdcd71ca05d2f56aac0492453aa/jiter-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdaba7d87e66f26a2c45d8cbadcbfc4bf7884182317907baf39cfe9775bb4d93", size = 360735, upload-time = "2026-02-02T12:36:06.994Z" }, - { url = "https://files.pythonhosted.org/packages/1a/1b/46c5e349019874ec5dfa508c14c37e29864ea108d376ae26d90bee238cd7/jiter-0.13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b88d649135aca526da172e48083da915ec086b54e8e73a425ba50999468cc08", size = 391814, upload-time = "2026-02-02T12:36:08.368Z" }, - { url = "https://files.pythonhosted.org/packages/15/9e/26184760e85baee7162ad37b7912797d2077718476bf91517641c92b3639/jiter-0.13.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e404ea551d35438013c64b4f357b0474c7abf9f781c06d44fcaf7a14c69ff9e2", size = 513990, upload-time = "2026-02-02T12:36:09.993Z" }, - { url = "https://files.pythonhosted.org/packages/e9/34/2c9355247d6debad57a0a15e76ab1566ab799388042743656e566b3b7de1/jiter-0.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f4748aad1b4a93c8bdd70f604d0f748cdc0e8744c5547798acfa52f10e79228", size = 548021, upload-time = "2026-02-02T12:36:11.376Z" }, - { url = "https://files.pythonhosted.org/packages/ac/4a/9f2c23255d04a834398b9c2e0e665382116911dc4d06b795710503cdad25/jiter-0.13.0-cp312-cp312-win32.whl", hash = "sha256:0bf670e3b1445fc4d31612199f1744f67f889ee1bbae703c4b54dc097e5dd394", size = 203024, upload-time = "2026-02-02T12:36:12.682Z" }, - { url = "https://files.pythonhosted.org/packages/09/ee/f0ae675a957ae5a8f160be3e87acea6b11dc7b89f6b7ab057e77b2d2b13a/jiter-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:15db60e121e11fe186c0b15236bd5d18381b9ddacdcf4e659feb96fc6c969c92", size = 205424, upload-time = "2026-02-02T12:36:13.93Z" }, - { url = "https://files.pythonhosted.org/packages/1b/02/ae611edf913d3cbf02c97cdb90374af2082c48d7190d74c1111dde08bcdd/jiter-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:41f92313d17989102f3cb5dd533a02787cdb99454d494344b0361355da52fcb9", size = 186818, upload-time = "2026-02-02T12:36:15.308Z" }, - { url = "https://files.pythonhosted.org/packages/91/9c/7ee5a6ff4b9991e1a45263bfc46731634c4a2bde27dfda6c8251df2d958c/jiter-0.13.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1f8a55b848cbabf97d861495cd65f1e5c590246fabca8b48e1747c4dfc8f85bf", size = 306897, upload-time = "2026-02-02T12:36:16.748Z" }, - { url = "https://files.pythonhosted.org/packages/7c/02/be5b870d1d2be5dd6a91bdfb90f248fbb7dcbd21338f092c6b89817c3dbf/jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a", size = 317507, upload-time = "2026-02-02T12:36:18.351Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/b25d2ec333615f5f284f3a4024f7ce68cfa0604c322c6808b2344c7f5d2b/jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb", size = 350560, upload-time = "2026-02-02T12:36:19.746Z" }, - { url = "https://files.pythonhosted.org/packages/be/ec/74dcb99fef0aca9fbe56b303bf79f6bd839010cb18ad41000bf6cc71eec0/jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2", size = 363232, upload-time = "2026-02-02T12:36:21.243Z" }, - { url = "https://files.pythonhosted.org/packages/1b/37/f17375e0bb2f6a812d4dd92d7616e41917f740f3e71343627da9db2824ce/jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f", size = 483727, upload-time = "2026-02-02T12:36:22.688Z" }, - { url = "https://files.pythonhosted.org/packages/77/d2/a71160a5ae1a1e66c1395b37ef77da67513b0adba73b993a27fbe47eb048/jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159", size = 370799, upload-time = "2026-02-02T12:36:24.106Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/ed5e478ff0eb4e8aa5fd998f9d69603c9fd3f32de3bd16c2b1194f68361c/jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663", size = 359120, upload-time = "2026-02-02T12:36:25.519Z" }, - { url = "https://files.pythonhosted.org/packages/16/be/7ffd08203277a813f732ba897352797fa9493faf8dc7995b31f3d9cb9488/jiter-0.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5467696f6b827f1116556cb0db620440380434591e93ecee7fd14d1a491b6daa", size = 390664, upload-time = "2026-02-02T12:36:26.866Z" }, - { url = "https://files.pythonhosted.org/packages/d1/84/e0787856196d6d346264d6dcccb01f741e5f0bd014c1d9a2ebe149caf4f3/jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820", size = 513543, upload-time = "2026-02-02T12:36:28.217Z" }, - { url = "https://files.pythonhosted.org/packages/65/50/ecbd258181c4313cf79bca6c88fb63207d04d5bf5e4f65174114d072aa55/jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68", size = 547262, upload-time = "2026-02-02T12:36:29.678Z" }, - { url = "https://files.pythonhosted.org/packages/27/da/68f38d12e7111d2016cd198161b36e1f042bd115c169255bcb7ec823a3bf/jiter-0.13.0-cp313-cp313-win32.whl", hash = "sha256:36ebfbcffafb146d0e6ffb3e74d51e03d9c35ce7c625c8066cdbfc7b953bdc72", size = 200630, upload-time = "2026-02-02T12:36:31.808Z" }, - { url = "https://files.pythonhosted.org/packages/25/65/3bd1a972c9a08ecd22eb3b08a95d1941ebe6938aea620c246cf426ae09c2/jiter-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d76029f077379374cf0dbc78dbe45b38dec4a2eb78b08b5194ce836b2517afc", size = 202602, upload-time = "2026-02-02T12:36:33.679Z" }, - { url = "https://files.pythonhosted.org/packages/15/fe/13bd3678a311aa67686bb303654792c48206a112068f8b0b21426eb6851e/jiter-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb7613e1a427cfcb6ea4544f9ac566b93d5bf67e0d48c787eca673ff9c9dff2b", size = 185939, upload-time = "2026-02-02T12:36:35.065Z" }, - { url = "https://files.pythonhosted.org/packages/49/19/a929ec002ad3228bc97ca01dbb14f7632fffdc84a95ec92ceaf4145688ae/jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10", size = 316616, upload-time = "2026-02-02T12:36:36.579Z" }, - { url = "https://files.pythonhosted.org/packages/52/56/d19a9a194afa37c1728831e5fb81b7722c3de18a3109e8f282bfc23e587a/jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef", size = 346850, upload-time = "2026-02-02T12:36:38.058Z" }, - { url = "https://files.pythonhosted.org/packages/36/4a/94e831c6bf287754a8a019cb966ed39ff8be6ab78cadecf08df3bb02d505/jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6", size = 358551, upload-time = "2026-02-02T12:36:39.417Z" }, - { url = "https://files.pythonhosted.org/packages/a2/ec/a4c72c822695fa80e55d2b4142b73f0012035d9fcf90eccc56bc060db37c/jiter-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2b4972c6df33731aac0742b64fd0d18e0a69bc7d6e03108ce7d40c85fd9e3e6d", size = 201950, upload-time = "2026-02-02T12:36:40.791Z" }, - { url = "https://files.pythonhosted.org/packages/b6/00/393553ec27b824fbc29047e9c7cd4a3951d7fbe4a76743f17e44034fa4e4/jiter-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:701a1e77d1e593c1b435315ff625fd071f0998c5f02792038a5ca98899261b7d", size = 185852, upload-time = "2026-02-02T12:36:42.077Z" }, - { url = "https://files.pythonhosted.org/packages/80/60/e50fa45dd7e2eae049f0ce964663849e897300433921198aef94b6ffa23a/jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:3d744a6061afba08dd7ae375dcde870cffb14429b7477e10f67e9e6d68772a0a", size = 305169, upload-time = "2026-02-02T12:37:50.376Z" }, - { url = "https://files.pythonhosted.org/packages/d2/73/a009f41c5eed71c49bec53036c4b33555afcdee70682a18c6f66e396c039/jiter-0.13.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:ff732bd0a0e778f43d5009840f20b935e79087b4dc65bd36f1cd0f9b04b8ff7f", size = 303808, upload-time = "2026-02-02T12:37:52.092Z" }, - { url = "https://files.pythonhosted.org/packages/c4/10/528b439290763bff3d939268085d03382471b442f212dca4ff5f12802d43/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab44b178f7981fcaea7e0a5df20e773c663d06ffda0198f1a524e91b2fde7e59", size = 337384, upload-time = "2026-02-02T12:37:53.582Z" }, - { url = "https://files.pythonhosted.org/packages/67/8a/a342b2f0251f3dac4ca17618265d93bf244a2a4d089126e81e4c1056ac50/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb00b6d26db67a05fe3e12c76edc75f32077fb51deed13822dc648fa373bc19", size = 343768, upload-time = "2026-02-02T12:37:55.055Z" }, -] - [[package]] name = "joblib" version = "1.5.3" @@ -1535,33 +838,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, ] -[[package]] -name = "jsonschema" -version = "4.26.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2025.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, -] - [[package]] name = "jupyter-client" version = "8.8.0" @@ -1679,47 +955,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/06/c3394327f815fade875724c0f6cff529777c96a1e17fea066deb997f8cf5/langchain-1.2.10-py3-none-any.whl", hash = "sha256:e07a377204451fffaed88276b8193e894893b1003e25c5bca6539288ccca3698", size = 111738, upload-time = "2026-02-10T14:56:47.985Z" }, ] -[[package]] -name = "langchain-classic" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "langchain-text-splitters" }, - { name = "langsmith" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "sqlalchemy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7c/4b/bd03518418ece4c13192a504449b58c28afee915dc4a6f4b02622458cb1b/langchain_classic-1.0.1.tar.gz", hash = "sha256:40a499684df36b005a1213735dc7f8dca8f5eb67978d6ec763e7a49780864fdc", size = 10516020, upload-time = "2025-12-23T22:55:22.615Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/0f/eab87f017d7fe28e8c11fff614f4cdbfae32baadb77d0f79e9f922af1df2/langchain_classic-1.0.1-py3-none-any.whl", hash = "sha256:131d83a02bb80044c68fedc1ab4ae885d5b8f8c2c742d8ab9e7534ad9cda8e80", size = 1040666, upload-time = "2025-12-23T22:55:21.025Z" }, -] - -[[package]] -name = "langchain-community" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "dataclasses-json" }, - { name = "httpx-sse" }, - { name = "langchain-classic" }, - { name = "langchain-core" }, - { name = "langsmith" }, - { name = "numpy" }, - { name = "pydantic-settings" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "sqlalchemy" }, - { name = "tenacity" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/53/97/a03585d42b9bdb6fbd935282d6e3348b10322a24e6ce12d0c99eb461d9af/langchain_community-0.4.1.tar.gz", hash = "sha256:f3b211832728ee89f169ddce8579b80a085222ddb4f4ed445a46e977d17b1e85", size = 33241144, upload-time = "2025-10-27T15:20:32.504Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/a4/c4fde67f193401512337456cabc2148f2c43316e445f5decd9f8806e2992/langchain_community-0.4.1-py3-none-any.whl", hash = "sha256:2135abb2c7748a35c84613108f7ebf30f8505b18c3c18305ffaecfc7651f6c6a", size = 2533285, upload-time = "2025-10-27T15:20:30.767Z" }, -] - [[package]] name = "langchain-core" version = "1.2.17" @@ -1769,45 +1004,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2f/96/67e029665e9c348a2f17d1a681dc139631a6d8241b7a8d8e6ee69ff70a4b/langchain_mistralai-1.1.1-py3-none-any.whl", hash = "sha256:47839fc69c879bad4ff60133f238c15574416c2dcd850121621a7e9de45800c1", size = 19439, upload-time = "2025-12-12T22:11:53.546Z" }, ] -[[package]] -name = "langchain-ollama" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "ollama" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/73/51/72cd04d74278f3575f921084f34280e2f837211dc008c9671c268c578afe/langchain_ollama-1.0.1.tar.gz", hash = "sha256:e37880c2f41cdb0895e863b1cfd0c2c840a117868b3f32e44fef42569e367443", size = 153850, upload-time = "2025-12-12T21:48:28.68Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/46/f2907da16dc5a5a6c679f83b7de21176178afad8d2ca635a581429580ef6/langchain_ollama-1.0.1-py3-none-any.whl", hash = "sha256:37eb939a4718a0255fe31e19fbb0def044746c717b01b97d397606ebc3e9b440", size = 29207, upload-time = "2025-12-12T21:48:27.832Z" }, -] - -[[package]] -name = "langchain-openai" -version = "1.1.10" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "openai" }, - { name = "tiktoken" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d6/0f/01147f842499338ae3b0dd0a351fb83006d9ed623cf3a999bd68ba5bbe2d/langchain_openai-1.1.10.tar.gz", hash = "sha256:ca6fae7cf19425acc81814efed59c7d205ec9a1f284fd1d08aae9bda85d6501b", size = 1059755, upload-time = "2026-02-17T18:03:44.506Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/72/17/3785cbcdc81c451179247e4176d2697879cb4f45ab2c59d949ca574e072d/langchain_openai-1.1.10-py3-none-any.whl", hash = "sha256:d91b2c09e9fbc70f7af45345d3aa477744962d41c73a029beb46b4f83b824827", size = 87205, upload-time = "2026-02-17T18:03:43.502Z" }, -] - -[[package]] -name = "langchain-text-splitters" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/85/38/14121ead61e0e75f79c3a35e5148ac7c2fe754a55f76eab3eed573269524/langchain_text_splitters-1.1.1.tar.gz", hash = "sha256:34861abe7c07d9e49d4dc852d0129e26b32738b60a74486853ec9b6d6a8e01d2", size = 279352, upload-time = "2026-02-18T23:02:42.798Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/66/d9e0c3b83b0ad75ee746c51ba347cacecb8d656b96e1d513f3e334d1ccab/langchain_text_splitters-1.1.1-py3-none-any.whl", hash = "sha256:5ed0d7bf314ba925041e7d7d17cd8b10f688300d5415fb26c29442f061e329dc", size = 35734, upload-time = "2026-02-18T23:02:41.913Z" }, -] - [[package]] name = "langgraph" version = "1.0.10" @@ -1935,22 +1131,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4a/a7/d526ae86708cea531935ae777b6dbcabe7db52718e6401e0fb9c5edea80e/llvmlite-0.46.0-cp313-cp313-win_amd64.whl", hash = "sha256:67438fd30e12349ebb054d86a5a1a57fd5e87d264d2451bcfafbbbaa25b82a35", size = 38138941, upload-time = "2025-12-08T18:15:22.536Z" }, ] -[[package]] -name = "mapclassify" -version = "2.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "networkx" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "scikit-learn" }, - { name = "scipy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/05/7e/767ae65d2652f720213fd6571c5a945b81352895b78b32f77b27d53af139/mapclassify-2.10.0.tar.gz", hash = "sha256:0d6736a08c0b1e10e6197224ef512951514204706514244bd01aea49fd1442b3", size = 6172445, upload-time = "2025-07-11T21:37:48.844Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/5e/19fb53bd69379498c47bc234ca4d2851cfbca333d6d6929b10251916da25/mapclassify-2.10.0-py3-none-any.whl", hash = "sha256:dc39d6d924d546cdf2573bd587a7770e1a6ded3cb98272d6f0144319038566c5", size = 882230, upload-time = "2025-07-11T21:37:47.401Z" }, -] - [[package]] name = "markdown" version = "3.10.2" @@ -2013,18 +1193,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, ] -[[package]] -name = "marshmallow" -version = "3.26.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/79/de6c16cc902f4fc372236926b0ce2ab7845268dcc30fb2fbb7f71b418631/marshmallow-3.26.2.tar.gz", hash = "sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57", size = 222095, upload-time = "2025-12-22T06:53:53.309Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl", hash = "sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73", size = 50964, upload-time = "2025-12-22T06:53:51.801Z" }, -] - [[package]] name = "matplotlib" version = "3.10.8" @@ -2130,92 +1298,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/8a/a1/92127ae8088e45a90a04c5a334db8ddac71815a968884b663bc53416cff6/multi-agent-ale-py-0.1.11.tar.gz", hash = "sha256:ba3ff800420f65ff354574975bdfa79035ae1597e8938b37d1df12ffc4122edb", size = 551973, upload-time = "2021-05-24T21:01:43.122Z" } -[[package]] -name = "multidict" -version = "6.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, - { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, - { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, - { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, - { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, - { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, - { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, - { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, - { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, - { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, - { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, - { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, - { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, - { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, - { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, - { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, - { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, - { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, - { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, - { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, - { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, - { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, - { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, - { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, - { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, - { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, - { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, - { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, - { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, - { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, - { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, - { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, - { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, - { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, - { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, - { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, - { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, - { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, - { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, - { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, - { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, - { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, - { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, - { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, - { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, - { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, - { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, - { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, -] - -[[package]] -name = "multiprocess" -version = "0.70.18" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dill" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/fd/2ae3826f5be24c6ed87266bc4e59c46ea5b059a103f3d7e7eb76a52aeecb/multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d", size = 1798503, upload-time = "2025-04-17T03:11:27.742Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/d8/0cba6cf51a1a31f20471fbc823a716170c73012ddc4fb85d706630ed6e8f/multiprocess-0.70.18-py310-none-any.whl", hash = "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea", size = 134948, upload-time = "2025-04-17T03:11:20.223Z" }, - { url = "https://files.pythonhosted.org/packages/4b/88/9039f2fed1012ef584751d4ceff9ab4a51e5ae264898f0b7cbf44340a859/multiprocess-0.70.18-py311-none-any.whl", hash = "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d", size = 144462, upload-time = "2025-04-17T03:11:21.657Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b6/5f922792be93b82ec6b5f270bbb1ef031fd0622847070bbcf9da816502cc/multiprocess-0.70.18-py312-none-any.whl", hash = "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2", size = 150287, upload-time = "2025-04-17T03:11:22.69Z" }, - { url = "https://files.pythonhosted.org/packages/ee/25/7d7e78e750bc1aecfaf0efbf826c69a791d2eeaf29cf20cba93ff4cced78/multiprocess-0.70.18-py313-none-any.whl", hash = "sha256:871743755f43ef57d7910a38433cfe41319e72be1bbd90b79c7a5ac523eb9334", size = 151917, upload-time = "2025-04-17T03:11:24.044Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c3/ca84c19bd14cdfc21c388fdcebf08b86a7a470ebc9f5c3c084fc2dbc50f7/multiprocess-0.70.18-py38-none-any.whl", hash = "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b", size = 132636, upload-time = "2025-04-17T03:11:24.936Z" }, - { url = "https://files.pythonhosted.org/packages/6c/28/dd72947e59a6a8c856448a5e74da6201cb5502ddff644fbc790e4bd40b9a/multiprocess-0.70.18-py39-none-any.whl", hash = "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8", size = 133478, upload-time = "2025-04-17T03:11:26.253Z" }, -] - -[[package]] -name = "multitasking" -version = "0.0.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/17/0d/74f0293dfd7dcc3837746d0138cbedd60b31701ecc75caec7d3f281feba0/multitasking-0.0.12.tar.gz", hash = "sha256:2fba2fa8ed8c4b85e227c5dd7dc41c7d658de3b6f247927316175a57349b84d1", size = 19984, upload-time = "2025-07-20T21:27:51.636Z" } - [[package]] name = "murmurhash" version = "1.0.15" @@ -2248,15 +1330,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/89/4ad9d215ef6ade89f27a72dc4e86b98ef1a43534cc3e6a6900a362a0bf0a/murmurhash-1.0.15-cp313-cp313t-win_arm64.whl", hash = "sha256:189a8de4d657b5da9efd66601b0636330b08262b3a55431f2379097c986995d0", size = 25398, upload-time = "2025-11-14T09:50:43.023Z" }, ] -[[package]] -name = "mypy-extensions" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, -] - [[package]] name = "namex" version = "0.1.0" @@ -2275,21 +1348,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4b/27/20770bd6bf8fbe1e16f848ba21da9df061f38d2e6483952c29d2bb5d1d8b/narwhals-2.17.0-py3-none-any.whl", hash = "sha256:2ac5307b7c2b275a7d66eeda906b8605e3d7a760951e188dcfff86e8ebe083dd", size = 444897, upload-time = "2026-02-23T09:44:32.006Z" }, ] -[[package]] -name = "nbformat" -version = "5.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastjsonschema" }, - { name = "jsonschema" }, - { name = "jupyter-core" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, -] - [[package]] name = "nest-asyncio" version = "1.6.0" @@ -2526,47 +1584,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" }, ] -[[package]] -name = "oauthlib" -version = "3.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, -] - -[[package]] -name = "ollama" -version = "0.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9d/5a/652dac4b7affc2b37b95386f8ae78f22808af09d720689e3d7a86b6ed98e/ollama-0.6.1.tar.gz", hash = "sha256:478c67546836430034b415ed64fa890fd3d1ff91781a9d548b3325274e69d7c6", size = 51620, upload-time = "2025-11-13T23:02:17.416Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/4f/4a617ee93d8208d2bcf26b2d8b9402ceaed03e3853c754940e2290fed063/ollama-0.6.1-py3-none-any.whl", hash = "sha256:fc4c984b345735c5486faeee67d8a265214a31cbb828167782dc642ce0a2bf8c", size = 14354, upload-time = "2025-11-13T23:02:16.292Z" }, -] - -[[package]] -name = "openai" -version = "2.24.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/13/17e87641b89b74552ed408a92b231283786523edddc95f3545809fab673c/openai-2.24.0.tar.gz", hash = "sha256:1e5769f540dbd01cb33bc4716a23e67b9d695161a734aff9c5f925e2bf99a673", size = 658717, upload-time = "2026-02-24T20:02:07.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/30/844dc675ee6902579b8eef01ed23917cc9319a1c9c0c14ec6e39340c96d0/openai-2.24.0-py3-none-any.whl", hash = "sha256:fed30480d7d6c884303287bde864980a4b137b60553ffbcf9ab4a233b7a73d94", size = 1120122, upload-time = "2026-02-24T20:02:05.669Z" }, -] - [[package]] name = "opencv-python" version = "4.13.0.92" @@ -2585,18 +1602,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/a5/1be1516390333ff9be3a9cb648c9f33df79d5096e5884b5df71a588af463/opencv_python-4.13.0.92-cp37-abi3-win_amd64.whl", hash = "sha256:423d934c9fafb91aad38edf26efb46da91ffbc05f3f59c4b0c72e699720706f5", size = 40212062, upload-time = "2026-02-05T07:02:12.724Z" }, ] -[[package]] -name = "openpyxl" -version = "3.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "et-xmlfile" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, -] - [[package]] name = "opt-einsum" version = "3.4.0" @@ -2783,27 +1788,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, ] -[[package]] -name = "patsy" -version = "1.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/be/44/ed13eccdd0519eff265f44b670d46fbb0ec813e2274932dc1c0e48520f7d/patsy-1.0.2.tar.gz", hash = "sha256:cdc995455f6233e90e22de72c37fcadb344e7586fb83f06696f54d92f8ce74c0", size = 399942, upload-time = "2025-10-20T16:17:37.535Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl", hash = "sha256:37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a", size = 233301, upload-time = "2025-10-20T16:17:36.563Z" }, -] - -[[package]] -name = "peewee" -version = "4.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/a0/307e09edfae54f103d66b54d82fdfd22cfc25e733731c97173f4ec661fc3/peewee-4.0.1.tar.gz", hash = "sha256:beb1a173a52952a4d69197ca36408166740b2ced339c0e8159617c3fa1e1c4da", size = 700753, upload-time = "2026-03-01T17:26:56.125Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/99/0f8d9e46df9812ab31dadb07ba304c3ff6d6076bf19a67f4d046790be2e1/peewee-4.0.1-py3-none-any.whl", hash = "sha256:10afaa02c9f6d0f2dfe0f5b9007075c985eb141ab740a8831e37be2a61b3595c", size = 139369, upload-time = "2026-03-01T17:26:54.597Z" }, -] - [[package]] name = "pettingzoo" version = "1.25.0" @@ -2901,34 +1885,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/d2/c6e44dba74f17c6216ce1b56044a9b93a929f1c2d5bdaff892512b260f5e/plotly-6.6.0-py3-none-any.whl", hash = "sha256:8d6daf0f87412e0c0bfe72e809d615217ab57cc715899a1e5145135a7800d1d0", size = 9910315, upload-time = "2026-03-02T21:10:18.131Z" }, ] -[[package]] -name = "polars" -version = "1.38.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "polars-runtime-32" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c6/5e/208a24471a433bcd0e9a6889ac49025fd4daad2815c8220c5bd2576e5f1b/polars-1.38.1.tar.gz", hash = "sha256:803a2be5344ef880ad625addfb8f641995cfd777413b08a10de0897345778239", size = 717667, upload-time = "2026-02-06T18:13:23.013Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/49/737c1a6273c585719858261753da0b688454d1b634438ccba8a9c4eb5aab/polars-1.38.1-py3-none-any.whl", hash = "sha256:a29479c48fed4984d88b656486d221f638cba45d3e961631a50ee5fdde38cb2c", size = 810368, upload-time = "2026-02-06T18:11:55.819Z" }, -] - -[[package]] -name = "polars-runtime-32" -version = "1.38.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/4b/04d6b3fb7cf336fbe12fbc4b43f36d1783e11bb0f2b1e3980ec44878df06/polars_runtime_32-1.38.1.tar.gz", hash = "sha256:04f20ed1f5c58771f34296a27029dc755a9e4b1390caeaef8f317e06fdfce2ec", size = 2812631, upload-time = "2026-02-06T18:13:25.206Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/a2/a00defbddadd8cf1042f52380dcba6b6592b03bac8e3b34c436b62d12d3b/polars_runtime_32-1.38.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:18154e96044724a0ac38ce155cf63aa03c02dd70500efbbf1a61b08cadd269ef", size = 44108001, upload-time = "2026-02-06T18:11:58.127Z" }, - { url = "https://files.pythonhosted.org/packages/a7/fb/599ff3709e6a303024efd7edfd08cf8de55c6ac39527d8f41cbc4399385f/polars_runtime_32-1.38.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c49acac34cc4049ed188f1eb67d6ff3971a39b4af7f7b734b367119970f313ac", size = 40230140, upload-time = "2026-02-06T18:12:01.181Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8c/3ac18d6f89dc05fe2c7c0ee1dc5b81f77a5c85ad59898232c2500fe2ebbf/polars_runtime_32-1.38.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef2ef2626a954e010e006cc8e4de467ecf32d08008f130cea1c78911f545323", size = 41994039, upload-time = "2026-02-06T18:12:04.332Z" }, - { url = "https://files.pythonhosted.org/packages/f2/5a/61d60ec5cc0ab37cbd5a699edb2f9af2875b7fdfdfb2a4608ca3cc5f0448/polars_runtime_32-1.38.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8a5f7a8125e2d50e2e060296551c929aec09be23a9edcb2b12ca923f555a5ba", size = 45755804, upload-time = "2026-02-06T18:12:07.846Z" }, - { url = "https://files.pythonhosted.org/packages/91/54/02cd4074c98c361ccd3fec3bcb0bd68dbc639c0550c42a4436b0ff0f3ccf/polars_runtime_32-1.38.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:10d19cd9863e129273b18b7fcaab625b5c8143c2d22b3e549067b78efa32e4fa", size = 42159605, upload-time = "2026-02-06T18:12:10.919Z" }, - { url = "https://files.pythonhosted.org/packages/8e/f3/b2a5e720cc56eaa38b4518e63aa577b4bbd60e8b05a00fe43ca051be5879/polars_runtime_32-1.38.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61e8d73c614b46a00d2f853625a7569a2e4a0999333e876354ac81d1bf1bb5e2", size = 45336615, upload-time = "2026-02-06T18:12:14.074Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8d/ee2e4b7de948090cfb3df37d401c521233daf97bfc54ddec5d61d1d31618/polars_runtime_32-1.38.1-cp310-abi3-win_amd64.whl", hash = "sha256:08c2b3b93509c1141ac97891294ff5c5b0c548a373f583eaaea873a4bf506437", size = 45680732, upload-time = "2026-02-06T18:12:19.097Z" }, - { url = "https://files.pythonhosted.org/packages/bf/18/72c216f4ab0c82b907009668f79183ae029116ff0dd245d56ef58aac48e7/polars_runtime_32-1.38.1-cp310-abi3-win_arm64.whl", hash = "sha256:6d07d0cc832bfe4fb54b6e04218c2c27afcfa6b9498f9f6bbf262a00d58cc7c4", size = 41639413, upload-time = "2026-02-06T18:12:22.044Z" }, -] - [[package]] name = "preshed" version = "3.0.12" @@ -2969,72 +1925,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, ] -[[package]] -name = "propcache" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, - { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, - { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, - { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, - { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, - { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, - { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, - { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, - { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, - { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, - { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, - { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, - { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, - { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, - { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, - { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, - { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, - { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, - { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, - { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, - { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, - { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, - { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, - { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, - { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, - { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, - { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, - { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, - { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, - { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, - { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, -] - -[[package]] -name = "proto-plus" -version = "1.27.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3a/02/8832cde80e7380c600fbf55090b6ab7b62bd6825dbedde6d6657c15a1f8e/proto_plus-1.27.1.tar.gz", hash = "sha256:912a7460446625b792f6448bade9e55cd4e41e6ac10e27009ef71a7f317fa147", size = 56929, upload-time = "2026-02-02T17:34:49.035Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/79/ac273cbbf744691821a9cca88957257f41afe271637794975ca090b9588b/proto_plus-1.27.1-py3-none-any.whl", hash = "sha256:e4643061f3a4d0de092d62aa4ad09fa4756b2cbb89d4627f3985018216f9fefc", size = 50480, upload-time = "2026-02-02T17:34:47.339Z" }, -] - [[package]] name = "protobuf" version = "5.29.6" @@ -3089,56 +1979,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, ] -[[package]] -name = "pyarrow" -version = "23.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/22/134986a4cc224d593c1afde5494d18ff629393d74cc2eddb176669f234a4/pyarrow-23.0.1.tar.gz", hash = "sha256:b8c5873e33440b2bc2f4a79d2b47017a89c5a24116c055625e6f2ee50523f019", size = 1167336, upload-time = "2026-02-16T10:14:12.39Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/4b/4166bb5abbfe6f750fc60ad337c43ecf61340fa52ab386da6e8dbf9e63c4/pyarrow-23.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f4b0dbfa124c0bb161f8b5ebb40f1a680b70279aa0c9901d44a2b5a20806039f", size = 34214575, upload-time = "2026-02-16T10:09:56.225Z" }, - { url = "https://files.pythonhosted.org/packages/e1/da/3f941e3734ac8088ea588b53e860baeddac8323ea40ce22e3d0baa865cc9/pyarrow-23.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7707d2b6673f7de054e2e83d59f9e805939038eebe1763fe811ee8fa5c0cd1a7", size = 35832540, upload-time = "2026-02-16T10:10:03.428Z" }, - { url = "https://files.pythonhosted.org/packages/88/7c/3d841c366620e906d54430817531b877ba646310296df42ef697308c2705/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:86ff03fb9f1a320266e0de855dee4b17da6794c595d207f89bba40d16b5c78b9", size = 44470940, upload-time = "2026-02-16T10:10:10.704Z" }, - { url = "https://files.pythonhosted.org/packages/2c/a5/da83046273d990f256cb79796a190bbf7ec999269705ddc609403f8c6b06/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:813d99f31275919c383aab17f0f455a04f5a429c261cc411b1e9a8f5e4aaaa05", size = 47586063, upload-time = "2026-02-16T10:10:17.95Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3c/b7d2ebcff47a514f47f9da1e74b7949138c58cfeb108cdd4ee62f43f0cf3/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bf5842f960cddd2ef757d486041d57c96483efc295a8c4a0e20e704cbbf39c67", size = 48173045, upload-time = "2026-02-16T10:10:25.363Z" }, - { url = "https://files.pythonhosted.org/packages/43/b2/b40961262213beaba6acfc88698eb773dfce32ecdf34d19291db94c2bd73/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564baf97c858ecc03ec01a41062e8f4698abc3e6e2acd79c01c2e97880a19730", size = 50621741, upload-time = "2026-02-16T10:10:33.477Z" }, - { url = "https://files.pythonhosted.org/packages/f6/70/1fdda42d65b28b078e93d75d371b2185a61da89dda4def8ba6ba41ebdeb4/pyarrow-23.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:07deae7783782ac7250989a7b2ecde9b3c343a643f82e8a4df03d93b633006f0", size = 27620678, upload-time = "2026-02-16T10:10:39.31Z" }, - { url = "https://files.pythonhosted.org/packages/47/10/2cbe4c6f0fb83d2de37249567373d64327a5e4d8db72f486db42875b08f6/pyarrow-23.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6b8fda694640b00e8af3c824f99f789e836720aa8c9379fb435d4c4953a756b8", size = 34210066, upload-time = "2026-02-16T10:10:45.487Z" }, - { url = "https://files.pythonhosted.org/packages/cb/4f/679fa7e84dadbaca7a65f7cdba8d6c83febbd93ca12fa4adf40ba3b6362b/pyarrow-23.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:8ff51b1addc469b9444b7c6f3548e19dc931b172ab234e995a60aea9f6e6025f", size = 35825526, upload-time = "2026-02-16T10:10:52.266Z" }, - { url = "https://files.pythonhosted.org/packages/f9/63/d2747d930882c9d661e9398eefc54f15696547b8983aaaf11d4a2e8b5426/pyarrow-23.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:71c5be5cbf1e1cb6169d2a0980850bccb558ddc9b747b6206435313c47c37677", size = 44473279, upload-time = "2026-02-16T10:11:01.557Z" }, - { url = "https://files.pythonhosted.org/packages/b3/93/10a48b5e238de6d562a411af6467e71e7aedbc9b87f8d3a35f1560ae30fb/pyarrow-23.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9b6f4f17b43bc39d56fec96e53fe89d94bac3eb134137964371b45352d40d0c2", size = 47585798, upload-time = "2026-02-16T10:11:09.401Z" }, - { url = "https://files.pythonhosted.org/packages/5c/20/476943001c54ef078dbf9542280e22741219a184a0632862bca4feccd666/pyarrow-23.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fc13fc6c403d1337acab46a2c4346ca6c9dec5780c3c697cf8abfd5e19b6b37", size = 48179446, upload-time = "2026-02-16T10:11:17.781Z" }, - { url = "https://files.pythonhosted.org/packages/4b/b6/5dd0c47b335fcd8edba9bfab78ad961bd0fd55ebe53468cc393f45e0be60/pyarrow-23.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c16ed4f53247fa3ffb12a14d236de4213a4415d127fe9cebed33d51671113e2", size = 50623972, upload-time = "2026-02-16T10:11:26.185Z" }, - { url = "https://files.pythonhosted.org/packages/d5/09/a532297c9591a727d67760e2e756b83905dd89adb365a7f6e9c72578bcc1/pyarrow-23.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:cecfb12ef629cf6be0b1887f9f86463b0dd3dc3195ae6224e74006be4736035a", size = 27540749, upload-time = "2026-02-16T10:12:23.297Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8e/38749c4b1303e6ae76b3c80618f84861ae0c55dd3c2273842ea6f8258233/pyarrow-23.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:29f7f7419a0e30264ea261fdc0e5fe63ce5a6095003db2945d7cd78df391a7e1", size = 34471544, upload-time = "2026-02-16T10:11:32.535Z" }, - { url = "https://files.pythonhosted.org/packages/a3/73/f237b2bc8c669212f842bcfd842b04fc8d936bfc9d471630569132dc920d/pyarrow-23.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:33d648dc25b51fd8055c19e4261e813dfc4d2427f068bcecc8b53d01b81b0500", size = 35949911, upload-time = "2026-02-16T10:11:39.813Z" }, - { url = "https://files.pythonhosted.org/packages/0c/86/b912195eee0903b5611bf596833def7d146ab2d301afeb4b722c57ffc966/pyarrow-23.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd395abf8f91c673dd3589cadc8cc1ee4e8674fa61b2e923c8dd215d9c7d1f41", size = 44520337, upload-time = "2026-02-16T10:11:47.764Z" }, - { url = "https://files.pythonhosted.org/packages/69/c2/f2a717fb824f62d0be952ea724b4f6f9372a17eed6f704b5c9526f12f2f1/pyarrow-23.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:00be9576d970c31defb5c32eb72ef585bf600ef6d0a82d5eccaae96639cf9d07", size = 47548944, upload-time = "2026-02-16T10:11:56.607Z" }, - { url = "https://files.pythonhosted.org/packages/84/a7/90007d476b9f0dc308e3bc57b832d004f848fd6c0da601375d20d92d1519/pyarrow-23.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c2139549494445609f35a5cda4eb94e2c9e4d704ce60a095b342f82460c73a83", size = 48236269, upload-time = "2026-02-16T10:12:04.47Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3f/b16fab3e77709856eb6ac328ce35f57a6d4a18462c7ca5186ef31b45e0e0/pyarrow-23.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7044b442f184d84e2351e5084600f0d7343d6117aabcbc1ac78eb1ae11eb4125", size = 50604794, upload-time = "2026-02-16T10:12:11.797Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a1/22df0620a9fac31d68397a75465c344e83c3dfe521f7612aea33e27ab6c0/pyarrow-23.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a35581e856a2fafa12f3f54fce4331862b1cfb0bef5758347a858a4aa9d6bae8", size = 27660642, upload-time = "2026-02-16T10:12:17.746Z" }, -] - -[[package]] -name = "pyasn1" -version = "0.6.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" }, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyasn1" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, -] - [[package]] name = "pycparser" version = "3.0" @@ -3206,20 +2046,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, ] -[[package]] -name = "pydantic-settings" -version = "2.13.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "python-dotenv" }, - { name = "typing-inspection" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/52/6d/fffca34caecc4a3f97bda81b2098da5e8ab7efc9a66e819074a11955d87e/pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025", size = 223826, upload-time = "2026-02-19T13:45:08.055Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237", size = 58929, upload-time = "2026-02-19T13:45:06.034Z" }, -] - [[package]] name = "pygame" version = "2.6.1" @@ -3295,37 +2121,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/e6/94145d714402fd5ade00b5661f2d0ab981219e07f7db9bfa16786cdb9c04/pynndescent-0.6.0-py3-none-any.whl", hash = "sha256:dc8c74844e4c7f5cbd1e0cd6909da86fdc789e6ff4997336e344779c3d5538ef", size = 73511, upload-time = "2026-01-08T21:29:57.306Z" }, ] -[[package]] -name = "pyogrio" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "numpy" }, - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/49/d4/12f86b1ed09721363da4c09622464b604c851a9223fc0c6b393fb2012208/pyogrio-0.12.1.tar.gz", hash = "sha256:e548ab705bb3e5383693717de1e6c76da97f3762ab92522cb310f93128a75ff1", size = 303289, upload-time = "2025-11-28T19:04:53.341Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/e0/656b6536549d41b5aec57e0deca1f269b4f17532f0636836f587e581603a/pyogrio-0.12.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:7a0d5ca39184030aec4cde30f4258f75b227a854530d2659babc8189d76e657d", size = 23661857, upload-time = "2025-11-28T19:03:27.744Z" }, - { url = "https://files.pythonhosted.org/packages/14/78/313259e40da728bdb60106ffdc7ea8224d164498cb838ecb79b634aab967/pyogrio-0.12.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:feaff42bbe8087ca0b30e33b09d1ce049ca55fe83ad83db1139ef37d1d04f30c", size = 25237106, upload-time = "2025-11-28T19:03:30.018Z" }, - { url = "https://files.pythonhosted.org/packages/8f/ca/5368571a8b00b941ccfbe6ea29a5566aaffd45d4eb1553b956f7755af43e/pyogrio-0.12.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:81096a5139532de5a8003ef02b41d5d2444cb382a9aecd1165b447eb549180d3", size = 31417048, upload-time = "2025-11-28T19:03:32.572Z" }, - { url = "https://files.pythonhosted.org/packages/ef/85/6eeb875f27bf498d657eb5dab9f58e4c48b36c9037122787abee9a1ba4ba/pyogrio-0.12.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:41b78863f782f7a113ed0d36a5dc74d59735bd3a82af53510899bb02a18b06bb", size = 30952115, upload-time = "2025-11-28T19:03:35.332Z" }, - { url = "https://files.pythonhosted.org/packages/36/f7/cf8bec9024625947e1a71441906f60a5fa6f9e4c441c4428037e73b1fcc8/pyogrio-0.12.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:8b65be8c4258b27cc8f919b21929cecdadda4c353e3637fa30850339ef4d15c5", size = 32537246, upload-time = "2025-11-28T19:03:37.969Z" }, - { url = "https://files.pythonhosted.org/packages/ab/10/7c9f5e428273574e69f217eba3a6c0c42936188ad4dcd9e2c41ebb711188/pyogrio-0.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:1291b866c2c81d991bda15021b08b3621709b40ee3a85689229929e9465788bf", size = 22933980, upload-time = "2025-11-28T19:03:41.047Z" }, - { url = "https://files.pythonhosted.org/packages/be/56/f56e79f71b84aa9bea25fdde39fab3846841bd7926be96f623eb7253b7e1/pyogrio-0.12.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:ec0e47a5a704e575092b2fd5c83fa0472a1d421e590f94093eb837bb0a11125d", size = 23658483, upload-time = "2025-11-28T19:03:43.567Z" }, - { url = "https://files.pythonhosted.org/packages/66/ac/5559f8a35d58a16cbb2dd7602dd11936ff8796d8c9bf789f14da88764ec3/pyogrio-0.12.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:b4c888fc08f388be4dd99dfca5e84a5cdc5994deeec0230cc45144d3460e2b21", size = 25232737, upload-time = "2025-11-28T19:03:45.92Z" }, - { url = "https://files.pythonhosted.org/packages/59/58/925f1c129ddd7cbba8dea4e7609797cea7a76dbc863ac9afd318a679c4b9/pyogrio-0.12.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:73a88436f9962750d782853727897ac2722cac5900d920e39fab3e56d7a6a7f1", size = 31377986, upload-time = "2025-11-28T19:03:48.495Z" }, - { url = "https://files.pythonhosted.org/packages/18/5f/c87034e92847b1844d0e8492a6a8e3301147d32c5e57909397ce64dbedf5/pyogrio-0.12.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:b5d248a0d59fe9bbf9a35690b70004c67830ee0ebe7d4f7bb8ffd8659f684b3a", size = 30915791, upload-time = "2025-11-28T19:03:51.267Z" }, - { url = "https://files.pythonhosted.org/packages/46/35/b874f79d03e9f900012cf609f7fff97b77164f2e14ee5aac282f8a999c1b/pyogrio-0.12.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0622bc1a186421547660271083079b38d42e6f868802936d8538c0b379f1ab6b", size = 32499754, upload-time = "2025-11-28T19:03:58.776Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c4/705678c9c4200130290b3a104b45c0cc10aaa48fcef3b2585b34e34ab3e1/pyogrio-0.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:207bd60c7ffbcea84584596e3637653aa7095e9ee20fa408f90c7f9460392613", size = 22933945, upload-time = "2025-11-28T19:04:01.551Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e0/d92d4944001330bc87742d43f112d63d12fc89378b6187e62ff3fc1e8e85/pyogrio-0.12.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:1511b39a283fa27cda906cd187a791578942a87a40b6a06697d9b43bb8ac80b0", size = 23692697, upload-time = "2025-11-28T19:04:04.208Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d7/40acbe06d1b1140e3bb27b79e9163776469c1dc785f1be7d9a7fc7b95c87/pyogrio-0.12.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:e486cd6aa9ea8a15394a5f84e019d61ec18f257eeeb642348bd68c3d1e57280b", size = 25258083, upload-time = "2025-11-28T19:04:07.121Z" }, - { url = "https://files.pythonhosted.org/packages/87/a1/39fefd9cddd95986700524f43d3093b4350f6e4fc200623c3838424a5080/pyogrio-0.12.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3f1a19f63bfd1d3042e45f37ad1d6598123a5a604b6c4ba3f38b419273486cd", size = 31368995, upload-time = "2025-11-28T19:04:09.88Z" }, - { url = "https://files.pythonhosted.org/packages/18/d7/da88c566e67d741a03851eb8d01358949d52e0b0fc2cd953582dc6d89ff8/pyogrio-0.12.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:f3dcc59b3316b8a0f59346bcc638a4d69997864a4d21da839192f50c4c92369a", size = 31035589, upload-time = "2025-11-28T19:04:12.993Z" }, - { url = "https://files.pythonhosted.org/packages/11/ac/8f0199f0d31b8ddbc4b4ea1918df8070fdf3e0a63100b898633ec9396224/pyogrio-0.12.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:a0643e041dee3e8e038fce69f52a915ecb486e6d7b674c0f9919f3c9e9629689", size = 32487973, upload-time = "2025-11-28T19:04:16.103Z" }, - { url = "https://files.pythonhosted.org/packages/bd/64/8541a27e9635a335835d234dfaeb19d6c26097fd88224eda7791f83ca98d/pyogrio-0.12.1-cp313-cp313t-win_amd64.whl", hash = "sha256:5881017f29e110d3613819667657844d8e961b747f2d35cf92f273c27af6d068", size = 22987374, upload-time = "2025-11-28T19:04:18.91Z" }, -] - [[package]] name = "pyparsing" version = "3.3.2" @@ -3335,53 +2130,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] -[[package]] -name = "pypdf" -version = "6.7.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/52/37cc0aa9e9d1bf7729a737a0d83f8b3f851c8eb137373d9f71eafb0a3405/pypdf-6.7.5.tar.gz", hash = "sha256:40bb2e2e872078655f12b9b89e2f900888bb505e88a82150b64f9f34fa25651d", size = 5304278, upload-time = "2026-03-02T09:05:21.464Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/89/336673efd0a88956562658aba4f0bbef7cb92a6fbcbcaf94926dbc82b408/pypdf-6.7.5-py3-none-any.whl", hash = "sha256:07ba7f1d6e6d9aa2a17f5452e320a84718d4ce863367f7ede2fd72280349ab13", size = 331421, upload-time = "2026-03-02T09:05:19.722Z" }, -] - -[[package]] -name = "pyproj" -version = "3.7.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/90/67bd7260b4ea9b8b20b4f58afef6c223ecb3abf368eb4ec5bc2cdef81b49/pyproj-3.7.2.tar.gz", hash = "sha256:39a0cf1ecc7e282d1d30f36594ebd55c9fae1fda8a2622cee5d100430628f88c", size = 226279, upload-time = "2025-08-14T12:05:42.18Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/ab/9893ea9fb066be70ed9074ae543914a618c131ed8dff2da1e08b3a4df4db/pyproj-3.7.2-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:0a9bb26a6356fb5b033433a6d1b4542158fb71e3c51de49b4c318a1dff3aeaab", size = 6219832, upload-time = "2025-08-14T12:04:10.264Z" }, - { url = "https://files.pythonhosted.org/packages/53/78/4c64199146eed7184eb0e85bedec60a4aa8853b6ffe1ab1f3a8b962e70a0/pyproj-3.7.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:567caa03021178861fad27fabde87500ec6d2ee173dd32f3e2d9871e40eebd68", size = 4620650, upload-time = "2025-08-14T12:04:11.978Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ac/14a78d17943898a93ef4f8c6a9d4169911c994e3161e54a7cedeba9d8dde/pyproj-3.7.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c203101d1dc3c038a56cff0447acc515dd29d6e14811406ac539c21eed422b2a", size = 9667087, upload-time = "2025-08-14T12:04:13.964Z" }, - { url = "https://files.pythonhosted.org/packages/b8/be/212882c450bba74fc8d7d35cbd57e4af84792f0a56194819d98106b075af/pyproj-3.7.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:1edc34266c0c23ced85f95a1ee8b47c9035eae6aca5b6b340327250e8e281630", size = 9552797, upload-time = "2025-08-14T12:04:16.624Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c0/c0f25c87b5d2a8686341c53c1792a222a480d6c9caf60311fec12c99ec26/pyproj-3.7.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa9f26c21bc0e2dc3d224cb1eb4020cf23e76af179a7c66fea49b828611e4260", size = 10837036, upload-time = "2025-08-14T12:04:18.733Z" }, - { url = "https://files.pythonhosted.org/packages/5d/37/5cbd6772addde2090c91113332623a86e8c7d583eccb2ad02ea634c4a89f/pyproj-3.7.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9428b318530625cb389b9ddc9c51251e172808a4af79b82809376daaeabe5e9", size = 10775952, upload-time = "2025-08-14T12:04:20.709Z" }, - { url = "https://files.pythonhosted.org/packages/69/a1/dc250e3cf83eb4b3b9a2cf86fdb5e25288bd40037ae449695550f9e96b2f/pyproj-3.7.2-cp312-cp312-win32.whl", hash = "sha256:b3d99ed57d319da042f175f4554fc7038aa4bcecc4ac89e217e350346b742c9d", size = 5898872, upload-time = "2025-08-14T12:04:22.485Z" }, - { url = "https://files.pythonhosted.org/packages/4a/a6/6fe724b72b70f2b00152d77282e14964d60ab092ec225e67c196c9b463e5/pyproj-3.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:11614a054cd86a2ed968a657d00987a86eeb91fdcbd9ad3310478685dc14a128", size = 6312176, upload-time = "2025-08-14T12:04:24.736Z" }, - { url = "https://files.pythonhosted.org/packages/5d/68/915cc32c02a91e76d02c8f55d5a138d6ef9e47a0d96d259df98f4842e558/pyproj-3.7.2-cp312-cp312-win_arm64.whl", hash = "sha256:509a146d1398bafe4f53273398c3bb0b4732535065fa995270e52a9d3676bca3", size = 6233452, upload-time = "2025-08-14T12:04:27.287Z" }, - { url = "https://files.pythonhosted.org/packages/be/14/faf1b90d267cea68d7e70662e7f88cefdb1bc890bd596c74b959e0517a72/pyproj-3.7.2-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:19466e529b1b15eeefdf8ff26b06fa745856c044f2f77bf0edbae94078c1dfa1", size = 6214580, upload-time = "2025-08-14T12:04:28.804Z" }, - { url = "https://files.pythonhosted.org/packages/35/48/da9a45b184d375f62667f62eba0ca68569b0bd980a0bb7ffcc1d50440520/pyproj-3.7.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:c79b9b84c4a626c5dc324c0d666be0bfcebd99f7538d66e8898c2444221b3da7", size = 4615388, upload-time = "2025-08-14T12:04:30.553Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e7/d2b459a4a64bca328b712c1b544e109df88e5c800f7c143cfbc404d39bfb/pyproj-3.7.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ceecf374cacca317bc09e165db38ac548ee3cad07c3609442bd70311c59c21aa", size = 9628455, upload-time = "2025-08-14T12:04:32.435Z" }, - { url = "https://files.pythonhosted.org/packages/f8/85/c2b1706e51942de19076eff082f8495e57d5151364e78b5bef4af4a1d94a/pyproj-3.7.2-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5141a538ffdbe4bfd157421828bb2e07123a90a7a2d6f30fa1462abcfb5ce681", size = 9514269, upload-time = "2025-08-14T12:04:34.599Z" }, - { url = "https://files.pythonhosted.org/packages/34/38/07a9b89ae7467872f9a476883a5bad9e4f4d1219d31060f0f2b282276cbe/pyproj-3.7.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f000841e98ea99acbb7b8ca168d67773b0191de95187228a16110245c5d954d5", size = 10808437, upload-time = "2025-08-14T12:04:36.485Z" }, - { url = "https://files.pythonhosted.org/packages/12/56/fda1daeabbd39dec5b07f67233d09f31facb762587b498e6fc4572be9837/pyproj-3.7.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8115faf2597f281a42ab608ceac346b4eb1383d3b45ab474fd37341c4bf82a67", size = 10745540, upload-time = "2025-08-14T12:04:38.568Z" }, - { url = "https://files.pythonhosted.org/packages/0d/90/c793182cbba65a39a11db2ac6b479fe76c59e6509ae75e5744c344a0da9d/pyproj-3.7.2-cp313-cp313-win32.whl", hash = "sha256:f18c0579dd6be00b970cb1a6719197fceecc407515bab37da0066f0184aafdf3", size = 5896506, upload-time = "2025-08-14T12:04:41.059Z" }, - { url = "https://files.pythonhosted.org/packages/be/0f/747974129cf0d800906f81cd25efd098c96509026e454d4b66868779ab04/pyproj-3.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:bb41c29d5f60854b1075853fe80c58950b398d4ebb404eb532536ac8d2834ed7", size = 6310195, upload-time = "2025-08-14T12:04:42.974Z" }, - { url = "https://files.pythonhosted.org/packages/82/64/fc7598a53172c4931ec6edf5228280663063150625d3f6423b4c20f9daff/pyproj-3.7.2-cp313-cp313-win_arm64.whl", hash = "sha256:2b617d573be4118c11cd96b8891a0b7f65778fa7733ed8ecdb297a447d439100", size = 6230748, upload-time = "2025-08-14T12:04:44.491Z" }, - { url = "https://files.pythonhosted.org/packages/aa/f0/611dd5cddb0d277f94b7af12981f56e1441bf8d22695065d4f0df5218498/pyproj-3.7.2-cp313-cp313t-macosx_13_0_x86_64.whl", hash = "sha256:d27b48f0e81beeaa2b4d60c516c3a1cfbb0c7ff6ef71256d8e9c07792f735279", size = 6241729, upload-time = "2025-08-14T12:04:46.274Z" }, - { url = "https://files.pythonhosted.org/packages/15/93/40bd4a6c523ff9965e480870611aed7eda5aa2c6128c6537345a2b77b542/pyproj-3.7.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:55a3610d75023c7b1c6e583e48ef8f62918e85a2ae81300569d9f104d6684bb6", size = 4652497, upload-time = "2025-08-14T12:04:48.203Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ae/7150ead53c117880b35e0d37960d3138fe640a235feb9605cb9386f50bb0/pyproj-3.7.2-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:8d7349182fa622696787cc9e195508d2a41a64765da9b8a6bee846702b9e6220", size = 9942610, upload-time = "2025-08-14T12:04:49.652Z" }, - { url = "https://files.pythonhosted.org/packages/d8/17/7a4a7eafecf2b46ab64e5c08176c20ceb5844b503eaa551bf12ccac77322/pyproj-3.7.2-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:d230b186eb876ed4f29a7c5ee310144c3a0e44e89e55f65fb3607e13f6db337c", size = 9692390, upload-time = "2025-08-14T12:04:51.731Z" }, - { url = "https://files.pythonhosted.org/packages/c3/55/ae18f040f6410f0ea547a21ada7ef3e26e6c82befa125b303b02759c0e9d/pyproj-3.7.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:237499c7862c578d0369e2b8ac56eec550e391a025ff70e2af8417139dabb41c", size = 11047596, upload-time = "2025-08-14T12:04:53.748Z" }, - { url = "https://files.pythonhosted.org/packages/e6/2e/d3fff4d2909473f26ae799f9dda04caa322c417a51ff3b25763f7d03b233/pyproj-3.7.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8c225f5978abd506fd9a78eaaf794435e823c9156091cabaab5374efb29d7f69", size = 10896975, upload-time = "2025-08-14T12:04:55.875Z" }, - { url = "https://files.pythonhosted.org/packages/f2/bc/8fc7d3963d87057b7b51ebe68c1e7c51c23129eee5072ba6b86558544a46/pyproj-3.7.2-cp313-cp313t-win32.whl", hash = "sha256:2da731876d27639ff9d2d81c151f6ab90a1546455fabd93368e753047be344a2", size = 5953057, upload-time = "2025-08-14T12:04:58.466Z" }, - { url = "https://files.pythonhosted.org/packages/cc/27/ea9809966cc47d2d51e6d5ae631ea895f7c7c7b9b3c29718f900a8f7d197/pyproj-3.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f54d91ae18dd23b6c0ab48126d446820e725419da10617d86a1b69ada6d881d3", size = 6375414, upload-time = "2025-08-14T12:04:59.861Z" }, - { url = "https://files.pythonhosted.org/packages/5b/f8/1ef0129fba9a555c658e22af68989f35e7ba7b9136f25758809efec0cd6e/pyproj-3.7.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fc52ba896cfc3214dc9f9ca3c0677a623e8fdd096b257c14a31e719d21ff3fdd", size = 6262501, upload-time = "2025-08-14T12:05:01.39Z" }, -] - [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -3394,24 +2142,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] -[[package]] -name = "python-dotenv" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, -] - -[[package]] -name = "pytz" -version = "2025.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, -] - [[package]] name = "pyyaml" version = "6.0.3" @@ -3473,55 +2203,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, ] -[[package]] -name = "rasterio" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "affine" }, - { name = "attrs" }, - { name = "certifi" }, - { name = "click" }, - { name = "cligj" }, - { name = "numpy" }, - { name = "pyparsing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f6/88/edb4b66b6cb2c13f123af5a3896bf70c0cbe73ab3cd4243cb4eb0212a0f6/rasterio-1.5.0.tar.gz", hash = "sha256:1e0ea56b02eea4989b36edf8e58a5a3ef40e1b7edcb04def2603accd5ab3ee7b", size = 452184, upload-time = "2026-01-05T16:06:47.169Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/de/ba1cd11d7d1182bfb26e758bf07016d04e5442f4f5fea35b0d7279b72399/rasterio-1.5.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:420656074897a460f5ef46f657b3061d2e004f9d99e613914b0671643e69d92c", size = 22787192, upload-time = "2026-01-05T16:05:19.779Z" }, - { url = "https://files.pythonhosted.org/packages/e6/42/efaeb6dc531dbcd02fec01c791a853bb5a139a5126ecec579ac0f735eeb9/rasterio-1.5.0-cp312-cp312-macosx_15_0_x86_64.whl", hash = "sha256:c5c3597a783857e760550e8f26365d928b0377ac5ffc3e12ba447ac65ca5406d", size = 24412221, upload-time = "2026-01-05T16:05:22.526Z" }, - { url = "https://files.pythonhosted.org/packages/a2/14/89645988424c40cbcb8334f94305ffe094dd28d85c643341d9690704c9f0/rasterio-1.5.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e14d07a09833b6df6024ce7a57aee1e1977b3aec682e30b1e58ce773462f2382", size = 36128020, upload-time = "2026-01-05T16:05:25.556Z" }, - { url = "https://files.pythonhosted.org/packages/85/23/5a52319a98451ff910f42e5f7f4804bfb39f9327933a89daab685d1ce2dd/rasterio-1.5.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:26dbcffcf0d01fc121cbb92186bc1cb78e16efe62b17be45ad7494446b325cf8", size = 37634010, upload-time = "2026-01-05T16:05:28.673Z" }, - { url = "https://files.pythonhosted.org/packages/57/d6/fe8826f813c98b046d8d4c3bc83053c89c71f367f89257d211fe5dd0b0ba/rasterio-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:ac8d04eee66ca8060763ead607800e5611d857dd005905d920365e24a16ba20a", size = 30142328, upload-time = "2026-01-05T16:05:31.357Z" }, - { url = "https://files.pythonhosted.org/packages/af/62/6397379271d5628ed65ef781bf2d3a8f56094a86e6d8479c6ca506a1b960/rasterio-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:31f1edc45c781ebd087e60cc00a4fc37028dd3fe25cff4098e4139fc9d0565be", size = 28500710, upload-time = "2026-01-05T16:05:33.906Z" }, - { url = "https://files.pythonhosted.org/packages/42/87/42865a77cebf2e524d27b6afc71db48984799ecd1dbe6a213d4713f42f5f/rasterio-1.5.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e7b25b0a19975ccd511e507e6de45b0a2d8fb6802abe49bb726cf48588e34833", size = 22776107, upload-time = "2026-01-05T16:05:36.967Z" }, - { url = "https://files.pythonhosted.org/packages/6a/53/e81683fbbfdf04e019e68b042d9cff8524b0571aa80e4f4d81c373c31a49/rasterio-1.5.0-cp313-cp313-macosx_15_0_x86_64.whl", hash = "sha256:1162c18eaece9f6d2aa1c2ff6b373b99651d93f113f24120a991eaebf28aa4f4", size = 24401477, upload-time = "2026-01-05T16:05:39.702Z" }, - { url = "https://files.pythonhosted.org/packages/bc/3c/6aa6e0690b18eea02a61739cb362a47c5df66138f0a02cc69e1181b964e5/rasterio-1.5.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:8eb87fd6f843eea109f3df9bef83f741b053b716b0465932276e2c0577dfb929", size = 36018214, upload-time = "2026-01-05T16:05:42.741Z" }, - { url = "https://files.pythonhosted.org/packages/48/4a/1af9aa9810fb30668568f2c4dd3eec2412c8e9762b69201d971c509b295e/rasterio-1.5.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:08a7580cbb9b3bd320bdf827e10c9b2424d0df066d8eef6f2feb37e154ce0c17", size = 37544972, upload-time = "2026-01-05T16:05:45.815Z" }, - { url = "https://files.pythonhosted.org/packages/01/62/bfe3408743c9837919ff232474a09ece9eaa88d4ee8c040711fa3dff6dad/rasterio-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:d7d6729c0739b5ec48c33686668a30e27f5bdb361093f180ee7818ff19665547", size = 30140141, upload-time = "2026-01-05T16:05:48.751Z" }, - { url = "https://files.pythonhosted.org/packages/63/ca/e90e19a6d065a718cc3d468a12b9f015289ad17017656dea8c76f7318d1f/rasterio-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:8af7c368c22f0a99d1259ccc5a5cd96c432c2bde6f132c1ac78508cd7445a745", size = 28498556, upload-time = "2026-01-05T16:05:51.334Z" }, - { url = "https://files.pythonhosted.org/packages/a0/ba/e37462d8c33bbbd6c152a0390ec6911a3d9614ded3d2bc6f6a48e147e833/rasterio-1.5.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b4ccfcc8ed9400e4f14efdf2005533fcf72048748b727f85ff89b9291ecdf98a", size = 22920107, upload-time = "2026-01-05T16:05:53.773Z" }, - { url = "https://files.pythonhosted.org/packages/66/dc/7bfa9cf96ac39b451b2f94dfc584c223ec584c52c148df2e4bab60c3341b/rasterio-1.5.0-cp313-cp313t-macosx_15_0_x86_64.whl", hash = "sha256:2f57c36ca4d3c896f7024226bd71eeb5cd10c8183c2a94508534d78cc05ff9e7", size = 24508993, upload-time = "2026-01-05T16:05:57.062Z" }, - { url = "https://files.pythonhosted.org/packages/e5/55/7293743f3b69de4b726c67b8dc9da01fc194070b6becc51add4ca8a20a27/rasterio-1.5.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cc1395475e4bb7032cd81dda4d5558061c4c7d5a50b1b5e146bdf9716d0b9353", size = 36565784, upload-time = "2026-01-05T16:06:00.019Z" }, - { url = "https://files.pythonhosted.org/packages/cf/ef/5354c47de16c6e289728c3a3d6961ffcf7a9ad6313aef7e8db5d6a40c46e/rasterio-1.5.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:592a485e2057b1aaeab4f843c9897628e60e3ff45e2509325c3e1479116599cb", size = 37686456, upload-time = "2026-01-05T16:06:02.772Z" }, - { url = "https://files.pythonhosted.org/packages/b7/fc/fe1f034b1acd1900d9fbd616826d001a3d5811f1d0c97c785f88f525853e/rasterio-1.5.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0c739e70a72fb080f039ee1570c5d02b974dde32ded1a3216e1f13fe38ac4844", size = 30355842, upload-time = "2026-01-05T16:06:06.359Z" }, - { url = "https://files.pythonhosted.org/packages/e0/cb/4dee9697891c9c6474b240d00e27688e03ecd882d3c83cc97eb25c2266ff/rasterio-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:a3539a2f401a7b4b2e94ff2db334878c0e15a2d1c9fe90bb0879c52f89367ae5", size = 28589538, upload-time = "2026-01-05T16:06:09.662Z" }, -] - -[[package]] -name = "referencing" -version = "0.37.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, -] - [[package]] name = "regex" version = "2026.2.28" @@ -3593,19 +2274,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "oauthlib" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, -] - [[package]] name = "requests-toolbelt" version = "1.0.0" @@ -3631,92 +2299,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, ] -[[package]] -name = "rpds-py" -version = "0.30.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, - { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, - { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, - { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, - { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, - { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, - { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, - { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, - { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, - { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, - { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, - { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, - { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, - { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, - { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, - { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, - { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, - { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, - { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, - { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, - { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, - { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, - { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, -] - -[[package]] -name = "rsa" -version = "4.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyasn1" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, -] - -[[package]] -name = "safetensors" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, - { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, - { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, - { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, - { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, - { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, - { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, - { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, - { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, -] - [[package]] name = "scikit-learn" version = "1.8.0" @@ -3804,25 +2386,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, ] -[[package]] -name = "sentence-transformers" -version = "5.2.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, - { name = "numpy" }, - { name = "scikit-learn" }, - { name = "scipy" }, - { name = "torch" }, - { name = "tqdm" }, - { name = "transformers" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/30/21664028fc0776eb1ca024879480bbbab36f02923a8ff9e4cae5a150fa35/sentence_transformers-5.2.3.tar.gz", hash = "sha256:3cd3044e1f3fe859b6a1b66336aac502eaae5d3dd7d5c8fc237f37fbf58137c7", size = 381623, upload-time = "2026-02-17T14:05:20.238Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/9f/dba4b3e18ebbe1eaa29d9f1764fbc7da0cd91937b83f2b7928d15c5d2d36/sentence_transformers-5.2.3-py3-none-any.whl", hash = "sha256:6437c62d4112b615ddebda362dfc16a4308d604c5b68125ed586e3e95d5b2e30", size = 494225, upload-time = "2026-02-17T14:05:18.596Z" }, -] - [[package]] name = "setuptools" version = "82.0.0" @@ -3869,41 +2432,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/d5/1ec3120f461f31a03d1d2f1d339f5058f12c7a542d22bfcc350511eccc8a/shap-0.51.0-cp313-cp313-win_amd64.whl", hash = "sha256:5f51ca55bda10b3fa2125f2b8e08e9d6a6edcbb0e752c67050e87a6d3ca7d53b", size = 555927, upload-time = "2026-03-04T09:18:01.274Z" }, ] -[[package]] -name = "shapely" -version = "2.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4d/bc/0989043118a27cccb4e906a46b7565ce36ca7b57f5a18b78f4f1b0f72d9d/shapely-2.1.2.tar.gz", hash = "sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9", size = 315489, upload-time = "2025-09-24T13:51:41.432Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/24/c0/f3b6453cf2dfa99adc0ba6675f9aaff9e526d2224cbd7ff9c1a879238693/shapely-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe2533caae6a91a543dec62e8360fe86ffcdc42a7c55f9dfd0128a977a896b94", size = 1833550, upload-time = "2025-09-24T13:50:30.019Z" }, - { url = "https://files.pythonhosted.org/packages/86/07/59dee0bc4b913b7ab59ab1086225baca5b8f19865e6101db9ebb7243e132/shapely-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ba4d1333cc0bc94381d6d4308d2e4e008e0bd128bdcff5573199742ee3634359", size = 1643556, upload-time = "2025-09-24T13:50:32.291Z" }, - { url = "https://files.pythonhosted.org/packages/26/29/a5397e75b435b9895cd53e165083faed5d12fd9626eadec15a83a2411f0f/shapely-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bd308103340030feef6c111d3eb98d50dc13feea33affc8a6f9fa549e9458a3", size = 2988308, upload-time = "2025-09-24T13:50:33.862Z" }, - { url = "https://files.pythonhosted.org/packages/b9/37/e781683abac55dde9771e086b790e554811a71ed0b2b8a1e789b7430dd44/shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e7d4d7ad262a48bb44277ca12c7c78cb1b0f56b32c10734ec9a1d30c0b0c54b", size = 3099844, upload-time = "2025-09-24T13:50:35.459Z" }, - { url = "https://files.pythonhosted.org/packages/d8/f3/9876b64d4a5a321b9dc482c92bb6f061f2fa42131cba643c699f39317cb9/shapely-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9eddfe513096a71896441a7c37db72da0687b34752c4e193577a145c71736fc", size = 3988842, upload-time = "2025-09-24T13:50:37.478Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/704c7292f7014c7e74ec84eddb7b109e1fbae74a16deae9c1504b1d15565/shapely-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:980c777c612514c0cf99bc8a9de6d286f5e186dcaf9091252fcd444e5638193d", size = 4152714, upload-time = "2025-09-24T13:50:39.9Z" }, - { url = "https://files.pythonhosted.org/packages/53/46/319c9dc788884ad0785242543cdffac0e6530e4d0deb6c4862bc4143dcf3/shapely-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9111274b88e4d7b54a95218e243282709b330ef52b7b86bc6aaf4f805306f454", size = 1542745, upload-time = "2025-09-24T13:50:41.414Z" }, - { url = "https://files.pythonhosted.org/packages/ec/bf/cb6c1c505cb31e818e900b9312d514f381fbfa5c4363edfce0fcc4f8c1a4/shapely-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:743044b4cfb34f9a67205cee9279feaf60ba7d02e69febc2afc609047cb49179", size = 1722861, upload-time = "2025-09-24T13:50:43.35Z" }, - { url = "https://files.pythonhosted.org/packages/c3/90/98ef257c23c46425dc4d1d31005ad7c8d649fe423a38b917db02c30f1f5a/shapely-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b510dda1a3672d6879beb319bc7c5fd302c6c354584690973c838f46ec3e0fa8", size = 1832644, upload-time = "2025-09-24T13:50:44.886Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ab/0bee5a830d209adcd3a01f2d4b70e587cdd9fd7380d5198c064091005af8/shapely-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8cff473e81017594d20ec55d86b54bc635544897e13a7cfc12e36909c5309a2a", size = 1642887, upload-time = "2025-09-24T13:50:46.735Z" }, - { url = "https://files.pythonhosted.org/packages/2d/5e/7d7f54ba960c13302584c73704d8c4d15404a51024631adb60b126a4ae88/shapely-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe7b77dc63d707c09726b7908f575fc04ff1d1ad0f3fb92aec212396bc6cfe5e", size = 2970931, upload-time = "2025-09-24T13:50:48.374Z" }, - { url = "https://files.pythonhosted.org/packages/f2/a2/83fc37e2a58090e3d2ff79175a95493c664bcd0b653dd75cb9134645a4e5/shapely-2.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ed1a5bbfb386ee8332713bf7508bc24e32d24b74fc9a7b9f8529a55db9f4ee6", size = 3082855, upload-time = "2025-09-24T13:50:50.037Z" }, - { url = "https://files.pythonhosted.org/packages/44/2b/578faf235a5b09f16b5f02833c53822294d7f21b242f8e2d0cf03fb64321/shapely-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a84e0582858d841d54355246ddfcbd1fce3179f185da7470f41ce39d001ee1af", size = 3979960, upload-time = "2025-09-24T13:50:51.74Z" }, - { url = "https://files.pythonhosted.org/packages/4d/04/167f096386120f692cc4ca02f75a17b961858997a95e67a3cb6a7bbd6b53/shapely-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc3487447a43d42adcdf52d7ac73804f2312cbfa5d433a7d2c506dcab0033dfd", size = 4142851, upload-time = "2025-09-24T13:50:53.49Z" }, - { url = "https://files.pythonhosted.org/packages/48/74/fb402c5a6235d1c65a97348b48cdedb75fb19eca2b1d66d04969fc1c6091/shapely-2.1.2-cp313-cp313-win32.whl", hash = "sha256:9c3a3c648aedc9f99c09263b39f2d8252f199cb3ac154fadc173283d7d111350", size = 1541890, upload-time = "2025-09-24T13:50:55.337Z" }, - { url = "https://files.pythonhosted.org/packages/41/47/3647fe7ad990af60ad98b889657a976042c9988c2807cf322a9d6685f462/shapely-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:ca2591bff6645c216695bdf1614fca9c82ea1144d4a7591a466fef64f28f0715", size = 1722151, upload-time = "2025-09-24T13:50:57.153Z" }, - { url = "https://files.pythonhosted.org/packages/3c/49/63953754faa51ffe7d8189bfbe9ca34def29f8c0e34c67cbe2a2795f269d/shapely-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2d93d23bdd2ed9dc157b46bc2f19b7da143ca8714464249bef6771c679d5ff40", size = 1834130, upload-time = "2025-09-24T13:50:58.49Z" }, - { url = "https://files.pythonhosted.org/packages/7f/ee/dce001c1984052970ff60eb4727164892fb2d08052c575042a47f5a9e88f/shapely-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01d0d304b25634d60bd7cf291828119ab55a3bab87dc4af1e44b07fb225f188b", size = 1642802, upload-time = "2025-09-24T13:50:59.871Z" }, - { url = "https://files.pythonhosted.org/packages/da/e7/fc4e9a19929522877fa602f705706b96e78376afb7fad09cad5b9af1553c/shapely-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8d8382dd120d64b03698b7298b89611a6ea6f55ada9d39942838b79c9bc89801", size = 3018460, upload-time = "2025-09-24T13:51:02.08Z" }, - { url = "https://files.pythonhosted.org/packages/a1/18/7519a25db21847b525696883ddc8e6a0ecaa36159ea88e0fef11466384d0/shapely-2.1.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19efa3611eef966e776183e338b2d7ea43569ae99ab34f8d17c2c054d3205cc0", size = 3095223, upload-time = "2025-09-24T13:51:04.472Z" }, - { url = "https://files.pythonhosted.org/packages/48/de/b59a620b1f3a129c3fecc2737104a0a7e04e79335bd3b0a1f1609744cf17/shapely-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:346ec0c1a0fcd32f57f00e4134d1200e14bf3f5ae12af87ba83ca275c502498c", size = 4030760, upload-time = "2025-09-24T13:51:06.455Z" }, - { url = "https://files.pythonhosted.org/packages/96/b3/c6655ee7232b417562bae192ae0d3ceaadb1cc0ffc2088a2ddf415456cc2/shapely-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6305993a35989391bd3476ee538a5c9a845861462327efe00dd11a5c8c709a99", size = 4170078, upload-time = "2025-09-24T13:51:08.584Z" }, - { url = "https://files.pythonhosted.org/packages/a0/8e/605c76808d73503c9333af8f6cbe7e1354d2d238bda5f88eea36bfe0f42a/shapely-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:c8876673449f3401f278c86eb33224c5764582f72b653a415d0e6672fde887bf", size = 1559178, upload-time = "2025-09-24T13:51:10.73Z" }, - { url = "https://files.pythonhosted.org/packages/36/f7/d317eb232352a1f1444d11002d477e54514a4a6045536d49d0c59783c0da/shapely-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:4a44bc62a10d84c11a7a3d7c1c4fe857f7477c3506e24c9062da0db0ae0c449c", size = 1739756, upload-time = "2025-09-24T13:51:12.105Z" }, -] - [[package]] name = "shellingham" version = "1.5.4" @@ -3913,18 +2441,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] -[[package]] -name = "shelved-cache" -version = "0.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cachetools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/c0/4ec3d79c9167ab7cd28b4a2808fa05d58e47745a001108a77429fdaf3015/shelved_cache-0.3.1.tar.gz", hash = "sha256:0dc1b74fb158117643fc621bf8c12c1ac96e2637530dcfb11f7a242e023a5831", size = 7200, upload-time = "2023-02-24T17:02:22.806Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl", hash = "sha256:3597da599eae1b9df3237c401654e90377fab29f9873e671096550779733ec61", size = 7793, upload-time = "2023-02-24T17:02:21.671Z" }, -] - [[package]] name = "six" version = "1.17.0" @@ -3934,18 +2450,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] -[[package]] -name = "sklearn-compat" -version = "0.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "scikit-learn" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bb/23/89246376a9e6e9ee256c83145b30ccdf41a515e06152e406885c116e4187/sklearn_compat-0.1.5.tar.gz", hash = "sha256:1a0c3a2f384100e034def49ee5a6cfe984a826f79d032eb559f10445e012b02c", size = 130433, upload-time = "2025-12-21T14:54:17.391Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/60/08cb1b41563a0a8f26a72b8c5d1726986ab535fee67aa95541b2a2cc1dfa/sklearn_compat-0.1.5-py3-none-any.whl", hash = "sha256:dddd00c442027b6a2c2fd4a86667b804a7353cdb5093bfd0d5431f5e3c135fce", size = 20966, upload-time = "2025-12-21T14:54:16.349Z" }, -] - [[package]] name = "slicer" version = "0.0.8" @@ -3967,24 +2471,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5e/ea/dcdecd68acebb49d3fd560473a43499b1635076f7f1ae8641c060fe7ce74/smart_open-7.5.1-py3-none-any.whl", hash = "sha256:3e07cbbd9c8a908bcb8e25d48becf1a5cbb4886fa975e9f34c672ed171df2318", size = 64108, upload-time = "2026-02-23T11:01:27.429Z" }, ] -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, -] - -[[package]] -name = "soupsieve" -version = "2.8.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, -] - [[package]] name = "spacy" version = "3.8.11" @@ -4047,39 +2533,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/78/d1a1a026ef3af911159398c939b1509d5c36fe524c7b644f34a5146c4e16/spacy_loggers-1.0.5-py3-none-any.whl", hash = "sha256:196284c9c446cc0cdb944005384270d775fdeaf4f494d8e269466cfa497ef645", size = 22343, upload-time = "2023-09-11T12:26:50.586Z" }, ] -[[package]] -name = "sqlalchemy" -version = "2.0.47" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cd/4b/1e00561093fe2cd8eef09d406da003c8a118ff02d6548498c1ae677d68d9/sqlalchemy-2.0.47.tar.gz", hash = "sha256:e3e7feb57b267fe897e492b9721ae46d5c7de6f9e8dee58aacf105dc4e154f3d", size = 9886323, upload-time = "2026-02-24T16:34:27.947Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/88/74eb470223ff88ea6572a132c0b8de8c1d8ed7b843d3b44a8a3c77f31d39/sqlalchemy-2.0.47-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4fa91b19d6b9821c04cc8f7aa2476429cc8887b9687c762815aa629f5c0edec1", size = 2155687, upload-time = "2026-02-24T17:05:46.451Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ba/1447d3d558971b036cb93b557595cb5dcdfe728f1c7ac4dec16505ef5756/sqlalchemy-2.0.47-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c5bbbd14eff577c8c79cbfe39a0771eecd20f430f3678533476f0087138f356", size = 3336978, upload-time = "2026-02-24T17:18:04.597Z" }, - { url = "https://files.pythonhosted.org/packages/8a/07/b47472d2ffd0776826f17ccf0b4d01b224c99fbd1904aeb103dffbb4b1cc/sqlalchemy-2.0.47-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5a6c555da8d4280a3c4c78c5b7a3f990cee2b2884e5f934f87a226191682ff7", size = 3349939, upload-time = "2026-02-24T17:27:18.937Z" }, - { url = "https://files.pythonhosted.org/packages/bb/c6/95fa32b79b57769da3e16f054cf658d90940317b5ca0ec20eac84aa19c4f/sqlalchemy-2.0.47-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ed48a1701d24dff3bb49a5bce94d6bc84cbe33d98af2aa2d3cdcce3dea1709ec", size = 3279648, upload-time = "2026-02-24T17:18:07.038Z" }, - { url = "https://files.pythonhosted.org/packages/bb/c8/3d07e7c73928dc59a0bed40961ca4e313e797bce650b088e8d5fdd3ad939/sqlalchemy-2.0.47-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f3178c920ad98158f0b6309382194df04b14808fa6052ae07099fdde29d5602", size = 3314695, upload-time = "2026-02-24T17:27:20.93Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d2/ed32b1611c1e19fdb028eee1adc5a9aa138c2952d09ae11f1670170f80ae/sqlalchemy-2.0.47-cp312-cp312-win32.whl", hash = "sha256:b9c11ac9934dd59ece9619fe42780a08abe2faab7b0543bb00d5eabea4f421b9", size = 2115502, upload-time = "2026-02-24T17:22:52.546Z" }, - { url = "https://files.pythonhosted.org/packages/fd/52/9de590356a4dd8e9ef5a881dbba64b2bbc4cbc71bf02bc68e775fb9b1899/sqlalchemy-2.0.47-cp312-cp312-win_amd64.whl", hash = "sha256:db43b72cf8274a99e089755c9c1e0b947159b71adbc2c83c3de2e38d5d607acb", size = 2142435, upload-time = "2026-02-24T17:22:54.268Z" }, - { url = "https://files.pythonhosted.org/packages/4a/e5/0af64ce7d8f60ec5328c10084e2f449e7912a9b8bdbefdcfb44454a25f49/sqlalchemy-2.0.47-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:456a135b790da5d3c6b53d0ef71ac7b7d280b7f41eb0c438986352bf03ca7143", size = 2152551, upload-time = "2026-02-24T17:05:47.675Z" }, - { url = "https://files.pythonhosted.org/packages/63/79/746b8d15f6940e2ac469ce22d7aa5b1124b1ab820bad9b046eb3000c88a6/sqlalchemy-2.0.47-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09a2f7698e44b3135433387da5d8846cf7cc7c10e5425af7c05fee609df978b6", size = 3278782, upload-time = "2026-02-24T17:18:10.012Z" }, - { url = "https://files.pythonhosted.org/packages/91/b1/bd793ddb34345d1ed43b13ab2d88c95d7d4eb2e28f5b5a99128b9cc2bca2/sqlalchemy-2.0.47-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bbc72e6a177c78d724f9106aaddc0d26a2ada89c6332b5935414eccf04cbd5", size = 3295155, upload-time = "2026-02-24T17:27:22.827Z" }, - { url = "https://files.pythonhosted.org/packages/97/84/7213def33f94e5ca6f5718d259bc9f29de0363134648425aa218d4356b23/sqlalchemy-2.0.47-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:75460456b043b78b6006e41bdf5b86747ee42eafaf7fffa3b24a6e9a456a2092", size = 3226834, upload-time = "2026-02-24T17:18:11.465Z" }, - { url = "https://files.pythonhosted.org/packages/ef/06/456810204f4dc29b5f025b1b0a03b4bd6b600ebf3c1040aebd90a257fa33/sqlalchemy-2.0.47-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d9adaa616c3bc7d80f9ded57cd84b51d6617cad6a5456621d858c9f23aaee01", size = 3265001, upload-time = "2026-02-24T17:27:24.813Z" }, - { url = "https://files.pythonhosted.org/packages/fb/20/df3920a4b2217dbd7390a5bd277c1902e0393f42baaf49f49b3c935e7328/sqlalchemy-2.0.47-cp313-cp313-win32.whl", hash = "sha256:76e09f974382a496a5ed985db9343628b1cb1ac911f27342e4cc46a8bac10476", size = 2113647, upload-time = "2026-02-24T17:22:55.747Z" }, - { url = "https://files.pythonhosted.org/packages/46/06/7873ddf69918efbfabd7211829f4bd8019739d0a719253112d305d3ba51d/sqlalchemy-2.0.47-cp313-cp313-win_amd64.whl", hash = "sha256:0664089b0bf6724a0bfb49a0cf4d4da24868a0a5c8e937cd7db356d5dcdf2c66", size = 2139425, upload-time = "2026-02-24T17:22:57.033Z" }, - { url = "https://files.pythonhosted.org/packages/54/fa/61ad9731370c90ac7ea5bf8f5eaa12c48bb4beec41c0fa0360becf4ac10d/sqlalchemy-2.0.47-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed0c967c701ae13da98eb220f9ddab3044ab63504c1ba24ad6a59b26826ad003", size = 3558809, upload-time = "2026-02-24T17:12:15.232Z" }, - { url = "https://files.pythonhosted.org/packages/33/d5/221fac96f0529391fe374875633804c866f2b21a9c6d3a6ca57d9c12cfd7/sqlalchemy-2.0.47-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3537943a61fd25b241e976426a0c6814434b93cf9b09d39e8e78f3c9eb9a487", size = 3525480, upload-time = "2026-02-24T17:27:59.602Z" }, - { url = "https://files.pythonhosted.org/packages/ec/55/8247d53998c3673e4a8d1958eba75c6f5cc3b39082029d400bb1f2a911ae/sqlalchemy-2.0.47-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:57f7e336a64a0dba686c66392d46b9bc7af2c57d55ce6dc1697b4ef32b043ceb", size = 3466569, upload-time = "2026-02-24T17:12:16.94Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b5/c1f0eea1bac6790845f71420a7fe2f2a0566203aa57543117d4af3b77d1c/sqlalchemy-2.0.47-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dff735a621858680217cb5142b779bad40ef7322ddbb7c12062190db6879772e", size = 3475770, upload-time = "2026-02-24T17:28:02.034Z" }, - { url = "https://files.pythonhosted.org/packages/c5/ed/2f43f92474ea0c43c204657dc47d9d002cd738b96ca2af8e6d29a9b5e42d/sqlalchemy-2.0.47-cp313-cp313t-win32.whl", hash = "sha256:3893dc096bb3cca9608ea3487372ffcea3ae9b162f40e4d3c51dd49db1d1b2dc", size = 2141300, upload-time = "2026-02-24T17:14:37.024Z" }, - { url = "https://files.pythonhosted.org/packages/cc/a9/8b73f9f1695b6e92f7aaf1711135a1e3bbeb78bca9eded35cb79180d3c6d/sqlalchemy-2.0.47-cp313-cp313t-win_amd64.whl", hash = "sha256:b5103427466f4b3e61f04833ae01f9a914b1280a2a8bcde3a9d7ab11f3755b42", size = 2173053, upload-time = "2026-02-24T17:14:38.688Z" }, - { url = "https://files.pythonhosted.org/packages/15/9f/7c378406b592fcf1fc157248607b495a40e3202ba4a6f1372a2ba6447717/sqlalchemy-2.0.47-py3-none-any.whl", hash = "sha256:e2647043599297a1ef10e720cf310846b7f31b6c841fee093d2b09d81215eb93", size = 1940159, upload-time = "2026-02-24T17:15:07.158Z" }, -] - [[package]] name = "srsly" version = "2.5.2" @@ -4119,82 +2572,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, ] -[[package]] -name = "statsmodels" -version = "0.14.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "packaging" }, - { name = "pandas" }, - { name = "patsy" }, - { name = "scipy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0d/81/e8d74b34f85285f7335d30c5e3c2d7c0346997af9f3debf9a0a9a63de184/statsmodels-0.14.6.tar.gz", hash = "sha256:4d17873d3e607d398b85126cd4ed7aad89e4e9d89fc744cdab1af3189a996c2a", size = 20689085, upload-time = "2025-12-05T23:08:39.522Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/ce/308e5e5da57515dd7cab3ec37ea2d5b8ff50bef1fcc8e6d31456f9fae08e/statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe76140ae7adc5ff0e60a3f0d56f4fffef484efa803c3efebf2fcd734d72ecb5", size = 10091932, upload-time = "2025-12-05T19:28:55.446Z" }, - { url = "https://files.pythonhosted.org/packages/05/30/affbabf3c27fb501ec7b5808230c619d4d1a4525c07301074eb4bda92fa9/statsmodels-0.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26d4f0ed3b31f3c86f83a92f5c1f5cbe63fc992cd8915daf28ca49be14463a1c", size = 9997345, upload-time = "2025-12-05T19:29:10.278Z" }, - { url = "https://files.pythonhosted.org/packages/48/f5/3a73b51e6450c31652c53a8e12e24eac64e3824be816c0c2316e7dbdcb7d/statsmodels-0.14.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c00a42863e4f4733ac9d078bbfad816249c01451740e6f5053ecc7db6d6368", size = 10058649, upload-time = "2025-12-05T23:10:12.775Z" }, - { url = "https://files.pythonhosted.org/packages/81/68/dddd76117df2ef14c943c6bbb6618be5c9401280046f4ddfc9fb4596a1b8/statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b58cf7474aa9e7e3b0771a66537148b2df9b5884fbf156096c0e6c1ff0469d", size = 10339446, upload-time = "2025-12-05T23:10:28.503Z" }, - { url = "https://files.pythonhosted.org/packages/56/4a/dce451c74c4050535fac1ec0c14b80706d8fc134c9da22db3c8a0ec62c33/statsmodels-0.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e7dcc5e9587f2567e52deaff5220b175bf2f648951549eae5fc9383b62bc37", size = 10368705, upload-time = "2025-12-05T23:10:44.339Z" }, - { url = "https://files.pythonhosted.org/packages/60/15/3daba2df40be8b8a9a027d7f54c8dedf24f0d81b96e54b52293f5f7e3418/statsmodels-0.14.6-cp312-cp312-win_amd64.whl", hash = "sha256:b5eb07acd115aa6208b4058211138393a7e6c2cf12b6f213ede10f658f6a714f", size = 9543991, upload-time = "2025-12-05T23:10:58.536Z" }, - { url = "https://files.pythonhosted.org/packages/81/59/a5aad5b0cc266f5be013db8cde563ac5d2a025e7efc0c328d83b50c72992/statsmodels-0.14.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47ee7af083623d2091954fa71c7549b8443168f41b7c5dce66510274c50fd73e", size = 10072009, upload-time = "2025-12-05T23:11:14.021Z" }, - { url = "https://files.pythonhosted.org/packages/53/dd/d8cfa7922fc6dc3c56fa6c59b348ea7de829a94cd73208c6f8202dd33f17/statsmodels-0.14.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa60d82e29fcd0a736e86feb63a11d2380322d77a9369a54be8b0965a3985f71", size = 9980018, upload-time = "2025-12-05T23:11:30.907Z" }, - { url = "https://files.pythonhosted.org/packages/ee/77/0ec96803eba444efd75dba32f2ef88765ae3e8f567d276805391ec2c98c6/statsmodels-0.14.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89ee7d595f5939cc20bf946faedcb5137d975f03ae080f300ebb4398f16a5bd4", size = 10060269, upload-time = "2025-12-05T23:11:46.338Z" }, - { url = "https://files.pythonhosted.org/packages/10/b9/fd41f1f6af13a1a1212a06bb377b17762feaa6d656947bf666f76300fc05/statsmodels-0.14.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:730f3297b26749b216a06e4327fe0be59b8d05f7d594fb6caff4287b69654589", size = 10324155, upload-time = "2025-12-05T23:12:01.805Z" }, - { url = "https://files.pythonhosted.org/packages/ee/0f/a6900e220abd2c69cd0a07e3ad26c71984be6061415a60e0f17b152ecf08/statsmodels-0.14.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f1c08befa85e93acc992b72a390ddb7bd876190f1360e61d10cf43833463bc9c", size = 10349765, upload-time = "2025-12-05T23:12:18.018Z" }, - { url = "https://files.pythonhosted.org/packages/98/08/b79f0c614f38e566eebbdcff90c0bcacf3c6ba7a5bbb12183c09c29ca400/statsmodels-0.14.6-cp313-cp313-win_amd64.whl", hash = "sha256:8021271a79f35b842c02a1794465a651a9d06ec2080f76ebc3b7adce77d08233", size = 9540043, upload-time = "2025-12-05T23:12:33.887Z" }, -] - [[package]] name = "studies" version = "0.1.0" source = { virtual = "." } dependencies = [ - { name = "accelerate" }, { name = "ale-py" }, { name = "catboost" }, - { name = "datasets" }, - { name = "faiss-cpu" }, - { name = "folium" }, - { name = "geopandas" }, - { name = "google-api-python-client" }, - { name = "google-auth-oauthlib" }, - { name = "google-generativeai" }, - { name = "gymnasium", extra = ["toy-text"] }, - { name = "imblearn" }, { name = "ipykernel" }, { name = "ipywidgets" }, { name = "langchain" }, - { name = "langchain-community" }, { name = "langchain-core" }, { name = "langchain-huggingface" }, { name = "langchain-mistralai" }, - { name = "langchain-ollama" }, - { name = "langchain-openai" }, - { name = "langchain-text-splitters" }, - { name = "mapclassify" }, { name = "matplotlib" }, - { name = "nbformat" }, { name = "numpy" }, { name = "opencv-python" }, - { name = "openpyxl" }, { name = "pandas" }, { name = "pandas-stubs" }, { name = "pettingzoo", extra = ["atari"] }, { name = "plotly" }, - { name = "polars" }, - { name = "pypdf" }, - { name = "rasterio" }, - { name = "requests" }, { name = "scikit-learn" }, { name = "scipy" }, { name = "seaborn" }, - { name = "sentence-transformers" }, { name = "shap" }, { name = "spacy" }, - { name = "statsmodels" }, - { name = "supersuit" }, { name = "tensorflow" }, { name = "tf-keras" }, { name = "tiktoken" }, @@ -4202,9 +2604,7 @@ dependencies = [ { name = "torch" }, { name = "umap-learn" }, { name = "uv" }, - { name = "wbdata" }, { name = "xgboost" }, - { name = "yfinance" }, ] [package.dev-dependencies] @@ -4215,50 +2615,26 @@ dev = [ [package.metadata] requires-dist = [ - { name = "accelerate", specifier = ">=1.12.0" }, { name = "ale-py", specifier = ">=0.11.2" }, { name = "catboost", specifier = ">=1.2.10" }, - { name = "datasets", specifier = ">=4.6.1" }, - { name = "faiss-cpu", specifier = ">=1.13.2" }, - { name = "folium", specifier = ">=0.20.0" }, - { name = "geopandas", specifier = ">=1.1.2" }, - { name = "google-api-python-client", specifier = ">=2.191.0" }, - { name = "google-auth-oauthlib", specifier = ">=1.3.0" }, - { name = "google-generativeai", specifier = ">=0.8.6" }, - { name = "gymnasium", extras = ["toy-text"], specifier = ">=1.2.3" }, - { name = "imblearn", specifier = ">=0.0" }, { name = "ipykernel", specifier = ">=7.2.0" }, { name = "ipywidgets", specifier = ">=8.1.8" }, { name = "langchain", specifier = ">=1.2.10" }, - { name = "langchain-community", specifier = ">=0.4.1" }, { name = "langchain-core", specifier = ">=1.2.17" }, { name = "langchain-huggingface", specifier = ">=1.2.1" }, { name = "langchain-mistralai", specifier = ">=1.1.1" }, - { name = "langchain-ollama", specifier = ">=1.0.1" }, - { name = "langchain-openai", specifier = ">=1.1.10" }, - { name = "langchain-text-splitters", specifier = ">=1.1.1" }, - { name = "mapclassify", specifier = ">=2.10.0" }, { name = "matplotlib", specifier = ">=3.10.8" }, - { name = "nbformat", specifier = ">=5.10.4" }, { name = "numpy", specifier = ">=2.4.2" }, { name = "opencv-python", specifier = ">=4.13.0.92" }, - { name = "openpyxl", specifier = ">=3.1.5" }, { name = "pandas", specifier = ">=3.0.1" }, { name = "pandas-stubs", specifier = ">=3.0.0.260204" }, { name = "pettingzoo", extras = ["atari"], specifier = ">=1.24.3" }, { name = "plotly", specifier = ">=6.6.0" }, - { name = "polars", specifier = ">=1.38.1" }, - { name = "pypdf", specifier = ">=6.7.5" }, - { name = "rasterio", specifier = ">=1.5.0" }, - { name = "requests", specifier = ">=2.32.5" }, { name = "scikit-learn", specifier = ">=1.8.0" }, { name = "scipy", specifier = ">=1.17.1" }, { name = "seaborn", specifier = ">=0.13.2" }, - { name = "sentence-transformers", specifier = ">=5.2.3" }, { name = "shap", specifier = ">=0.50.0" }, { name = "spacy", specifier = ">=3.8.11" }, - { name = "statsmodels", specifier = ">=0.14.6" }, - { name = "supersuit", specifier = ">=3.10.0" }, { name = "tensorflow", specifier = ">=2.20.0" }, { name = "tf-keras", specifier = ">=2.20.1" }, { name = "tiktoken", specifier = ">=0.12.0" }, @@ -4266,9 +2642,7 @@ requires-dist = [ { name = "torch", specifier = ">=2.10.0" }, { name = "umap-learn", specifier = ">=0.5.11" }, { name = "uv", specifier = ">=0.10.7" }, - { name = "wbdata", specifier = ">=1.1.0" }, { name = "xgboost", specifier = ">=3.2.0" }, - { name = "yfinance", specifier = ">=1.2.0" }, ] [package.metadata.requires-dev] @@ -4277,20 +2651,6 @@ dev = [ { name = "uv", specifier = ">=0.10.7" }, ] -[[package]] -name = "supersuit" -version = "3.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "gymnasium" }, - { name = "numpy" }, - { name = "tinyscaler" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7c/68/16b774842f9be011d2accc6ab86bc3808854a36ce5456e4e19b9ad7c484b/supersuit-3.10.0.tar.gz", hash = "sha256:85cc4723e2ee4fc7284e0e5586d9e20360ee073bc0d8b997fe48686c83cd348a", size = 34350, upload-time = "2025-04-22T16:01:24.921Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/6e/fce0b8179ba9e99c40cd3fb013657110e4d5ca894de3f9aa4962b6a9d86c/supersuit-3.10.0-py3-none-any.whl", hash = "sha256:fd0b9e351808d3efaedafcbe48a6beb1f6a87828ccfeaf410af4b87e32882a7f", size = 50180, upload-time = "2025-04-22T16:01:23.654Z" }, -] - [[package]] name = "sympy" version = "1.14.0" @@ -4303,15 +2663,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] -[[package]] -name = "tabulate" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, -] - [[package]] name = "tenacity" version = "9.1.4" @@ -4490,20 +2841,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/93/e0/6cc82a562bc6365785a3ff0af27a2a092d57c47d7a81d9e2295d8c36f011/tiktoken-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dc2dd125a62cb2b3d858484d6c614d136b5b848976794edfb63688d539b8b93f", size = 878777, upload-time = "2025-10-06T20:22:18.036Z" }, ] -[[package]] -name = "tinyscaler" -version = "1.2.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0d/59/6b6495fe9bb3153306a4bd6dd24c78ff74eaf64f90fc6e545ede0574cfbe/tinyscaler-1.2.8.tar.gz", hash = "sha256:0ce3b77562f1db74b2035ccaf62807af043333ce655e71effd6ec85fbf8ded06", size = 156935, upload-time = "2024-08-02T19:25:10.976Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/65/06fa456d375b71672affd292dd79f199b21a574eb0501afa142f85133b99/tinyscaler-1.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fcafd6a8b7ac8c8eabc560f99f987e3e9c00b32a5f3472b28ee865db9bf264b2", size = 179781, upload-time = "2024-08-02T19:24:52.129Z" }, - { url = "https://files.pythonhosted.org/packages/b7/cf/528a73de4ad128de99bf7cc0e80f236aeeb36fda1e2768a7eb73210a91ff/tinyscaler-1.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7474fe93740b0aa045e4e2ad60f8df6d5d570c4ea903c6d63ca3868efd8f4e22", size = 563642, upload-time = "2024-08-02T19:24:54.1Z" }, - { url = "https://files.pythonhosted.org/packages/68/d0/0b0abfde6acdf79b41ea685067a52d3e47f3b1fb4a0f4f49d9c6f281a3c7/tinyscaler-1.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:6a7c18d9c082f30193bd23a6eb8ad84d2ee9b224138c8c25a76db96cba71a473", size = 83779, upload-time = "2024-08-02T19:24:56.186Z" }, -] - [[package]] name = "todoist-python" version = "8.1.4" @@ -4629,27 +2966,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] -[[package]] -name = "transformers" -version = "4.57.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "huggingface-hub" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "regex" }, - { name = "requests" }, - { name = "safetensors" }, - { name = "tokenizers" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c4/35/67252acc1b929dc88b6602e8c4a982e64f31e733b804c14bc24b47da35e6/transformers-4.57.6.tar.gz", hash = "sha256:55e44126ece9dc0a291521b7e5492b572e6ef2766338a610b9ab5afbb70689d3", size = 10134912, upload-time = "2026-01-16T10:38:39.284Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/b8/e484ef633af3887baeeb4b6ad12743363af7cce68ae51e938e00aaa0529d/transformers-4.57.6-py3-none-any.whl", hash = "sha256:4c9e9de11333ddfe5114bc872c9f370509198acf0b87a832a0ab9458e2bd0550", size = 11993498, upload-time = "2026-01-16T10:38:31.289Z" }, -] - [[package]] name = "triton" version = "3.6.0" @@ -4696,19 +3012,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] -[[package]] -name = "typing-inspect" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mypy-extensions" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload-time = "2023-05-24T20:25:45.287Z" }, -] - [[package]] name = "typing-inspection" version = "0.4.2" @@ -4730,18 +3033,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] -[[package]] -name = "tzlocal" -version = "5.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tzdata", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, -] - [[package]] name = "umap-learn" version = "0.5.11" @@ -4761,15 +3052,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/d2/fcf7192dd1cd8c090b6cfd53fa223c4fb2887a17c47e06bc356d44f40dfb/umap_learn-0.5.11-py3-none-any.whl", hash = "sha256:cb17adbde9d544ba79481b3ab4d81ac222e940f3d9219307bea6044f869af3cc", size = 90890, upload-time = "2026-01-12T20:44:46.511Z" }, ] -[[package]] -name = "uritemplate" -version = "4.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" }, -] - [[package]] name = "urllib3" version = "2.6.3" @@ -4838,25 +3120,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/06/7c/34330a89da55610daa5f245ddce5aab81244321101614751e7537f125133/wasabi-1.1.3-py3-none-any.whl", hash = "sha256:f76e16e8f7e79f8c4c8be49b4024ac725713ab10cd7f19350ad18a8e3f71728c", size = 27880, upload-time = "2024-05-31T16:56:16.699Z" }, ] -[[package]] -name = "wbdata" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "appdirs" }, - { name = "backoff" }, - { name = "cachetools" }, - { name = "dateparser" }, - { name = "decorator" }, - { name = "requests" }, - { name = "shelved-cache" }, - { name = "tabulate" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9d/c5/30989742d8a4ce4582a113cef02802403ed01fd4190a1e3ceea4fde32ad4/wbdata-1.1.0.tar.gz", hash = "sha256:bd9bf63c2454fb12c279b730d7ca5b8be970dc662375e8c23d9a5f8e2f395abe", size = 104154, upload-time = "2025-10-05T20:46:17.883Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl", hash = "sha256:84e770be4560d1a5e6a22e7c4b5c8f5ab653e4d330d5729c2460004876d125c7", size = 18469, upload-time = "2025-10-05T20:46:16.576Z" }, -] - [[package]] name = "wcwidth" version = "0.6.0" @@ -4886,33 +3149,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/74/a148b41572656904a39dfcfed3f84dd1066014eed94e209223ae8e9d088d/weasel-0.4.3-py3-none-any.whl", hash = "sha256:08f65b5d0dbded4879e08a64882de9b9514753d9eaa4c4e2a576e33666ac12cf", size = 50757, upload-time = "2025-11-13T23:52:26.982Z" }, ] -[[package]] -name = "websockets" -version = "16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, - { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, - { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, - { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, - { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, - { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, - { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, - { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, - { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, - { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, - { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, - { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, - { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, - { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, - { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, - { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, -] - [[package]] name = "werkzeug" version = "3.1.6" @@ -5053,106 +3289,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/56/15/064b197e855bfb7b343210e82490ae672f8bc7cdf3ddb02e92f64304ee8a/xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746", size = 28044, upload-time = "2025-10-02T14:35:37.195Z" }, ] -[[package]] -name = "xyzservices" -version = "2025.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/0f/022795fc1201e7c29e742a509913badb53ce0b38f64b6db859e2f6339da9/xyzservices-2025.11.0.tar.gz", hash = "sha256:2fc72b49502b25023fd71e8f532fb4beddbbf0aa124d90ea25dba44f545e17ce", size = 1135703, upload-time = "2025-11-22T11:31:51.82Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/5c/2c189d18d495dd0fa3f27ccc60762bbc787eed95b9b0147266e72bb76585/xyzservices-2025.11.0-py3-none-any.whl", hash = "sha256:de66a7599a8d6dad63980b77defd1d8f5a5a9cb5fc8774ea1c6e89ca7c2a3d2f", size = 93916, upload-time = "2025-11-22T11:31:50.525Z" }, -] - -[[package]] -name = "yarl" -version = "1.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, - { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, - { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, - { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, - { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, - { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, - { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, - { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, - { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, - { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, - { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, - { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, - { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, - { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, - { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, - { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, - { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" }, - { url = "https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" }, - { url = "https://files.pythonhosted.org/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" }, - { url = "https://files.pythonhosted.org/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" }, - { url = "https://files.pythonhosted.org/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" }, - { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" }, - { url = "https://files.pythonhosted.org/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" }, - { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" }, - { url = "https://files.pythonhosted.org/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" }, - { url = "https://files.pythonhosted.org/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" }, - { url = "https://files.pythonhosted.org/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" }, - { url = "https://files.pythonhosted.org/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" }, - { url = "https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" }, - { url = "https://files.pythonhosted.org/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" }, - { url = "https://files.pythonhosted.org/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" }, - { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" }, - { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" }, - { url = "https://files.pythonhosted.org/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" }, - { url = "https://files.pythonhosted.org/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" }, - { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" }, - { url = "https://files.pythonhosted.org/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" }, - { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" }, - { url = "https://files.pythonhosted.org/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" }, - { url = "https://files.pythonhosted.org/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" }, - { url = "https://files.pythonhosted.org/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" }, - { url = "https://files.pythonhosted.org/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" }, - { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" }, - { url = "https://files.pythonhosted.org/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" }, - { url = "https://files.pythonhosted.org/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" }, - { url = "https://files.pythonhosted.org/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" }, - { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, -] - -[[package]] -name = "yfinance" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "curl-cffi" }, - { name = "frozendict" }, - { name = "multitasking" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "peewee" }, - { name = "platformdirs" }, - { name = "protobuf" }, - { name = "pytz" }, - { name = "requests" }, - { name = "websockets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/1b/431d0ebd6a1e9deaffc8627cc4d26fd869841f31a1429cab7443eced0766/yfinance-1.2.0.tar.gz", hash = "sha256:80cec643eb983330ca63debab1b5492334fa1e6338d82cb17dd4e7b95079cfab", size = 140501, upload-time = "2026-02-16T19:52:34.368Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/60/462859de757ac56830824da7e8cf314b8b0321af5853df867c84cd6c2128/yfinance-1.2.0-py2.py3-none-any.whl", hash = "sha256:1c27d1ebfc6275f476721cc6dba035a49d0cf9a806d6aa1785c9e10cf8a610d8", size = 130247, upload-time = "2026-02-16T19:52:33.109Z" }, -] - [[package]] name = "zstandard" version = "0.25.0"