diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b75a383f..ee9a1502 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -48,4 +48,5 @@ repos: hooks: - id: mypy additional_dependencies: [types-PyYAML, types-Pillow, types-tqdm] + files: ^neural_lam/ description: Check for type errors diff --git a/CHANGELOG.md b/CHANGELOG.md index ccf79fdb..8e15ab0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Maintenance +- Enforce 100% type-hint coverage across `neural_lam/` via a `[tool.mypy]` gate (`disallow_untyped_defs`/`disallow_incomplete_defs`) and align all type annotations with PEP 585 and PEP 604 [\#673](https://github.com/mllam/neural-lam/pull/673) @GiGiKoneti + - Add comprehensive type hints to GraphLAM in `neural_lam/models/step_predictors/graph/graph_lam.py` [\#669](https://github.com/mllam/neural-lam/pull/669) @GiGiKoneti - Add comprehensive type hints to ARForecaster in `neural_lam/models/forecasters/autoregressive.py` [\#663](https://github.com/mllam/neural-lam/pull/663) @GiGiKoneti diff --git a/neural_lam/config.py b/neural_lam/config.py index 1da43fff..a449085a 100644 --- a/neural_lam/config.py +++ b/neural_lam/config.py @@ -3,7 +3,7 @@ # Standard library import dataclasses from pathlib import Path -from typing import Dict, Union +from typing import cast # Third-party import dataclass_wizard @@ -35,7 +35,7 @@ class DatastoreSelection: kind: str config_path: str - def __post_init__(self): + def __post_init__(self) -> None: """ Validate that the selected datastore kind is implemented. @@ -56,11 +56,11 @@ class ManualStateFeatureWeighting: Attributes ---------- - weights : Dict[str, float] + weights : dict[str, float] Manual weights for the state features. """ - weights: Dict[str, float] + weights: dict[str, float] @dataclasses.dataclass @@ -80,14 +80,14 @@ class OutputClamping: Attributes ---------- - lower : Dict[str, float] + lower : dict[str, float] The minimum value to clamp each output feature to. - upper : Dict[str, float] + upper : dict[str, float] The maximum value to clamp each output feature to. """ - lower: Dict[str, float] = dataclasses.field(default_factory=dict) - upper: Dict[str, float] = dataclasses.field(default_factory=dict) + lower: dict[str, float] = dataclasses.field(default_factory=dict) + upper: dict[str, float] = dataclasses.field(default_factory=dict) @dataclasses.dataclass @@ -97,8 +97,8 @@ class TrainingConfig: Attributes ---------- - state_feature_weighting : Union[ManualStateFeatureWeighting, - UniformFeatureWeighting] + state_feature_weighting : + ManualStateFeatureWeighting | UniformFeatureWeighting The method to use for weighting the state features in the loss function. Defaults to uniform weighting (`UniformFeatureWeighting`, i.e. all features are weighted equally). @@ -107,9 +107,9 @@ class TrainingConfig: Defaults to an empty ``OutputClamping`` (no clamping). """ - state_feature_weighting: Union[ - ManualStateFeatureWeighting, UniformFeatureWeighting - ] = dataclasses.field(default_factory=UniformFeatureWeighting) + state_feature_weighting: ( + ManualStateFeatureWeighting | UniformFeatureWeighting + ) = dataclasses.field(default_factory=UniformFeatureWeighting) output_clamping: OutputClamping = dataclasses.field( default_factory=OutputClamping @@ -174,7 +174,7 @@ class InvalidConfigError(Exception): def load_config_and_datastore( config_path: str, -) -> tuple[NeuralLAMConfig, Union[MDPDatastore, NpyFilesDatastoreMEPS]]: +) -> tuple[NeuralLAMConfig, MDPDatastore | NpyFilesDatastoreMEPS]: """ Load the neural-lam configuration and the datastore specified in the configuration. @@ -186,7 +186,7 @@ def load_config_and_datastore( Returns ------- - tuple[NeuralLAMConfig, Union[MDPDatastore, NpyFilesDatastoreMEPS]] + tuple[NeuralLAMConfig, MDPDatastore | NpyFilesDatastoreMEPS] The Neural-LAM configuration and the loaded datastore. """ try: @@ -204,4 +204,4 @@ def load_config_and_datastore( datastore_kind=config.datastore.kind, config_path=datastore_config_path ) - return config, datastore + return config, cast(MDPDatastore | NpyFilesDatastoreMEPS, datastore) diff --git a/neural_lam/create_graph.py b/neural_lam/create_graph.py index c67e4397..faed9c70 100644 --- a/neural_lam/create_graph.py +++ b/neural_lam/create_graph.py @@ -3,7 +3,6 @@ # Standard library import os from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser -from typing import Optional # Third-party import matplotlib @@ -22,7 +21,7 @@ def plot_graph( - graph: pyg.data.Data, title: Optional[str] = None + graph: pyg.data.Data, title: str | None = None ) -> tuple[matplotlib.figure.Figure, matplotlib.axes.Axes]: """ Render a PyTorch Geometric graph using stored node coordinates. @@ -266,10 +265,10 @@ def prepend_node_index(graph: networkx.Graph, new_index: int) -> networkx.Graph: def create_graph( graph_dir_path: str, xy: np.ndarray, - n_max_levels: Optional[int] = None, - hierarchical: Optional[bool] = False, - create_plot: Optional[bool] = False, -): + n_max_levels: int | None = None, + hierarchical: bool = False, + create_plot: bool = False, +) -> None: """ Create graph components from `xy` grid coordinates and store in `graph_dir_path`. @@ -488,8 +487,10 @@ def create_graph( .reshape((n, n, 2))[1::nx, 1::nx, :] .reshape(int(n / nx) ** 2, 2) ) - ij = [tuple(x) for x in ij] - G[lev] = networkx.relabel_nodes(G[lev], dict(zip(G[lev].nodes, ij))) + ij_tuples = [tuple(x) for x in ij] + G[lev] = networkx.relabel_nodes( + G[lev], dict(zip(G[lev].nodes, ij_tuples)) + ) G_tot = networkx.compose(G_tot, G[lev]) # Relabel mesh nodes to start with 0 @@ -647,10 +648,10 @@ def create_graph( def create_graph_from_datastore( datastore: BaseRegularGridDatastore, output_root_path: str, - n_max_levels: Optional[int] = None, + n_max_levels: int | None = None, hierarchical: bool = False, create_plot: bool = False, -): +) -> None: """ Generate graph components for ``datastore`` and persist them on disk. @@ -683,7 +684,7 @@ def create_graph_from_datastore( ) -def cli(input_args: Optional[list[str]] = None) -> None: +def cli(input_args: list[str] | None = None) -> None: """ Parse CLI arguments and call :func:`create_graph_from_datastore`. diff --git a/neural_lam/custom_loggers.py b/neural_lam/custom_loggers.py index 5b6000e6..1d5ff9f3 100644 --- a/neural_lam/custom_loggers.py +++ b/neural_lam/custom_loggers.py @@ -2,7 +2,6 @@ # Standard library import os -from typing import Optional # Third-party import matplotlib.pyplot as plt @@ -74,7 +73,7 @@ def log_image( self, key: str, images: list[plt.Figure], - step: Optional[int] = None, + step: int | None = None, ) -> None: """ Log one or more matplotlib figures as images to MLFlow. diff --git a/neural_lam/datastore/__init__.py b/neural_lam/datastore/__init__.py index e2117217..06716ef9 100644 --- a/neural_lam/datastore/__init__.py +++ b/neural_lam/datastore/__init__.py @@ -1,5 +1,8 @@ """Datastore backends for loading and serving weather model data.""" +# Standard library +from pathlib import Path + # Local from .base import BaseDatastore # noqa from .mdp import MDPDatastore # noqa @@ -16,7 +19,9 @@ } -def init_datastore(datastore_kind, config_path): +def init_datastore( + datastore_kind: str, config_path: str | Path +) -> BaseDatastore: """ Instantiate a datastore based on its short-name identifier. diff --git a/neural_lam/datastore/base.py b/neural_lam/datastore/base.py index 8376d38d..1abe3ac9 100644 --- a/neural_lam/datastore/base.py +++ b/neural_lam/datastore/base.py @@ -111,7 +111,7 @@ def get_vars_units(self, category: str) -> list[str]: Returns ------- - List[str] + list[str] The units of the variables. """ @@ -127,7 +127,7 @@ def get_vars_names(self, category: str) -> list[str]: Returns ------- - List[str] + list[str] The names of the variables. """ @@ -143,7 +143,7 @@ def get_vars_long_names(self, category: str) -> list[str]: Returns ------- - List[str] + list[str] The long names of the variables. """ @@ -333,7 +333,7 @@ def get_xy_extent(self, category: str) -> list[float]: Returns ------- - List[float] + list[float] The extent of the x, y coordinates. """ @@ -423,7 +423,7 @@ def expected_dim_order( The category of the dataset (state/forcing/static). Returns ------- - List[str] + list[str] The expected dimension order for the dataarray or dataset. """ @@ -496,7 +496,7 @@ class BaseRegularGridDatastore(BaseDatastore): `stack_grid_coords` and `unstack_grid_coords` respectively). """ - spatial_coordinates = ("x", "y") + spatial_coordinates: tuple[str, str] = ("x", "y") @cached_property @abc.abstractmethod @@ -562,7 +562,7 @@ def unstack_grid_coords( da_or_ds_unstacked = da_or_ds.unstack("grid_index") # Ensure that the x, y dimensions are in the correct order - dims = da_or_ds_unstacked.dims + dims = list(da_or_ds_unstacked.dims) xy_dim_order = [d for d in dims if d in self.spatial_coordinates] if xy_dim_order != self.spatial_coordinates: @@ -615,7 +615,7 @@ def stack_grid_coords( # dimension named in the format `{category}_feature` category = None for dim in da_or_ds_stacked.dims: - if dim.endswith("_feature"): + if isinstance(dim, str) and dim.endswith("_feature"): if category is not None: raise ValueError( "Multiple dimensions ending with '_feature' found in " diff --git a/neural_lam/datastore/mdp.py b/neural_lam/datastore/mdp.py index 7cad45d7..860f1af3 100644 --- a/neural_lam/datastore/mdp.py +++ b/neural_lam/datastore/mdp.py @@ -7,7 +7,6 @@ from datetime import timedelta from functools import cached_property from pathlib import Path -from typing import List, Optional, Union # Third-party import cartopy.crs as ccrs @@ -36,7 +35,7 @@ class MDPDatastore(BaseRegularGridDatastore): def __init__( self, - config_path: Union[str, Path], + config_path: str | Path, n_boundary_points: int = 30, reuse_existing: bool = True, ) -> None: @@ -176,7 +175,7 @@ def step_length(self) -> timedelta: total_sec = da_dt.dt.total_seconds().isel(time=0).astype(int) return timedelta(seconds=int(total_sec.item())) - def get_vars_units(self, category: str) -> List[str]: + def get_vars_units(self, category: str) -> list[str]: """Return the units of the variables in the given category. Parameters @@ -186,7 +185,7 @@ def get_vars_units(self, category: str) -> List[str]: Returns ------- - List[str] + list[str] The units of the variables in the given category. """ @@ -195,7 +194,7 @@ def get_vars_units(self, category: str) -> List[str]: return [] return self._ds[f"{category}_feature_units"].values.tolist() - def get_vars_names(self, category: str) -> List[str]: + def get_vars_names(self, category: str) -> list[str]: """Return the names of the variables in the given category. Parameters @@ -205,7 +204,7 @@ def get_vars_names(self, category: str) -> List[str]: Returns ------- - List[str] + list[str] The names of the variables in the given category. """ @@ -214,7 +213,7 @@ def get_vars_names(self, category: str) -> List[str]: return [] return self._ds[f"{category}_feature"].values.tolist() - def get_vars_long_names(self, category: str) -> List[str]: + def get_vars_long_names(self, category: str) -> list[str]: """ Return the long names of the variables in the given category. @@ -225,7 +224,7 @@ def get_vars_long_names(self, category: str) -> List[str]: Returns ------- - List[str] + list[str] The long names of the variables in the given category. """ @@ -253,9 +252,9 @@ def get_num_data_vars(self, category: str) -> int: def get_dataarray( self, category: str, - split: Optional[str], + split: str | None, standardize: bool = False, - ) -> Union[xr.DataArray, None]: + ) -> xr.DataArray | None: """ Return the processed data (as a single `xr.DataArray`) for the given category of data and test/train/val-split that covers all the data (in @@ -364,7 +363,7 @@ def get_standardization_dataarray(self, category: str) -> xr.Dataset: # Add standardized state diff stats if category == "state": ds_stats = ds_stats.assign( - **{ + { f"state_diff_{op}_standardized": self._ds[ f"state__{split}__diff_{op}" ] @@ -404,7 +403,11 @@ def boundary_mask(self) -> xr.DataArray: ds_unstacked["boundary_mask"] = ds_unstacked.boundary_mask.fillna( 1 ).astype(int) - return self.stack_grid_coords(da_or_ds=ds_unstacked.boundary_mask) + boundary_mask = self.stack_grid_coords( + da_or_ds=ds_unstacked.boundary_mask + ) + assert isinstance(boundary_mask, xr.DataArray) + return boundary_mask @property def coords_projection(self) -> ccrs.Projection: diff --git a/neural_lam/datastore/npyfilesmeps/compute_standardization_stats.py b/neural_lam/datastore/npyfilesmeps/compute_standardization_stats.py index 9e694f14..2c8719dd 100644 --- a/neural_lam/datastore/npyfilesmeps/compute_standardization_stats.py +++ b/neural_lam/datastore/npyfilesmeps/compute_standardization_stats.py @@ -6,6 +6,7 @@ from argparse import ArgumentParser from datetime import timedelta from pathlib import Path +from typing import Any, cast # Third-party import torch @@ -22,7 +23,12 @@ class PaddedWeatherDataset(torch.utils.data.Dataset): """Wrap :class:`WeatherDataset` to pad samples for distributed runners.""" - def __init__(self, base_dataset, world_size, batch_size): + def __init__( + self, + base_dataset: WeatherDataset, + world_size: int, + batch_size: int, + ) -> None: """ Parameters ---------- @@ -46,7 +52,9 @@ def __init__(self, base_dataset, world_size, batch_size): range(self.total_samples, self.total_samples + self.padded_samples) ) - def __getitem__(self, idx): + def __getitem__( + self, idx: int + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: """Return an item, repeating the final sample for padded indices.""" return self.base_dataset[ ( @@ -56,16 +64,16 @@ def __getitem__(self, idx): ) ] - def __len__(self): + def __len__(self) -> int: """Return the padded dataset length.""" return self.total_samples + self.padded_samples - def get_original_indices(self): + def get_original_indices(self) -> list[int]: """Return indices of the non-padded samples.""" return self.original_indices -def get_rank(): +def get_rank() -> int: """ Return the rank inferred from SLURM or default to 0. @@ -77,7 +85,7 @@ def get_rank(): return int(os.environ.get("SLURM_PROCID", 0)) -def get_world_size(): +def get_world_size() -> int: """ Return the world size inferred from SLURM or default to 1. @@ -89,7 +97,9 @@ def get_world_size(): return int(os.environ.get("SLURM_NTASKS", 1)) -def setup(rank, world_size): # pylint: disable=redefined-outer-name +def setup( + rank: int, world_size: int +) -> None: # pylint: disable=redefined-outer-name """ Initialize the distributed group. @@ -140,8 +150,13 @@ def setup(rank, world_size): # pylint: disable=redefined-outer-name def save_stats( - static_dir_path, means, squares, flux_means, flux_squares, filename_prefix -): + static_dir_path: str | Path, + means: list[torch.Tensor], + squares: list[torch.Tensor], + flux_means: list[torch.Tensor], + flux_squares: list[torch.Tensor], + filename_prefix: str, +) -> None: """ Aggregate running statistics and persist them to ``static_dir_path``. @@ -174,14 +189,14 @@ def save_stats( filename_prefix : str Prefix (e.g., ``"parameter"`` or ``"diff"``) for saved tensors. """ - means = ( - torch.stack(means) if len(means) > 1 else means[0] + means_tensor = ( + torch.stack(list(means)) if len(means) > 1 else means[0] ) # (B, d_features,) - squares = ( - torch.stack(squares) if len(squares) > 1 else squares[0] + squares_tensor = ( + torch.stack(list(squares)) if len(squares) > 1 else squares[0] ) # (B, d_features,) - mean = torch.mean(means, dim=0) # (d_features,) - second_moment = torch.mean(squares, dim=0) # (d_features,) + mean = torch.mean(means_tensor, dim=0) # (d_features,) + second_moment = torch.mean(squares_tensor, dim=0) # (d_features,) std = torch.sqrt(second_moment - mean**2) # (d_features,) print( f"Saving {filename_prefix} mean and std.-dev. to " @@ -196,14 +211,16 @@ def save_stats( if len(flux_means) == 0: return - flux_means = ( - torch.stack(flux_means) if len(flux_means) > 1 else flux_means[0] + flux_means_tensor = ( + torch.stack(list(flux_means)) if len(flux_means) > 1 else flux_means[0] ) # (B,) - flux_squares = ( - torch.stack(flux_squares) if len(flux_squares) > 1 else flux_squares[0] + flux_squares_tensor = ( + torch.stack(list(flux_squares)) + if len(flux_squares) > 1 + else flux_squares[0] ) # (B,) - flux_mean = torch.mean(flux_means) # (,) - flux_second_moment = torch.mean(flux_squares) # (,) + flux_mean = torch.mean(flux_means_tensor) # (,) + flux_second_moment = torch.mean(flux_squares_tensor) # (,) flux_std = torch.sqrt(flux_second_moment - flux_mean**2) # (,) print("Saving flux mean and std.-dev. to flux_stats.pt") torch.save( @@ -213,8 +230,12 @@ def save_stats( def main( - datastore_config_path, batch_size, step_length, n_workers, distributed -): + datastore_config_path: str | Path, + batch_size: int, + step_length: timedelta, + n_workers: int, + distributed: bool, +) -> None: """ Pre-compute and persist standardization statistics from the datastore. @@ -252,16 +273,18 @@ def main( # 65 forecast steps - 2 initial steps = 63 ar_steps = 63 # Raw (non-standardized) data for computing mean/std - ds = WeatherDataset( + ds_base = WeatherDataset( datastore=datastore, split="train", ar_steps=ar_steps, num_past_forcing_steps=0, num_future_forcing_steps=0, ) + sampler: DistributedSampler | None + ds: torch.utils.data.Dataset if distributed: ds = PaddedWeatherDataset( - ds, + ds_base, world_size, batch_size, ) @@ -269,6 +292,7 @@ def main( ds, num_replicas=world_size, rank=rank, shuffle=False ) else: + ds = ds_base sampler = None loader = torch.utils.data.DataLoader( ds, @@ -302,33 +326,33 @@ def main( flux_squares.append(torch.mean(flux_batch**2).cpu()) # (,) if distributed and world_size > 1: - means_gathered, squares_gathered = [None] * world_size, [ - None - ] * world_size - flux_means_gathered, flux_squares_gathered = ( - [None] * world_size, - [None] * world_size, - ) + means_gathered: list[Any] = [None] * world_size + squares_gathered: list[Any] = [None] * world_size + flux_means_gathered: list[Any] = [None] * world_size + flux_squares_gathered: list[Any] = [None] * world_size dist.all_gather_object(means_gathered, torch.cat(means, dim=0)) dist.all_gather_object(squares_gathered, torch.cat(squares, dim=0)) dist.all_gather_object(flux_means_gathered, flux_means) dist.all_gather_object(flux_squares_gathered, flux_squares) if rank == 0: - means_gathered, squares_gathered = ( - torch.cat(means_gathered, dim=0), - torch.cat(squares_gathered, dim=0), + means_gathered_tensor = torch.cat( + cast(list[torch.Tensor], means_gathered), dim=0 + ) + squares_gathered_tensor = torch.cat( + cast(list[torch.Tensor], squares_gathered), dim=0 ) + assert isinstance(ds, PaddedWeatherDataset) original_indices = ds.get_original_indices() means, squares = ( - [means_gathered[i] for i in original_indices], - [squares_gathered[i] for i in original_indices], + [means_gathered_tensor[i] for i in original_indices], + [squares_gathered_tensor[i] for i in original_indices], ) flux_means = [ torch.cat( [ - torch.stack(rank_flux) + torch.stack(cast(list[torch.Tensor], rank_flux)) for rank_flux in flux_means_gathered ] ) @@ -336,7 +360,7 @@ def main( flux_squares = [ torch.cat( [ - torch.stack(rank_flux) + torch.stack(cast(list[torch.Tensor], rank_flux)) for rank_flux in flux_squares_gathered ] ) @@ -362,16 +386,18 @@ def main( if rank == 0: print("Computing mean and std.-dev. for one-step differences...") - ds_standard = WeatherDataset( + ds_standard_base = WeatherDataset( datastore=datastore, split="train", ar_steps=ar_steps, num_past_forcing_steps=0, num_future_forcing_steps=0, ) + sampler_standard: DistributedSampler | None + ds_standard: torch.utils.data.Dataset if distributed: ds_standard = PaddedWeatherDataset( - ds_standard, + ds_standard_base, world_size, batch_size, ) @@ -379,6 +405,7 @@ def main( ds_standard, num_replicas=world_size, rank=rank, shuffle=False ) else: + ds_standard = ds_standard_base sampler_standard = None loader_standard = torch.utils.data.DataLoader( ds_standard, @@ -438,10 +465,8 @@ def main( if distributed and world_size > 1: dist.barrier() - diff_means_gathered, diff_squares_gathered = ( - [None] * world_size, - [None] * world_size, - ) + diff_means_gathered: list[Any] = [None] * world_size + diff_squares_gathered: list[Any] = [None] * world_size dist.all_gather_object( diff_means_gathered, torch.cat(diff_means, dim=0) ) @@ -450,13 +475,18 @@ def main( ) if rank == 0: - diff_means_gathered = torch.cat(diff_means_gathered, dim=0) - diff_squares_gathered = torch.cat(diff_squares_gathered, dim=0) + diff_means_gathered_tensor = torch.cat( + cast(list[torch.Tensor], diff_means_gathered), dim=0 + ) + diff_squares_gathered_tensor = torch.cat( + cast(list[torch.Tensor], diff_squares_gathered), dim=0 + ) + assert isinstance(ds_standard, PaddedWeatherDataset) n_original_windows = ( len(ds_standard.get_original_indices()) * time_step_int ) - diff_means = [diff_means_gathered[:n_original_windows]] - diff_squares = [diff_squares_gathered[:n_original_windows]] + diff_means = [diff_means_gathered_tensor[:n_original_windows]] + diff_squares = [diff_squares_gathered_tensor[:n_original_windows]] diff_means = [torch.cat(diff_means, dim=0)] # (B', d_features,) diff_squares = [torch.cat(diff_squares, dim=0)] # (B', d_features,) @@ -468,7 +498,7 @@ def main( dist.destroy_process_group() -def cli(): +def cli() -> None: """Parse CLI arguments and trigger :func:`main`.""" parser = ArgumentParser(description="Training arguments") parser.add_argument( diff --git a/neural_lam/datastore/npyfilesmeps/config.py b/neural_lam/datastore/npyfilesmeps/config.py index b423b4a1..be55dc73 100644 --- a/neural_lam/datastore/npyfilesmeps/config.py +++ b/neural_lam/datastore/npyfilesmeps/config.py @@ -3,7 +3,7 @@ # Standard library from dataclasses import dataclass, field from datetime import timedelta -from typing import Any, Dict, List +from typing import Any # Third-party import dataclass_wizard @@ -24,7 +24,7 @@ class Projection: """ class_name: str - kwargs: Dict[str, Any] + kwargs: dict[str, Any] @dataclass @@ -47,14 +47,14 @@ class Dataset: """ name: str - var_names: List[str] - var_units: List[str] - var_longnames: List[str] + var_names: list[str] + var_units: list[str] + var_longnames: list[str] num_forcing_features: int num_timesteps: int step_length: timedelta num_ensemble_members: int - remove_state_features_with_index: List[int] = field(default_factory=list) + remove_state_features_with_index: list[int] = field(default_factory=list) @dataclass @@ -70,5 +70,5 @@ class NpyDatastoreConfig(dataclass_wizard.YAMLWizard): """ dataset: Dataset - grid_shape_state: List[int] + grid_shape_state: list[int] projection: Projection diff --git a/neural_lam/datastore/npyfilesmeps/store.py b/neural_lam/datastore/npyfilesmeps/store.py index e14bbc74..343a067a 100644 --- a/neural_lam/datastore/npyfilesmeps/store.py +++ b/neural_lam/datastore/npyfilesmeps/store.py @@ -10,7 +10,7 @@ from datetime import timedelta from functools import cached_property from pathlib import Path -from typing import List, Optional +from typing import Any, cast # Third-party import cartopy.crs as ccrs @@ -34,7 +34,11 @@ OPEN_WATER_FILENAME_FORMAT = "wtr_{analysis_time:%Y%m%d%H}.npy" -def _load_np(fp, add_feature_dim, feature_dim_mask=None): +def _load_np( + fp: str | Path, + add_feature_dim: bool, + feature_dim_mask: np.ndarray | None = None, +) -> np.ndarray: """ Load an ``.npy`` file and optionally expand/mask the feature axis. @@ -162,10 +166,18 @@ class NpyFilesDatastoreMEPS(BaseRegularGridDatastore): is_forecast = True + _config_path: Path + _root_path: Path + _config: NpyDatastoreConfig + _num_ensemble_members: int + _num_timesteps: int + _step_length: timedelta + _remove_state_features_with_index: list[int] | None + def __init__( self, - config_path, - ): + config_path: str | Path, + ) -> None: """ Create a new NpyFilesDatastore using the configuration file at the given path. The config file should be a YAML file and will be loaded @@ -220,7 +232,7 @@ def config(self) -> NpyDatastoreConfig: return self._config def get_dataarray( - self, category: str, split: Optional[str], standardize: bool = False + self, category: str, split: str | None, standardize: bool = False ) -> DataArray: """ Get the data array for the given category and split of data. If the @@ -314,7 +326,9 @@ def get_dataarray( da = da.rename(dict(feature=f"{category}_feature")) # stack the [x, y] dimensions into a `grid_index` dimension - da = self.stack_grid_coords(da) + da_stacked = self.stack_grid_coords(da) + assert isinstance(da_stacked, xr.DataArray) + da = da_stacked # check that we have the right features actual_features = da[f"{category}_feature"].values.tolist() @@ -334,9 +348,9 @@ def get_dataarray( def _get_single_timeseries_dataarray( self, - features: List[str], - split: Optional[str] = None, - member: Optional[int] = None, + features: list[str], + split: str | None = None, + member: int | None = None, ) -> DataArray: """ Get the data array spanning the complete time series for a given set of @@ -347,7 +361,7 @@ def _get_single_timeseries_dataarray( Parameters ---------- - features : List[str] + features : list[str] The list of features to load the data for. For the 'state' category, this should be the result of `self.get_vars_names(category="state")`, for the 'forcing' category @@ -473,9 +487,11 @@ def _get_single_timeseries_dataarray( x = xs[:, 0] # Unique x-coordinates (changes along the first axis) y = ys[0, :] # Unique y-coordinates (changes along the second axis) for d in dims: + coord_values: Any if d == "elapsed_forecast_duration": coord_values = self.step_length * np.arange(self._num_timesteps) elif d == "analysis_time": + assert split is not None coord_values = self._get_analysis_times(split=split) elif d == "y": coord_values = y @@ -536,7 +552,7 @@ def _get_single_timeseries_dataarray( return da - def _get_analysis_times(self, split) -> List[np.datetime64]: + def _get_analysis_times(self, split: str) -> list[np.datetime64]: """Get the analysis times for the given split by parsing the filenames of all the files found for the given split. @@ -547,7 +563,7 @@ def _get_analysis_times(self, split) -> List[np.datetime64]: Returns ------- - List[dt.datetime] + list[dt.datetime] The analysis times for the given split, sorted in ascending order. """ @@ -568,7 +584,9 @@ def _get_analysis_times(self, split) -> List[np.datetime64]: return sorted(times) - def _calc_datetime_forcing_features(self, da_time: xr.DataArray): + def _calc_datetime_forcing_features( + self, da_time: xr.DataArray + ) -> xr.DataArray: """ Compute sinusoidal encodings of hour-of-day and day-of-year. @@ -586,11 +604,14 @@ def _calc_datetime_forcing_features(self, da_time: xr.DataArray): da_year_angle = da_time.dt.dayofyear / 365 * 2 * np.pi da_datetime_forcing = xr.concat( - ( - np.sin(da_hour_angle), - np.cos(da_hour_angle), - np.sin(da_year_angle), - np.cos(da_year_angle), + cast( + list[xr.DataArray], + [ + np.sin(da_hour_angle), + np.cos(da_hour_angle), + np.sin(da_year_angle), + np.cos(da_year_angle), + ], ), dim="feature", ) @@ -604,7 +625,7 @@ def _calc_datetime_forcing_features(self, da_time: xr.DataArray): return da_datetime_forcing - def get_vars_units(self, category: str) -> List[str]: + def get_vars_units(self, category: str) -> list[str]: """Return unit strings for the variables in ``category``.""" if category == "state": return self.config.dataset.var_units @@ -622,7 +643,7 @@ def get_vars_units(self, category: str) -> List[str]: else: raise NotImplementedError(f"Category {category} not supported") - def get_vars_names(self, category: str) -> List[str]: + def get_vars_names(self, category: str) -> list[str]: """Return canonical short names for the variables in ``category``.""" if category == "state": return self.config.dataset.var_names @@ -642,7 +663,7 @@ def get_vars_names(self, category: str) -> List[str]: else: raise NotImplementedError(f"Category {category} not supported") - def get_vars_long_names(self, category: str) -> List[str]: + def get_vars_long_names(self, category: str) -> list[str]: """Return descriptive names for the variables in ``category``.""" if category == "state": return self.config.dataset.var_longnames @@ -742,6 +763,7 @@ def boundary_mask(self) -> xr.DataArray: values, dims=["y", "x"], coords=dict(x=x, y=y), name="boundary_mask" ) da_mask_stacked_xy = self.stack_grid_coords(da_mask).astype(int) + assert isinstance(da_mask_stacked_xy, xr.DataArray) return da_mask_stacked_xy def get_standardization_dataarray(self, category: str) -> xr.Dataset: @@ -766,7 +788,7 @@ def get_standardization_dataarray(self, category: str) -> xr.Dataset: """ - def load_pickled_tensor(fn): + def load_pickled_tensor(fn: str) -> np.ndarray: """Load a serialized tensor from ``static`` and convert to numpy.""" return torch.load( self.root_path / "static" / fn, weights_only=True diff --git a/neural_lam/datastore/plot_example.py b/neural_lam/datastore/plot_example.py index 13f32e57..d14bad2e 100644 --- a/neural_lam/datastore/plot_example.py +++ b/neural_lam/datastore/plot_example.py @@ -1,21 +1,24 @@ """CLI helper to plot slices from datastores for manual inspection.""" # Third-party +import matplotlib.figure import matplotlib.pyplot as plt +import xarray as xr # Local from . import DATASTORES, init_datastore +from .base import BaseRegularGridDatastore def plot_example_from_datastore( - category, - datastore, - col_dim, - split="train", - standardize=True, - selection={}, - index_selection={}, -): + category: str, + datastore: BaseRegularGridDatastore, + col_dim: str, + split: str = "train", + standardize: bool = True, + selection: dict = {}, + index_selection: dict = {}, +) -> matplotlib.figure.Figure: """ Create a plot of the data from the datastore. @@ -47,10 +50,13 @@ def plot_example_from_datastore( Matplotlib figure object. """ da = datastore.get_dataarray(category=category, split=split) + assert da is not None if standardize: da_stats = datastore.get_standardization_dataarray(category=category) da = (da - da_stats[f"{category}_mean"]) / da_stats[f"{category}_std"] - da = datastore.unstack_grid_coords(da) + da_unstacked = datastore.unstack_grid_coords(da) + assert isinstance(da_unstacked, xr.DataArray) + da = da_unstacked if len(selection) > 0: da = da.sel(**selection) @@ -58,10 +64,10 @@ def plot_example_from_datastore( da = da.isel(**index_selection) col = col_dim.format(category=category) - # check that the column dimension exists and that the resulting shape is 2D if col not in da.dims: raise ValueError(f"Column dimension {col} not found in dataarray.") + da_col_item = da.isel({col: 0}).squeeze() if not len(da_col_item.shape) == 2: raise ValueError( @@ -94,16 +100,17 @@ def plot_example_from_datastore( # Standard library import argparse - def _parse_dict(arg_str): + def _parse_dict(arg_str: str) -> tuple[str, int | float | str]: """Parse ``key=value`` CLI arguments into typed dictionary entries.""" key, value = arg_str.split("=") + typed_value: int | float | str = value for op in [int, float]: try: - value = op(value) + typed_value = op(value) break except ValueError: pass - return key, value + return key, typed_value parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter @@ -180,6 +187,10 @@ def _parse_dict(arg_str): datastore_kind=datastore_kind, config_path=args.datastore_config_path, ) + # Standard library + from typing import cast + + datastore = cast(BaseRegularGridDatastore, datastore) plot_example_from_datastore( args.category, diff --git a/neural_lam/gnn_layers.py b/neural_lam/gnn_layers.py index 7a92ea76..f61f3029 100644 --- a/neural_lam/gnn_layers.py +++ b/neural_lam/gnn_layers.py @@ -1,7 +1,6 @@ """Interaction Network and PropagationNet GNN layers used by Neural-LAM.""" # Standard library -from typing import Optional, Type, Union # Third-party import torch @@ -27,9 +26,9 @@ def __init__( input_dim: int, update_edges: bool = True, hidden_layers: int = 1, - hidden_dim: Optional[int] = None, - edge_chunk_sizes: Optional[list[int]] = None, - aggr_chunk_sizes: Optional[list[int]] = None, + hidden_dim: int | None = None, + edge_chunk_sizes: list[int] | None = None, + aggr_chunk_sizes: list[int] | None = None, aggr: str = "sum", ) -> None: """ @@ -113,7 +112,7 @@ def forward( send_rep: torch.Tensor, rec_rep: torch.Tensor, edge_rep: torch.Tensor, - ) -> Union[torch.Tensor, tuple[torch.Tensor, torch.Tensor]]: + ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]: """ Apply the interaction network to update receiver node representations, and optionally edge representations. @@ -177,8 +176,8 @@ def aggregate( self, inputs: torch.Tensor, index: torch.Tensor, - ptr: Optional[torch.Tensor], - dim_size: Optional[int], + ptr: torch.Tensor | None, + dim_size: int | None, ) -> tuple[torch.Tensor, torch.Tensor]: """ Overridden aggregation function to: @@ -205,9 +204,9 @@ def __init__( input_dim: int, update_edges: bool = True, hidden_layers: int = 1, - hidden_dim: Optional[int] = None, - edge_chunk_sizes: Optional[list[int]] = None, - aggr_chunk_sizes: Optional[list[int]] = None, + hidden_dim: int | None = None, + edge_chunk_sizes: list[int] | None = None, + aggr_chunk_sizes: list[int] | None = None, aggr: str = "sum", ) -> None: """Initialise the :class:`PropagationNet` layer. @@ -256,7 +255,7 @@ def message( } -def get_gnn_class(gnn_type: str) -> Type[pyg.nn.MessagePassing]: +def get_gnn_class(gnn_type: str) -> type[pyg.nn.MessagePassing]: """ Look up a GNN class by name. diff --git a/neural_lam/metrics.py b/neural_lam/metrics.py index 1eb1d526..c332f011 100644 --- a/neural_lam/metrics.py +++ b/neural_lam/metrics.py @@ -2,7 +2,6 @@ # Standard library from collections.abc import Callable -from typing import Optional # Third-party import torch @@ -37,7 +36,7 @@ def get_metric(metric_name: str) -> Callable[..., torch.Tensor]: def mask_and_reduce_metric( metric_entry_vals: torch.Tensor, - mask: Optional[torch.Tensor], + mask: torch.Tensor | None, average_grid: bool, sum_vars: bool, ) -> torch.Tensor: @@ -89,7 +88,7 @@ def wmse( pred: torch.Tensor, target: torch.Tensor, pred_std: torch.Tensor, - mask: Optional[torch.Tensor] = None, + mask: torch.Tensor | None = None, average_grid: bool = True, sum_vars: bool = True, ) -> torch.Tensor: @@ -142,7 +141,7 @@ def mse( pred: torch.Tensor, target: torch.Tensor, pred_std: torch.Tensor, - mask: Optional[torch.Tensor] = None, + mask: torch.Tensor | None = None, average_grid: bool = True, sum_vars: bool = True, ) -> torch.Tensor: @@ -187,7 +186,7 @@ def wmae( pred: torch.Tensor, target: torch.Tensor, pred_std: torch.Tensor, - mask: Optional[torch.Tensor] = None, + mask: torch.Tensor | None = None, average_grid: bool = True, sum_vars: bool = True, ) -> torch.Tensor: @@ -240,7 +239,7 @@ def mae( pred: torch.Tensor, target: torch.Tensor, pred_std: torch.Tensor, - mask: Optional[torch.Tensor] = None, + mask: torch.Tensor | None = None, average_grid: bool = True, sum_vars: bool = True, ) -> torch.Tensor: @@ -285,7 +284,7 @@ def nll( pred: torch.Tensor, target: torch.Tensor, pred_std: torch.Tensor, - mask: Optional[torch.Tensor] = None, + mask: torch.Tensor | None = None, average_grid: bool = True, sum_vars: bool = True, ) -> torch.Tensor: @@ -334,7 +333,7 @@ def crps_gauss( pred: torch.Tensor, target: torch.Tensor, pred_std: torch.Tensor, - mask: Optional[torch.Tensor] = None, + mask: torch.Tensor | None = None, average_grid: bool = True, sum_vars: bool = True, ) -> torch.Tensor: diff --git a/neural_lam/models/forecasters/autoregressive.py b/neural_lam/models/forecasters/autoregressive.py index a8135f62..7167c64c 100644 --- a/neural_lam/models/forecasters/autoregressive.py +++ b/neural_lam/models/forecasters/autoregressive.py @@ -17,6 +17,9 @@ class ARForecaster(Forecaster): unroll a forecast. Makes use of a StepPredictor at each AR step. """ + boundary_mask: torch.Tensor + interior_mask: torch.Tensor + def __init__( self, predictor: StepPredictor, datastore: BaseDatastore ) -> None: diff --git a/neural_lam/models/module.py b/neural_lam/models/module.py index 71ce7951..f8616bbc 100644 --- a/neural_lam/models/module.py +++ b/neural_lam/models/module.py @@ -19,7 +19,7 @@ # Local from .. import metrics, vis from ..config import NeuralLAMConfig -from ..datastore import BaseDatastore +from ..datastore.base import BaseRegularGridDatastore from ..loss_weighting import get_state_feature_weighting from ..weather_dataset import WeatherDataset from .forecasters.base import Forecaster @@ -33,11 +33,20 @@ class ForecasterModule(pl.LightningModule): # pylint: disable=arguments-differ + interior_mask_bool: torch.Tensor + per_var_std: torch.Tensor | None + state_mean: torch.Tensor + state_std: torch.Tensor + forcing_mean: torch.Tensor | None + forcing_std: torch.Tensor | None + forcing_mean_tiled: torch.Tensor | None + forcing_std_tiled: torch.Tensor | None + def __init__( self, forecaster: Forecaster, config: NeuralLAMConfig, - datastore: BaseDatastore, + datastore: BaseRegularGridDatastore, loss: str = "wmse", lr: float = 1e-3, restore_opt: bool = False, @@ -46,8 +55,8 @@ def __init__( val_steps_to_log: list[int] | None = None, metrics_watch: list[str] | None = None, var_leads_metrics_watch: dict[int, list[int]] | None = None, - args=None, - ): + args: Any | None = None, + ) -> None: """ Initialize the ForecasterModule. @@ -266,13 +275,13 @@ def _create_dataarray_from_tensor( The resulting xarray DataArray. """ weather_dataset = WeatherDataset(datastore=self.datastore, split=split) - time = np.array(time.cpu(), dtype="datetime64[ns]") + time_np = np.array(time.cpu(), dtype="datetime64[ns]") da = weather_dataset.create_dataarray_from_tensor( - tensor=tensor, time=time, category=category + tensor=tensor, time=time_np, category=category ) return da - def configure_optimizers(self): + def configure_optimizers(self) -> torch.optim.Optimizer: """ Configure the optimizers and learning rate schedulers. @@ -281,13 +290,14 @@ def configure_optimizers(self): torch.optim.Optimizer The configured optimizer. """ - opt = torch.optim.AdamW( - self.parameters(), lr=self.hparams.lr, betas=(0.9, 0.95) - ) + lr = self.hparams.lr # type: ignore[attr-defined] + opt = torch.optim.AdamW(self.parameters(), lr=lr, betas=(0.9, 0.95)) return opt @staticmethod - def _safe_std(std_values, eps, category): + def _safe_std( + std_values: np.ndarray | torch.Tensor, eps: float, category: str + ) -> torch.Tensor: """Build a float32 std tensor, clamping near-zero values to `eps`. Mirrors the previous CPU-side WeatherDataset behavior: features with @@ -304,7 +314,11 @@ def _safe_std(std_values, eps, category): ) return torch.clamp(std, min=eps) - def on_after_batch_transfer(self, batch, dataloader_idx): + def on_after_batch_transfer( + self, + batch: tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor], + dataloader_idx: int, + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: """Standardize a batch on-device after transfer to the accelerator. Lightning calls this for every train/val/test/predict batch. @@ -317,6 +331,9 @@ def on_after_batch_transfer(self, batch, dataloader_idx): target_states = (target_states - self.state_mean) / self.state_std if forcing.shape[-1] > 0: + assert ( + self.forcing_mean is not None and self.forcing_std is not None + ) if self.forcing_mean_tiled is None: # Forcing is (..., num_forcing_vars * window_size). # WeatherDataset stacks (forcing_feature, window) @@ -330,13 +347,20 @@ def on_after_batch_transfer(self, batch, dataloader_idx): self.forcing_std_tiled = self.forcing_std.repeat_interleave( window_size ) + assert ( + self.forcing_mean_tiled is not None + and self.forcing_std_tiled is not None + ) forcing = ( forcing - self.forcing_mean_tiled ) / self.forcing_std_tiled return init_states, target_states, forcing, batch_times - def common_step(self, batch): + def common_step( + self, + batch: tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor], + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor | None, torch.Tensor]: """ Perform a common prediction step for training, validation, and testing. @@ -358,7 +382,10 @@ def common_step(self, batch): ) return prediction, target_states, pred_std, batch_times - def training_step(self, batch): + def training_step( + self, + batch: tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor], + ) -> torch.Tensor: """ Perform a single training step. @@ -396,7 +423,7 @@ def training_step(self, batch): ) return batch_loss - def all_gather_cat(self, tensor_to_gather): + def all_gather_cat(self, tensor_to_gather: torch.Tensor) -> torch.Tensor: """ Gather tensors from all GPUs and concatenate them. @@ -411,6 +438,7 @@ def all_gather_cat(self, tensor_to_gather): The concatenated tensor from all processes. """ gathered = self.all_gather(tensor_to_gather) + assert isinstance(gathered, torch.Tensor) # all_gather adds dim 0 only on multi-device; on single # device it returns the same tensor unchanged. if gathered.dim() > tensor_to_gather.dim(): @@ -423,7 +451,11 @@ def _warn_skipped_val_steps(self, pred_steps: int, phase: str) -> None: flag = f"_{phase}_steps_warn_issued" if getattr(self, flag): return - invalid = [s for s in self.hparams.val_steps_to_log if s > pred_steps] + invalid = [ + s + for s in self.hparams.val_steps_to_log # type: ignore[attr-defined] + if s > pred_steps + ] if invalid: warnings.warn( f"val_steps_to_log contains steps {invalid} that exceed " @@ -435,7 +467,11 @@ def _warn_skipped_val_steps(self, pred_steps: int, phase: str) -> None: ) setattr(self, flag, True) - def validation_step(self, batch, batch_idx): + def validation_step( + self, + batch: tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor], + batch_idx: int, + ) -> None: """ Perform a single validation step. @@ -449,6 +485,7 @@ def validation_step(self, batch, batch_idx): prediction, target_states, pred_std, _ = self.common_step(batch) if pred_std is None: pred_std = self.per_var_std + assert pred_std is not None time_step_loss = torch.mean( self.loss( @@ -462,9 +499,13 @@ def validation_step(self, batch, batch_idx): mean_loss = torch.mean(time_step_loss) self._warn_skipped_val_steps(len(time_step_loss), "val") + hparams = self.hparams + val_steps_to_log = ( + hparams.val_steps_to_log # type: ignore[attr-defined] + ) val_log_dict = { f"val_loss_unroll{step}": time_step_loss[step - 1] - for step in self.hparams.val_steps_to_log + for step in val_steps_to_log if step <= len(time_step_loss) } val_log_dict["val_mean_loss"] = mean_loss @@ -485,15 +526,21 @@ def validation_step(self, batch, batch_idx): ) self.val_metrics["mse"].append(entry_mses) - def on_validation_epoch_end(self): + def on_validation_epoch_end(self) -> None: """ Perform actions at the end of the validation epoch. Aggregates and plots validation metrics. """ self.aggregate_and_plot_metrics(self.val_metrics, prefix="val") - if self.trainer.is_global_zero and self.hparams.metrics_watch: - unmatched = set(self.hparams.metrics_watch) - self.matched_metrics + if ( + self.trainer.is_global_zero + and self.hparams.metrics_watch # type: ignore[attr-defined] + ): + unmatched = ( + set(self.hparams.metrics_watch) # type: ignore[attr-defined] + - self.matched_metrics + ) if unmatched: warnings.warn( "The following metrics in --metrics_watch " @@ -508,7 +555,11 @@ def on_validation_epoch_end(self): metric_list.clear() # pylint: disable-next=unused-argument - def test_step(self, batch, batch_idx): + def test_step( + self, + batch: tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor], + batch_idx: int, + ) -> None: """ Perform a single test step. @@ -529,6 +580,7 @@ def test_step(self, batch, batch_idx): if pred_std is None: pred_std = self.per_var_std + assert pred_std is not None time_step_loss = torch.mean( self.loss( @@ -542,9 +594,13 @@ def test_step(self, batch, batch_idx): mean_loss = torch.mean(time_step_loss) self._warn_skipped_val_steps(len(time_step_loss), "test") + hparams = self.hparams + val_steps_to_log = ( + hparams.val_steps_to_log # type: ignore[attr-defined] + ) test_log_dict = { f"test_loss_unroll{step}": time_step_loss[step - 1] - for step in self.hparams.val_steps_to_log + for step in val_steps_to_log if step <= len(time_step_loss) } test_log_dict["test_mean_loss"] = mean_loss @@ -575,7 +631,7 @@ def test_step(self, batch, batch_idx): :, [ step - 1 - for step in self.hparams.val_steps_to_log + for step in val_steps_to_log if step <= spatial_loss.shape[1] ], ] @@ -585,19 +641,25 @@ def test_step(self, batch, batch_idx): self.trainer.is_global_zero and self.plotted_examples < self.n_example_pred ): - n_additional_examples = min( + n_examples = min( prediction.shape[0], self.n_example_pred - self.plotted_examples, ) self.plot_examples( batch, - n_additional_examples, + n_examples, prediction=prediction, split="test", ) - def plot_examples(self, batch, n_examples, split, prediction): + def plot_examples( + self, + batch: tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor], + n_examples: int, + split: str, + prediction: torch.Tensor, + ) -> None: """ Plot example predictions. @@ -673,7 +735,7 @@ def plot_examples(self, batch, n_examples, split, prediction): if self.create_gif: plot_dir_path = os.path.join( - self.logger.save_dir, + self.logger.save_dir, # type: ignore[union-attr] f"example_plots_{example_i}", ) os.makedirs(plot_dir_path, exist_ok=True) @@ -715,7 +777,9 @@ def plot_examples(self, batch, n_examples, split, prediction): key = f"{var_name}_example" if hasattr(self.logger, "log_image"): - self.logger.log_image(key=key, images=[fig], step=t_i) + self.logger.log_image( # type: ignore[union-attr] + key=key, images=[fig], step=t_i + ) else: warnings.warn( f"{self.logger} does not support image logging." @@ -755,19 +819,21 @@ def plot_examples(self, batch, n_examples, split, prediction): torch.save( pred_slice.cpu(), os.path.join( - self.logger.save_dir, + self.logger.save_dir, # type: ignore[union-attr] f"example_pred_{self.plotted_examples}.pt", ), ) torch.save( target_slice.cpu(), os.path.join( - self.logger.save_dir, + self.logger.save_dir, # type: ignore[union-attr] f"example_target_{self.plotted_examples}.pt", ), ) - def create_metric_log_dict(self, metric_tensor, prefix, metric_name): + def create_metric_log_dict( + self, metric_tensor: torch.Tensor, prefix: str, metric_name: str + ) -> dict[str, Any]: """ Create a dictionary of metrics to log. @@ -785,7 +851,7 @@ def create_metric_log_dict(self, metric_tensor, prefix, metric_name): dict Dictionary of logged metrics and figures. """ - log_dict = {} + log_dict: dict[str, Any] = {} metric_fig = vis.plot_error_heatmap( errors=metric_tensor, datastore=self.datastore, @@ -795,21 +861,29 @@ def create_metric_log_dict(self, metric_tensor, prefix, metric_name): if prefix == "test": metric_fig.savefig( - os.path.join(self.logger.save_dir, f"{full_log_name}.pdf") + os.path.join( + self.logger.save_dir, # type: ignore[union-attr] + f"{full_log_name}.pdf", + ) ) np.savetxt( - os.path.join(self.logger.save_dir, f"{full_log_name}.csv"), + os.path.join( + self.logger.save_dir, # type: ignore[union-attr] + f"{full_log_name}.csv", + ), metric_tensor.cpu().numpy(), delimiter=",", ) var_names = self.datastore.get_vars_names(category="state") - if full_log_name in self.hparams.metrics_watch: + hparams = self.hparams + metrics_watch = hparams.metrics_watch # type: ignore[attr-defined] + if full_log_name in metrics_watch: self.matched_metrics.add(full_log_name) - for ( - var_i, - timesteps, - ) in self.hparams.var_leads_metrics_watch.items(): + var_leads_metrics_watch = ( + hparams.var_leads_metrics_watch # type: ignore[attr-defined] + ) + for var_i, timesteps in var_leads_metrics_watch.items(): var_name = var_names[var_i] for step in timesteps: key = f"{full_log_name}_{var_name}_step_{step}" @@ -817,7 +891,9 @@ def create_metric_log_dict(self, metric_tensor, prefix, metric_name): return log_dict - def aggregate_and_plot_metrics(self, metrics_dict, prefix): + def aggregate_and_plot_metrics( + self, metrics_dict: dict[str, list[torch.Tensor]], prefix: str + ) -> None: """ Aggregate metrics from all GPUs and plot them. @@ -880,11 +956,13 @@ def aggregate_and_plot_metrics(self, metrics_dict, prefix): key = f"{key}-{current_epoch}" if hasattr(self.logger, "log_image"): - self.logger.log_image(key=key, images=[figure]) + self.logger.log_image( # type: ignore[union-attr] + key=key, images=[figure] + ) plt.close("all") - def on_test_epoch_end(self): + def on_test_epoch_end(self) -> None: """ Perform actions at the end of the test epoch. Aggregates and plots test metrics and spatial loss maps. @@ -896,6 +974,11 @@ def on_test_epoch_end(self): ) if self.trainer.is_global_zero: mean_spatial_loss = torch.mean(spatial_loss_tensor, dim=0) + hparams = self.hparams + val_steps_to_log = ( + hparams.val_steps_to_log # type: ignore[attr-defined] + ) + logger_save_dir = self.logger.save_dir # type: ignore[union-attr] loss_map_figs = [ vis.plot_spatial_error( @@ -905,7 +988,8 @@ def on_test_epoch_end(self): f"({(self.time_step_int * t_i)} {self.time_step_unit})", ) for t_i, loss_map in zip( - self.hparams.val_steps_to_log, mean_spatial_loss + val_steps_to_log, + mean_spatial_loss, ) ] @@ -914,30 +998,35 @@ def on_test_epoch_end(self): if not isinstance(self.logger, pl.loggers.WandbLogger): key = f"{key}_{i}" if hasattr(self.logger, "log_image"): - self.logger.log_image(key=key, images=[fig]) + self.logger.log_image( # type: ignore[union-attr] + key=key, images=[fig] + ) pdf_loss_map_figs = [ vis.plot_spatial_error(error=loss_map, datastore=self.datastore) for loss_map in mean_spatial_loss ] pdf_loss_maps_dir = os.path.join( - self.logger.save_dir, "spatial_loss_maps" + logger_save_dir, "spatial_loss_maps" ) os.makedirs(pdf_loss_maps_dir, exist_ok=True) for t_i, fig in zip( - self.hparams.val_steps_to_log, pdf_loss_map_figs + val_steps_to_log, + pdf_loss_map_figs, ): fig.savefig(os.path.join(pdf_loss_maps_dir, f"loss_t{t_i}.pdf")) torch.save( mean_spatial_loss.cpu(), - os.path.join(self.logger.save_dir, "mean_spatial_loss.pt"), + os.path.join( + logger_save_dir, + "mean_spatial_loss.pt", + ), ) - if self.hparams.metrics_watch: - unmatched = ( - set(self.hparams.metrics_watch) - self.matched_metrics - ) + metrics_watch = hparams.metrics_watch # type: ignore[attr-defined] + if metrics_watch: + unmatched = set(metrics_watch) - self.matched_metrics if unmatched: warnings.warn( "The following metrics in --metrics_watch " @@ -961,7 +1050,7 @@ def on_test_epoch_end(self): # otherwise stay permanently False). self.plotted_examples = 0 - def on_load_checkpoint(self, checkpoint): + def on_load_checkpoint(self, checkpoint: dict[str, Any]) -> None: """ Perform actions when loading a checkpoint. Handles backward compatibility for older checkpoints. diff --git a/neural_lam/models/step_predictors/base.py b/neural_lam/models/step_predictors/base.py index daf8b0e6..6efdaacf 100644 --- a/neural_lam/models/step_predictors/base.py +++ b/neural_lam/models/step_predictors/base.py @@ -18,6 +18,19 @@ class StepPredictor(nn.Module, ABC): time steps plus forcing into a prediction of the next state. """ + grid_static_features: torch.Tensor + state_mean: torch.Tensor + state_std: torch.Tensor + + # Registered buffers for clamping + sigmoid_lower_lims: torch.Tensor + sigmoid_upper_lims: torch.Tensor + softplus_lower_lims: torch.Tensor + softplus_upper_lims: torch.Tensor + clamp_lower_upper_idx: torch.Tensor + clamp_lower_idx: torch.Tensor + clamp_upper_idx: torch.Tensor + def __init__( self, datastore: BaseDatastore, diff --git a/neural_lam/models/step_predictors/graph/base.py b/neural_lam/models/step_predictors/graph/base.py index 1a747971..5dc3ee0b 100644 --- a/neural_lam/models/step_predictors/graph/base.py +++ b/neural_lam/models/step_predictors/graph/base.py @@ -18,6 +18,16 @@ class BaseGraphModel(StepPredictor): the encode-process-decode idea. """ + diff_mean: torch.Tensor + diff_std: torch.Tensor + g2m_features: torch.Tensor + m2g_features: torch.Tensor + g2m_edge_index: torch.Tensor + m2g_edge_index: torch.Tensor + mesh_static_features: torch.Tensor | list[torch.Tensor] + m2m_features: torch.Tensor | list[torch.Tensor] + m2m_edge_index: torch.Tensor | list[torch.Tensor] + def __init__( self, datastore: BaseDatastore, diff --git a/neural_lam/models/step_predictors/graph/graph_lam.py b/neural_lam/models/step_predictors/graph/graph_lam.py index fdb12a12..1728307d 100644 --- a/neural_lam/models/step_predictors/graph/graph_lam.py +++ b/neural_lam/models/step_predictors/graph/graph_lam.py @@ -21,6 +21,10 @@ class GraphLAM(BaseGraphModel): Oskarsson et al. (2023). """ + mesh_static_features: torch.Tensor + m2m_features: torch.Tensor + m2m_edge_index: torch.Tensor + def __init__( self, datastore: BaseDatastore, diff --git a/neural_lam/models/step_predictors/graph/hi_lam.py b/neural_lam/models/step_predictors/graph/hi_lam.py index ee3eda8b..d01b56ac 100644 --- a/neural_lam/models/step_predictors/graph/hi_lam.py +++ b/neural_lam/models/step_predictors/graph/hi_lam.py @@ -5,6 +5,7 @@ # Standard library # Third-party +import torch from torch import nn # Local @@ -37,7 +38,7 @@ def __init__( m2g_gnn_type: str = "InteractionNet", mesh_up_gnn_type: str = "InteractionNet", mesh_down_gnn_type: str = "InteractionNet", - ): + ) -> None: """ Initialize the HiLAM model. @@ -100,7 +101,7 @@ def __init__( [self.make_same_gnns() for _ in range(processor_layers)] ) # Nested lists (proc_steps, num_levels) - def make_same_gnns(self): + def make_same_gnns(self) -> nn.ModuleList: """ Make intra-level GNNs. @@ -120,7 +121,7 @@ def make_same_gnns(self): ] ) - def make_up_gnns(self): + def make_up_gnns(self) -> nn.ModuleList: """ Make GNNs for processing steps up through the hierarchy. @@ -141,7 +142,7 @@ def make_up_gnns(self): ] ) - def make_down_gnns(self): + def make_down_gnns(self) -> nn.ModuleList: """ Make GNNs for processing steps down through the hierarchy. @@ -164,12 +165,12 @@ def make_down_gnns(self): def mesh_down_step( self, - mesh_rep_levels, - mesh_same_rep, - mesh_down_rep, - down_gnns, - same_gnns, - ): + mesh_rep_levels: list[torch.Tensor], + mesh_same_rep: list[torch.Tensor], + mesh_down_rep: list[torch.Tensor], + down_gnns: nn.ModuleList, + same_gnns: nn.ModuleList, + ) -> tuple[list[torch.Tensor], list[torch.Tensor], list[torch.Tensor]]: """ Run the downward pass of vertical processing, alternating between down-edges and same-level edges from the top to the bottom level. @@ -234,8 +235,13 @@ def mesh_down_step( return mesh_rep_levels, mesh_same_rep, mesh_down_rep def mesh_up_step( - self, mesh_rep_levels, mesh_same_rep, mesh_up_rep, up_gnns, same_gnns - ): + self, + mesh_rep_levels: list[torch.Tensor], + mesh_same_rep: list[torch.Tensor], + mesh_up_rep: list[torch.Tensor], + up_gnns: nn.ModuleList, + same_gnns: nn.ModuleList, + ) -> tuple[list[torch.Tensor], list[torch.Tensor], list[torch.Tensor]]: """ Run the upward pass of vertical processing, alternating between up-edges and same-level edges from the bottom to the top level. @@ -300,8 +306,17 @@ def mesh_up_step( return mesh_rep_levels, mesh_same_rep, mesh_up_rep def hi_processor_step( - self, mesh_rep_levels, mesh_same_rep, mesh_up_rep, mesh_down_rep - ): + self, + mesh_rep_levels: list[torch.Tensor], + mesh_same_rep: list[torch.Tensor], + mesh_up_rep: list[torch.Tensor], + mesh_down_rep: list[torch.Tensor], + ) -> tuple[ + list[torch.Tensor], + list[torch.Tensor], + list[torch.Tensor], + list[torch.Tensor], + ]: """ Run all processor steps (down then up at each layer depth) over the hierarchical mesh. @@ -337,6 +352,11 @@ def hi_processor_step( self.mesh_up_gnns, self.mesh_up_same_gnns, ): + assert isinstance(down_gnns, nn.ModuleList) + assert isinstance(down_same_gnns, nn.ModuleList) + assert isinstance(up_gnns, nn.ModuleList) + assert isinstance(up_same_gnns, nn.ModuleList) + # Down mesh_rep_levels, mesh_same_rep, mesh_down_rep = self.mesh_down_step( mesh_rep_levels, diff --git a/neural_lam/models/step_predictors/graph/hi_lam_parallel.py b/neural_lam/models/step_predictors/graph/hi_lam_parallel.py index fbab93ef..b70045c7 100644 --- a/neural_lam/models/step_predictors/graph/hi_lam_parallel.py +++ b/neural_lam/models/step_predictors/graph/hi_lam_parallel.py @@ -2,8 +2,6 @@ Parallel hierarchical graph-based LAM model. """ -# Standard library - # Third-party import torch import torch_geometric as pyg @@ -40,7 +38,7 @@ def __init__( m2g_gnn_type: str = "InteractionNet", mesh_up_gnn_type: str = "InteractionNet", mesh_down_gnn_type: str = "InteractionNet", - ): + ) -> None: """ Initialize the HiLAMParallel model. @@ -119,8 +117,17 @@ def __init__( ) def hi_processor_step( - self, mesh_rep_levels, mesh_same_rep, mesh_up_rep, mesh_down_rep - ): + self, + mesh_rep_levels: list[torch.Tensor], + mesh_same_rep: list[torch.Tensor], + mesh_up_rep: list[torch.Tensor], + mesh_down_rep: list[torch.Tensor], + ) -> tuple[ + list[torch.Tensor], + list[torch.Tensor], + list[torch.Tensor], + list[torch.Tensor], + ]: """ Run all processor steps in parallel across all edge types and hierarchy levels. @@ -156,7 +163,7 @@ def hi_processor_step( mesh_rep_levels, dim=1 ) # (B, num_mesh_nodes, hidden_dim) mesh_edge_rep = torch.cat( - mesh_same_rep + mesh_up_rep + mesh_down_rep, axis=1 + mesh_same_rep + mesh_up_rep + mesh_down_rep, dim=1 ) # (B, num_edges, hidden_dim) # Here, update mesh_*_rep and mesh_rep @@ -170,13 +177,15 @@ def hi_processor_step( mesh_edge_rep, self.edge_split_sections, dim=1 ) - mesh_same_rep = mesh_edge_rep_sections[: self.num_levels] - mesh_up_rep = mesh_edge_rep_sections[ - self.num_levels : self.num_levels + (self.num_levels - 1) - ] - mesh_down_rep = mesh_edge_rep_sections[ - self.num_levels + (self.num_levels - 1) : - ] # Last are down edges + mesh_same_rep = list(mesh_edge_rep_sections[: self.num_levels]) + mesh_up_rep = list( + mesh_edge_rep_sections[ + self.num_levels : self.num_levels + (self.num_levels - 1) + ] + ) + mesh_down_rep = list( + mesh_edge_rep_sections[self.num_levels + (self.num_levels - 1) :] + ) # Last are down edges # TODO: We return all, even though only down edges really are used # later diff --git a/neural_lam/models/step_predictors/graph/hierarchical.py b/neural_lam/models/step_predictors/graph/hierarchical.py index 8baa99b5..c42e9dab 100644 --- a/neural_lam/models/step_predictors/graph/hierarchical.py +++ b/neural_lam/models/step_predictors/graph/hierarchical.py @@ -3,6 +3,7 @@ # Standard library # Third-party +import torch from torch import nn # Local @@ -17,6 +18,15 @@ class BaseHiGraphModel(BaseGraphModel): Base class for hierarchical graph models. """ + # Buffers or graph features that are lists of tensors in hierarchical models + mesh_static_features: list[torch.Tensor] + m2m_features: list[torch.Tensor] + mesh_up_features: list[torch.Tensor] + mesh_down_features: list[torch.Tensor] + m2m_edge_index: list[torch.Tensor] + mesh_up_edge_index: list[torch.Tensor] + mesh_down_edge_index: list[torch.Tensor] + def __init__( self, datastore: BaseDatastore, @@ -34,7 +44,7 @@ def __init__( m2g_gnn_type: str = "InteractionNet", mesh_up_gnn_type: str = "InteractionNet", mesh_down_gnn_type: str = "InteractionNet", - ): + ) -> None: """Extend :class:`BaseGraphModel` with hierarchical mesh structures.""" super().__init__( datastore=datastore, @@ -140,7 +150,7 @@ def __init__( ] ) - def get_num_mesh(self): + def get_num_mesh(self) -> tuple[int, int]: """ Compute mesh node counts used for encoding and decoding. @@ -158,7 +168,7 @@ def get_num_mesh(self): ) return num_mesh_nodes, num_mesh_nodes_ignore - def embedd_mesh_nodes(self): + def embedd_mesh_nodes(self) -> torch.Tensor: """ Embed static mesh node features for the bottom level only; remaining levels are embedded at the start of ``process_step``. @@ -173,7 +183,7 @@ def embedd_mesh_nodes(self): """ return self.mesh_embedders[0](self.mesh_static_features[0]) - def process_step(self, mesh_rep): + def process_step(self, mesh_rep: torch.Tensor) -> torch.Tensor: """ Process the mesh representation across all hierarchy levels, implementing the full init-process-readout cycle. @@ -282,8 +292,17 @@ def process_step(self, mesh_rep): return mesh_rep_levels[0] # (B, num_mesh_nodes[0], hidden_dim) def hi_processor_step( - self, mesh_rep_levels, mesh_same_rep, mesh_up_rep, mesh_down_rep - ): + self, + mesh_rep_levels: list[torch.Tensor], + mesh_same_rep: list[torch.Tensor], + mesh_up_rep: list[torch.Tensor], + mesh_down_rep: list[torch.Tensor], + ) -> tuple[ + list[torch.Tensor], + list[torch.Tensor], + list[torch.Tensor], + list[torch.Tensor], + ]: """ Internal processor step between mesh init and read-out. diff --git a/neural_lam/plot_graph.py b/neural_lam/plot_graph.py index 77c9b3cf..09690ffe 100644 --- a/neural_lam/plot_graph.py +++ b/neural_lam/plot_graph.py @@ -3,7 +3,7 @@ # Standard library import os from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser -from typing import Any, Optional +from typing import Any # Third-party import numpy as np @@ -24,7 +24,7 @@ def plot_graph( hierarchical: bool, graph_ldict: dict[str, Any], show_axis: bool = False, - save: Optional[str] = None, + save: str | None = None, ) -> go.Figure: """Build a 3D plotly figure of the graph structure. diff --git a/neural_lam/train_model.py b/neural_lam/train_model.py index f98065c4..dfa331cd 100644 --- a/neural_lam/train_model.py +++ b/neural_lam/train_model.py @@ -17,7 +17,8 @@ # Local from . import utils -from .config import load_config_and_datastore +from .config import NeuralLAMConfig, load_config_and_datastore +from .datastore.base import BaseDatastore from .gnn_layers import GNN_TYPES from .models import MODELS, ARForecaster, ForecasterModule from .weather_dataset import WeatherDataModule @@ -26,7 +27,7 @@ class AdaptiveHelpFormatter(ArgumentDefaultsHelpFormatter): """``--help`` formatter that scales the column width to the terminal.""" - def __init__(self, prog): + def __init__(self, prog: str) -> None: """Pick a help-column width based on the current terminal size.""" terminal_width = shutil.get_terminal_size(fallback=(100, 20)).columns width = max(80, min(terminal_width, 120)) @@ -38,7 +39,11 @@ def __init__(self, prog): ) -def load_forecaster_module_from_checkpoint(ckpt_path, config, datastore): +def load_forecaster_module_from_checkpoint( + ckpt_path: str, + config: NeuralLAMConfig, + datastore: BaseDatastore, +) -> ForecasterModule: """ Reconstruct a ForecasterModule from a checkpoint without requiring the caller to know the original architecture kwargs. @@ -73,7 +78,7 @@ def load_forecaster_module_from_checkpoint(ckpt_path, config, datastore): @logger.catch -def main(input_args=None): +def main(input_args: list[str] | None = None) -> None: """Main function for training and evaluating models.""" parser = ArgumentParser( description="Train or evaluate MLWP models for LAM", @@ -429,6 +434,7 @@ def main(input_args=None): device_name = "cpu" # Set devices to use + devices: str | list[int] if args.devices == ["auto"]: devices = "auto" else: diff --git a/neural_lam/utils.py b/neural_lam/utils.py index 942eb206..7f75fa62 100644 --- a/neural_lam/utils.py +++ b/neural_lam/utils.py @@ -1,6 +1,7 @@ """Utility helpers shared across Neural-LAM training and evaluation.""" # Standard library +import argparse import datetime import os import shutil @@ -9,7 +10,10 @@ import warnings from functools import cache from pathlib import Path -from typing import Any, Iterator, Union, overload +from typing import TYPE_CHECKING, Any, Iterator, overload + +if TYPE_CHECKING: + from .datastore.base import BaseDatastore # Third-party import pytorch_lightning as pl @@ -60,8 +64,8 @@ def __getitem__(self, key: slice) -> list[torch.Tensor]: """Slice-indexed access overload; see the implementation below.""" def __getitem__( - self, key: Union[int, slice] - ) -> Union[torch.Tensor, list[torch.Tensor]]: + self, key: int | slice + ) -> torch.Tensor | list[torch.Tensor]: """Return the buffer(s) at ``key``. Supports integer indexing (with Python-style negative indices) @@ -92,13 +96,13 @@ def __iter__(self) -> Iterator[torch.Tensor]: """Iterate over the registered buffers in ascending index order.""" return (self[i] for i in range(len(self))) - def __itruediv__(self, other: float) -> "BufferList": + def __itruediv__(self, other: float | torch.Tensor) -> "BufferList": """ Divide each element in list with other. Parameters ---------- - other : float + other : float or torch.Tensor The value to divide by. Returns @@ -108,13 +112,13 @@ def __itruediv__(self, other: float) -> "BufferList": """ return self.__imul__(1.0 / other) - def __imul__(self, other: float) -> "BufferList": + def __imul__(self, other: float | torch.Tensor) -> "BufferList": """ Multiply each element in list with other. Parameters ---------- - other : float + other : float or torch.Tensor The value to multiply by. Returns @@ -254,7 +258,7 @@ def zero_index_g2m( def load_graph( - graph_dir_path: Union[str, Path], device: str = "cpu" + graph_dir_path: str | Path, device: str = "cpu" ) -> tuple[bool, dict[str, Any]]: """Load all tensors representing the graph from `graph_dir_path`. @@ -377,6 +381,9 @@ def loads_file(fn: str) -> Any: len(mesh_static_features) == n_levels ), "Inconsistent number of levels in mesh" + m2m_edge_index_out: Any + m2m_features_out: Any + mesh_static_features_out: Any if hierarchical: # Load up and down edges and features mesh_up_edge_index = BufferList( @@ -407,14 +414,16 @@ def loads_file(fn: str) -> Any: mesh_down_features = BufferList(mesh_down_features, persistent=False) mesh_down_features /= longest_edge - mesh_static_features = BufferList( + mesh_static_features_out = BufferList( mesh_static_features, persistent=False ) + m2m_edge_index_out = m2m_edge_index + m2m_features_out = m2m_features else: # Extract single mesh level - m2m_edge_index = m2m_edge_index[0] - m2m_features = m2m_features[0] - mesh_static_features = mesh_static_features[0] + m2m_edge_index_out = m2m_edge_index[0] + m2m_features_out = m2m_features[0] + mesh_static_features_out = mesh_static_features[0] mesh_up_edge_index = BufferList([], persistent=False) mesh_down_edge_index = BufferList([], persistent=False) @@ -424,15 +433,15 @@ def loads_file(fn: str) -> Any: return hierarchical, { "g2m_edge_index": g2m_edge_index, "m2g_edge_index": m2g_edge_index, - "m2m_edge_index": m2m_edge_index, + "m2m_edge_index": m2m_edge_index_out, "mesh_up_edge_index": mesh_up_edge_index, "mesh_down_edge_index": mesh_down_edge_index, "g2m_features": g2m_features, "m2g_features": m2g_features, - "m2m_features": m2m_features, + "m2m_features": m2m_features_out, "mesh_up_features": mesh_up_features, "mesh_down_features": mesh_down_features, - "mesh_static_features": mesh_static_features, + "mesh_static_features": mesh_static_features_out, } @@ -458,7 +467,7 @@ def make_mlp(blueprint: list[int], layer_norm: bool = True) -> nn.Sequential: hidden_layers = len(blueprint) - 2 assert hidden_layers >= 0, "Invalid MLP blueprint" - layers = [] + layers: list[nn.Module] = [] for layer_i, (dim1, dim2) in enumerate(zip(blueprint[:-1], blueprint[1:])): layers.append(nn.Linear(dim1, dim2)) if layer_i != hidden_layers: @@ -616,8 +625,11 @@ def init_training_logger_metrics( @rank_zero_only def setup_training_logger( - datastore: Any, args: Any, run_name: str, run_dir: str -) -> Any: + datastore: "BaseDatastore", + args: argparse.Namespace, + run_name: str, + run_dir: str, +) -> pl.loggers.Logger: """ Set up the training logger (WandB or MLFlow). @@ -666,7 +678,7 @@ def setup_training_logger( return pl.loggers.WandbLogger( project=args.logger_project, name=None if args.wandb_id else run_name, - config=dict(training=vars(args), datastore=datastore._config), + config=dict(training=vars(args), datastore=datastore.config), resume=wandb_resume, id=args.wandb_id, save_dir=run_dir, @@ -689,7 +701,7 @@ def setup_training_logger( save_dir=run_dir, ) training_logger.log_hyperparams( - dict(training=vars(args), datastore=datastore._config) + dict(training=vars(args), datastore=datastore.config) ) return training_logger else: diff --git a/neural_lam/vis.py b/neural_lam/vis.py index 1e3dd415..326dfce3 100644 --- a/neural_lam/vis.py +++ b/neural_lam/vis.py @@ -2,7 +2,7 @@ # Standard library import warnings -from typing import Optional +from typing import Any # Third-party import cartopy.crs as ccrs @@ -16,6 +16,7 @@ import numpy as np import torch import xarray as xr +from cartopy.mpl.geoaxes import GeoAxes # Local from . import utils @@ -122,7 +123,7 @@ def _get_heatmap_var_labels(datastore: BaseRegularGridDatastore) -> list[str]: ] -def _to_heatmap_matrix(values) -> np.ndarray: +def _to_heatmap_matrix(values: Any) -> np.ndarray: """ Convert heatmap inputs to a ``(num_state_vars, pred_steps)`` matrix. @@ -228,7 +229,9 @@ def _get_heatmap_color_values( If ``normalization`` is not one of ``'state_std'`` or ``'diff_std'``. """ - def _per_var_fallback(): + def _per_var_fallback() -> ( + tuple[np.ndarray, str, matplotlib.colors.Colormap] + ): """ Normalize errors by per-variable maximum value. @@ -340,7 +343,7 @@ def _get_annotation_text_color( def plot_on_axis( - ax: matplotlib.axes.Axes, + ax: GeoAxes, da: xr.DataArray, datastore: BaseRegularGridDatastore, vmin: float | None = None, @@ -469,7 +472,7 @@ def plot_on_axis( def plot_error_heatmap( errors: torch.Tensor, datastore: BaseRegularGridDatastore, - title: Optional[str] = None, + title: str | None = None, normalization: str = "state_std", ) -> matplotlib.figure.Figure: """ @@ -546,7 +549,9 @@ def plot_error_heatmap( ) else: formatted_error = str(error) - text_color = _get_annotation_text_color(color_values_np[j, i], im) + text_color = _get_annotation_text_color( + float(color_values_np[j, i]), im + ) ax.text( i, j, @@ -586,7 +591,7 @@ def plot_error_heatmap( def plot_error_map( errors: torch.Tensor, datastore: BaseRegularGridDatastore, - title: Optional[str] = None, + title: str | None = None, ) -> matplotlib.figure.Figure: """ Deprecated: use :func:`plot_error_heatmap` instead. @@ -618,8 +623,8 @@ def plot_prediction( datastore: BaseRegularGridDatastore, da_prediction: xr.DataArray, da_target: xr.DataArray, - title: Optional[str] = None, - vrange: Optional[tuple[float, float]] = None, + title: str | None = None, + vrange: tuple[float, float] | None = None, boundary_alpha: float = 0.7, crop_to_interior: bool = True, colorbar_label: str = "", @@ -702,8 +707,8 @@ def plot_prediction( def plot_spatial_error( error: torch.Tensor, datastore: BaseRegularGridDatastore, - title: Optional[str] = None, - vrange: Optional[tuple[float, float]] = None, + title: str | None = None, + vrange: tuple[float, float] | None = None, boundary_alpha: float = 0.7, crop_to_interior: bool = True, colorbar_label: str = "", @@ -767,7 +772,7 @@ def plot_spatial_error( pad=0.02, ) cbar.ax.tick_params(labelsize=_TICK_SIZE) - cbar.formatter.set_powerlimits((-3, 3)) + cbar.formatter.set_powerlimits((-3, 3)) # type: ignore[attr-defined] if colorbar_label: cbar.set_label(_tex_safe(colorbar_label), size=_LABEL_SIZE) diff --git a/neural_lam/weather_dataset.py b/neural_lam/weather_dataset.py index 4168396a..93c13641 100644 --- a/neural_lam/weather_dataset.py +++ b/neural_lam/weather_dataset.py @@ -3,7 +3,7 @@ # Standard library import datetime import warnings -from typing import Iterator, Optional, Union +from typing import Iterator # Third-party import numpy as np @@ -70,16 +70,17 @@ def __init__( self.num_future_forcing_steps = num_future_forcing_steps self.load_single_member = load_single_member - self.da_state = self.datastore.get_dataarray( + da_state = self.datastore.get_dataarray( category="state", split=self.split ) - self.da_forcing = self.datastore.get_dataarray( - category="forcing", split=self.split - ) - if self.da_state is None: + if da_state is None: raise ValueError( "The datastore must provide state data for the WeatherDataset." ) + self.da_state = da_state + self.da_forcing = self.datastore.get_dataarray( + category="forcing", split=self.split + ) if self.datastore.is_ensemble and self.load_single_member: warnings.warn( @@ -465,7 +466,7 @@ def _build_item_dataarrays( def __getitem__( self, idx: int - ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, np.ndarray]: + ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]: """ Return a single training sample, which consists of the initial states, target states, forcing and batch times. @@ -533,7 +534,9 @@ def __getitem__( def __iter__( self, - ) -> Iterator[tuple[torch.Tensor, torch.Tensor, torch.Tensor, np.ndarray]]: + ) -> Iterator[ + tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor] + ]: """ Convenience method to iterate over the dataset. @@ -547,9 +550,9 @@ def __iter__( def create_dataarray_from_tensor( self, tensor: torch.Tensor, - time: Union[datetime.datetime, list[datetime.datetime]], + time: datetime.datetime | list[datetime.datetime] | np.ndarray, category: str, - ): + ) -> xr.DataArray: """ Construct a xarray.DataArray from a `pytorch.Tensor` with coordinates for `grid_index`, `time` and `{category}_feature` matching the shape @@ -580,7 +583,7 @@ def create_dataarray_from_tensor( The constructed DataArray. """ - def _is_listlike(obj): + def _is_listlike(obj: object) -> bool: """Return ``True`` for list/tuple/ndarray-like containers.""" return hasattr(obj, "__iter__") and not isinstance(obj, str) @@ -686,17 +689,17 @@ def __init__( self.load_single_member = load_single_member self.batch_size = batch_size self.num_workers: int = num_workers - self.train_dataset: Optional[WeatherDataset] = None - self.val_dataset: Optional[WeatherDataset] = None - self.test_dataset: Optional[WeatherDataset] = None - self.multiprocessing_context: Union[str, None] = None + self.train_dataset: WeatherDataset | None = None + self.val_dataset: WeatherDataset | None = None + self.test_dataset: WeatherDataset | None = None + self.multiprocessing_context: str | None = None self.eval_split = eval_split if num_workers > 0: # default to spawn for now, as the default on linux "fork" hangs # when using dask (which the npyfilesmeps datastore uses) self.multiprocessing_context = "spawn" - def setup(self, stage: Optional[str] = None) -> None: + def setup(self, stage: str | None = None) -> None: """ Instantiate datasets for the requested trainer stage. @@ -737,6 +740,7 @@ def setup(self, stage: Optional[str] = None) -> None: def train_dataloader(self) -> torch.utils.data.DataLoader: """Load train dataset.""" + assert self.train_dataset is not None return torch.utils.data.DataLoader( self.train_dataset, batch_size=self.batch_size, @@ -749,6 +753,7 @@ def train_dataloader(self) -> torch.utils.data.DataLoader: def val_dataloader(self) -> torch.utils.data.DataLoader: """Load validation dataset.""" + assert self.val_dataset is not None return torch.utils.data.DataLoader( self.val_dataset, batch_size=self.batch_size, @@ -761,6 +766,7 @@ def val_dataloader(self) -> torch.utils.data.DataLoader: def test_dataloader(self) -> torch.utils.data.DataLoader: """Load test dataset.""" + assert self.test_dataset is not None return torch.utils.data.DataLoader( self.test_dataset, batch_size=self.batch_size, diff --git a/pyproject.toml b/pyproject.toml index 113329e1..d748cf1a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,15 @@ gpu = ["torch>=2.12,<2.13"] # CUDA 13.0, default GPU build gpu-cu128 = ["torch>=2.11,<2.12"] # CUDA 12.8, last torch series with cu128 wheels [dependency-groups] -dev = ["pre-commit>=3.8.0", "pytest>=8.3.2", "pooch>=1.8.2"] +dev = [ + "pre-commit>=3.8.0", + "pytest>=8.3.2", + "pooch>=1.8.2", + "mypy>=2.1.0", + "types-pyyaml", + "types-pillow", + "types-tqdm", +] [tool.uv] # uv-specific configuration for PyTorch CPU/GPU variant selection. @@ -121,6 +129,13 @@ per-file-ignores = [ [tool.codespell] skip = "requirements/*" +[tool.mypy] +python_version = "3.10" +disallow_untyped_defs = true +disallow_incomplete_defs = true +ignore_missing_imports = true +exclude = ["^tests/", "^docs/", "^build/"] + # Pylint config [tool.pylint] ignore = [ diff --git a/uv.lock b/uv.lock index b9d5a7ed..4115acd3 100644 --- a/uv.lock +++ b/uv.lock @@ -2,27 +2,32 @@ version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version < '3.11' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version < '3.11' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version < '3.11' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version < '3.11' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -229,6 +234,46 @@ version = "0.3.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/6a/885bc91484e1aa8f618f6f0228d76d0e67000b0fdd6090673b777e311913/asciitree-0.3.3.tar.gz", hash = "sha256:4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e", size = 3951, upload-time = "2016-09-05T19:10:42.681Z" } +[[package]] +name = "ast-serialize" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", size = 1183520, upload-time = "2026-05-17T17:47:30.831Z" }, + { url = "https://files.pythonhosted.org/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", size = 1175779, upload-time = "2026-05-17T17:47:32.551Z" }, + { url = "https://files.pythonhosted.org/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", size = 1233750, upload-time = "2026-05-17T17:47:34.731Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", size = 1235942, upload-time = "2026-05-17T17:47:36.287Z" }, + { url = "https://files.pythonhosted.org/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", size = 1442517, upload-time = "2026-05-17T17:47:38.17Z" }, + { url = "https://files.pythonhosted.org/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", size = 1254081, upload-time = "2026-05-17T17:47:39.826Z" }, + { url = "https://files.pythonhosted.org/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", size = 1259910, upload-time = "2026-05-17T17:47:41.369Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", size = 1250678, upload-time = "2026-05-17T17:47:43.702Z" }, + { url = "https://files.pythonhosted.org/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", size = 1301603, upload-time = "2026-05-17T17:47:46.256Z" }, + { url = "https://files.pythonhosted.org/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", size = 1410332, upload-time = "2026-05-17T17:47:47.899Z" }, + { url = "https://files.pythonhosted.org/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", size = 1509979, upload-time = "2026-05-17T17:47:50.942Z" }, + { url = "https://files.pythonhosted.org/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", size = 1505002, upload-time = "2026-05-17T17:47:54.093Z" }, + { url = "https://files.pythonhosted.org/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", size = 1456231, upload-time = "2026-05-17T17:47:56.311Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", size = 1058668, upload-time = "2026-05-17T17:47:58.305Z" }, + { url = "https://files.pythonhosted.org/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", size = 1101075, upload-time = "2026-05-17T17:48:00.35Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", size = 1075347, upload-time = "2026-05-17T17:48:01.753Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, + { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, + { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, + { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, + { url = "https://files.pythonhosted.org/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, + { url = "https://files.pythonhosted.org/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, + { url = "https://files.pythonhosted.org/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", size = 1081181, upload-time = "2026-05-17T17:48:28.122Z" }, +] + [[package]] name = "astropy" version = "6.1.7" @@ -693,23 +738,28 @@ name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -857,7 +907,8 @@ name = "cuda-bindings" version = "12.9.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -895,7 +946,8 @@ name = "cuda-bindings" version = "13.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -938,7 +990,8 @@ name = "cuda-toolkit" version = "12.8.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -988,7 +1041,8 @@ name = "cuda-toolkit" version = "13.0.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -2036,6 +2090,91 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, ] +[[package]] +name = "librt" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", size = 200139, upload-time = "2026-05-10T18:17:25.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/10/37fd9e9ba96cb0bd742dfb20fc3d082e54bdbec759d7300df927f360ef07/librt-0.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e94ebfcfa2d5e9926d6c3b9aa4617ffc42a845b4321fb84021b872358c82a0f", size = 141706, upload-time = "2026-05-10T18:15:16.129Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/1b1466f358e4a0b728051f69bc27e67b432c6eaa2e05b88db49d3785ae0d/librt-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ae627397a2f351560440d872d6f7c8dbb4072e57868e7b2fc5b8b430fe489d45", size = 142605, upload-time = "2026-05-10T18:15:18.148Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/ed26dd2f6bc9a0baf48306433e579e8d354d70b2bcb78134ed950a5d0e1e/librt-0.11.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc329359321b67d24efdf4bc69012b0597001649544db662c001db5a0184794c", size = 476555, upload-time = "2026-05-10T18:15:19.569Z" }, + { url = "https://files.pythonhosted.org/packages/66/fe/11891191c0e0a3fd617724e891f6e67a71a7658974a892b9a9a97fdb2977/librt-0.11.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:7e82e642ab0f7608ce2fe53d76ca2280a9ee33a1b06556142c7c6fe80a86fc33", size = 468434, upload-time = "2026-05-10T18:15:20.87Z" }, + { url = "https://files.pythonhosted.org/packages/6f/50/5ec949d7f9ce1a07af903aa3e13abb98b717923bdead6e719b2f824ccc07/librt-0.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88145c15c67731d54283d135b03244028c750cc9edc334a96a4f5950ebdb2884", size = 496918, upload-time = "2026-05-10T18:15:22.616Z" }, + { url = "https://files.pythonhosted.org/packages/ea/c4/177336c7524e34875a38bf668e88b193a6723a4eb4045d07f74df6e1506c/librt-0.11.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d36a51b3d93320b686588e27123f4995804dbf1bce81df78c02fc3c6eea9280", size = 490334, upload-time = "2026-05-10T18:15:24.2Z" }, + { url = "https://files.pythonhosted.org/packages/13/1f/da3112f7569eda3b49f9a2629bae1fe059812b6085df16c885f6454dff49/librt-0.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3ac06a2a8b246327f11e186a53a100a4d5c7ed52346367e5ec751d51586c", size = 511287, upload-time = "2026-05-10T18:15:26.226Z" }, + { url = "https://files.pythonhosted.org/packages/fa/94/03fec301522e172d105581431223be56b27594ff46440ebfbb658a3735d5/librt-0.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:461bbceede621f1ffb8839755f8663e886087ee7af16294cab7fb4d782c62eeb", size = 517202, upload-time = "2026-05-10T18:15:27.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/6e/339f6e5a7b413ce014f1917a756dae630fe59cc99f34153205b1cb540901/librt-0.11.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0cad8a4d6a8ff03c9b76f9414caccd78e7cfbc8a2e12fa334d8e1d9932753783", size = 497517, upload-time = "2026-05-10T18:15:29.614Z" }, + { url = "https://files.pythonhosted.org/packages/cd/43/acdd5ce317cb46e8253ca9bfbdb8b12e68a24d745949336a7f3d5fb79ba0/librt-0.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f37aa505b3cf60701562eddb32df74b12a9e380c207fd8b06dd157a943ac7ea0", size = 538878, upload-time = "2026-05-10T18:15:30.928Z" }, + { url = "https://files.pythonhosted.org/packages/29/b5/7a25bb12e3172839f647f196b3e988318b7bb1ca7501732a225c4dce2ec0/librt-0.11.0-cp310-cp310-win32.whl", hash = "sha256:94663a21534637f0e787ec2a2a756022df6e5b7b2335a5cdd7d8e33d68a2af89", size = 100070, upload-time = "2026-05-10T18:15:32.551Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0d/ebbcf4d77999c02c937b05d2b90ff4cd4dcc7e9a365ba132329ac1fe7a0f/librt-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:dec7db73758c2b54953fd8b7fe348c45188fe26b39ee18446196edd08453a5d4", size = 117918, upload-time = "2026-05-10T18:15:33.678Z" }, + { url = "https://files.pythonhosted.org/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", size = 141092, upload-time = "2026-05-10T18:15:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", size = 142035, upload-time = "2026-05-10T18:15:36.242Z" }, + { url = "https://files.pythonhosted.org/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", size = 475022, upload-time = "2026-05-10T18:15:37.56Z" }, + { url = "https://files.pythonhosted.org/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", size = 467273, upload-time = "2026-05-10T18:15:39.182Z" }, + { url = "https://files.pythonhosted.org/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", size = 497083, upload-time = "2026-05-10T18:15:40.634Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", size = 489139, upload-time = "2026-05-10T18:15:41.934Z" }, + { url = "https://files.pythonhosted.org/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", size = 508442, upload-time = "2026-05-10T18:15:43.206Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", size = 514230, upload-time = "2026-05-10T18:15:44.761Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", size = 494231, upload-time = "2026-05-10T18:15:46.308Z" }, + { url = "https://files.pythonhosted.org/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", size = 537585, upload-time = "2026-05-10T18:15:47.629Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", size = 100509, upload-time = "2026-05-10T18:15:49.157Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", size = 118628, upload-time = "2026-05-10T18:15:50.345Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", size = 103122, upload-time = "2026-05-10T18:15:52.068Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", size = 144147, upload-time = "2026-05-10T18:15:53.227Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", size = 143614, upload-time = "2026-05-10T18:15:54.657Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", size = 485538, upload-time = "2026-05-10T18:15:56.117Z" }, + { url = "https://files.pythonhosted.org/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", size = 479623, upload-time = "2026-05-10T18:15:57.544Z" }, + { url = "https://files.pythonhosted.org/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", size = 513082, upload-time = "2026-05-10T18:15:58.805Z" }, + { url = "https://files.pythonhosted.org/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", size = 508105, upload-time = "2026-05-10T18:16:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", size = 522268, upload-time = "2026-05-10T18:16:01.708Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", size = 527348, upload-time = "2026-05-10T18:16:03.496Z" }, + { url = "https://files.pythonhosted.org/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", size = 516294, upload-time = "2026-05-10T18:16:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", size = 553608, upload-time = "2026-05-10T18:16:06.839Z" }, + { url = "https://files.pythonhosted.org/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", size = 101879, upload-time = "2026-05-10T18:16:08.103Z" }, + { url = "https://files.pythonhosted.org/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", size = 119831, upload-time = "2026-05-10T18:16:09.174Z" }, + { url = "https://files.pythonhosted.org/packages/59/67/a6739ac96e28b7855808bdb0370e250606104a859750d209e5a0716fe7ab/librt-0.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f10cf143e4a9bb0f4f5af568a00df94a2d69ef41c2579584454bb0fe5cc642c", size = 103470, upload-time = "2026-05-10T18:16:10.369Z" }, + { url = "https://files.pythonhosted.org/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", size = 144119, upload-time = "2026-05-10T18:16:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", size = 143565, upload-time = "2026-05-10T18:16:13.334Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", size = 485395, upload-time = "2026-05-10T18:16:14.729Z" }, + { url = "https://files.pythonhosted.org/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", size = 479383, upload-time = "2026-05-10T18:16:16.321Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", size = 513010, upload-time = "2026-05-10T18:16:17.647Z" }, + { url = "https://files.pythonhosted.org/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", size = 508433, upload-time = "2026-05-10T18:16:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", size = 522595, upload-time = "2026-05-10T18:16:20.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", size = 527255, upload-time = "2026-05-10T18:16:22.352Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", size = 516847, upload-time = "2026-05-10T18:16:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", size = 553920, upload-time = "2026-05-10T18:16:25.025Z" }, + { url = "https://files.pythonhosted.org/packages/9c/21/623f8ca230857102066d9ca8c6c1734995908c4d0d1bee7bb2ef0021cb33/librt-0.11.0-cp313-cp313-win32.whl", hash = "sha256:78fddc31cd4d3caa897ad5d31f856b1faadc9474021ad6cb182b9018793e254e", size = 101898, upload-time = "2026-05-10T18:16:26.649Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/b4ebd44dd723f768469007515cb92251e0ae286c94c140f374801140fa74/librt-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ca8aa88751a775870b764e93bad5135385f563cb8dcee399abf034ea4d3cb47", size = 119812, upload-time = "2026-05-10T18:16:27.859Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e4/b2f4ca7965ca373b491cdb4bc25cdb30c1649ca81a8782056a83850292a9/librt-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:96f044bb325fd9cf1a723015638c219e9143f0dfbc0ca54c565df2b7fc748b44", size = 103448, upload-time = "2026-05-10T18:16:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/29/eb/dbce197da4e227779e56b5735f2decc3eb36e55a1cdbf1bd65d6639d76c1/librt-0.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4a017a95e5837dc15a8c5661d60e05daa96b90908b1aa6b7acdf443cd25c8ebd", size = 143345, upload-time = "2026-05-10T18:16:30.674Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/254bebd0c11c8ba684018efb8006ff22e466abce445215cca6c778e7d9de/librt-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b1ecbd9819deccc39b7542bf4d2a740d8a620694d39989e58661d3763458f8d4", size = 143131, upload-time = "2026-05-10T18:16:32.037Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3f/f77d6122d21ac7bf6ae8a7dfced1bd2a7ac545d3273ebdcaf8042f6d619f/librt-0.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da327dacd7be8f8ec36547373550744a3cc0e536d54665cd83f8bcd961200e8", size = 477024, upload-time = "2026-05-10T18:16:33.493Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0a/2c996dadebaa7d9bbbd43ef2d4f3e66b6da545f838a41694ef6172cebec8/librt-0.11.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0dc56b1f8d06e60db362cc3fdae206681817f86ce4725d34511473487f12a34b", size = 474221, upload-time = "2026-05-10T18:16:34.864Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7e/f5d92af8486b8272c23b3e686b46ff72d89c8169585eb61eef01a2ac7147/librt-0.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb8fb2ab90e21c8d12ea240d744ad514da9baf381ebfa70d91d20d21713175", size = 505174, upload-time = "2026-05-10T18:16:36.705Z" }, + { url = "https://files.pythonhosted.org/packages/af/1a/cb0734fe86398eb33193ab753b7326255c74cac5eb09e76b9b16536e7adb/librt-0.11.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae74872be221df4374d10fec61f93ed1513b9546ea84f2c0bf73ab3e9bd0b03", size = 497216, upload-time = "2026-05-10T18:16:38.418Z" }, + { url = "https://files.pythonhosted.org/packages/18/06/094820f91558b66e29943c0ec41c9914f460f48dd51fc503c3101e10842d/librt-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32bcc918c0148eb7e3d57385125bac7e5f9e4359d05f07448b09f6f778c2f31c", size = 513921, upload-time = "2026-05-10T18:16:39.848Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c2/00de9018871a282f530cacb457d5ec0428f6ac7e6fedde9aff7468d9fb04/librt-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f9743fc99135d5f78d2454435615f6dec0473ca507c26ce9d92b10b562a280d3", size = 520850, upload-time = "2026-05-10T18:16:41.471Z" }, + { url = "https://files.pythonhosted.org/packages/51/9d/64631832348fd1834fb3a61b996434edddaaf25a31d03b0a76273159d2cf/librt-0.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5ba067f4aadae8fda802d91d2124c90c42195ff32d9161d3549e6d05cfe26f96", size = 504237, upload-time = "2026-05-10T18:16:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ec/ae5525eb16edc827a044e7bb8777a455ff95d4bca9379e7e6bddd7383647/librt-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:de3bf945454d032f9e390b85c4072e0a0570bf825421c8be0e71209fa65e1abe", size = 546261, upload-time = "2026-05-10T18:16:44.408Z" }, + { url = "https://files.pythonhosted.org/packages/5a/09/adce371f27ca039411da9659f7430fcc2ba6cd0c7b3e4467a0f091be7fa9/librt-0.11.0-cp314-cp314-win32.whl", hash = "sha256:d2277a05f6dcb9fd13db9566aac4fabd68c3ea1ea46ee5567d4eef8efa495a2f", size = 96965, upload-time = "2026-05-10T18:16:46.039Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ee/8ac720d98548f173c7ce2e632a7ca94673f74cacd5c8162a84af5b35958a/librt-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ab73e8db5e3f564d812c1f5c3a175930a5f9bc96ccb5e3b22a34d7858b401cf7", size = 115151, upload-time = "2026-05-10T18:16:47.133Z" }, + { url = "https://files.pythonhosted.org/packages/94/20/c900cf14efeb09b6bef2b2dff20779f73464b97fd58d1c6bccc379588ae3/librt-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aea3caa317752e3a466fa8af45d91ee0ea8c7fdd96e42b0a8dd9b76a7931eba1", size = 98850, upload-time = "2026-05-10T18:16:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/0c/71/944bfe4b64e12abffcd3c15e1cce07f72f3d55655083786285f4dedeb532/librt-0.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d1b36540d7aaf9b9101b3a6f376c8d8e9f7a9aec93ed05918f2c69d493ffef72", size = 151138, upload-time = "2026-05-10T18:16:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/b6/10/99e64a5c86989357fda078c8143c533389585f6473b7439172dd8f3b3b2d/librt-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efbb343ab2ce3540f4ecbe6315d677ed70f37cd9a72b1e58066c918ca83acbaa", size = 151976, upload-time = "2026-05-10T18:16:51.062Z" }, + { url = "https://files.pythonhosted.org/packages/21/31/5072ad880946d83e5ea4147d6d018c78eefce85b77819b19bdd0ee229435/librt-0.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0dd688aab3f7914d3e6e5e3554978e0383312fb8e771d84be008a35b9ee548", size = 557927, upload-time = "2026-05-10T18:16:52.632Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8d/70b5fb7cfbab60edbe7381614ab985da58e144fbf465c86d44c95f43cdca/librt-0.11.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f5fb36b8c6c63fdcbb1d526d94c0d1331610d43f4118cc1beb4efef4f3faacb2", size = 539698, upload-time = "2026-05-10T18:16:53.934Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a3/ba3495a0b3edbd24a4cae0d1d3c64f39a9fc45d06e812101289b50c1a619/librt-0.11.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a9a237d13addb93715b6fee74023d5ee3469b53fce527626c0e088aa585805f", size = 577162, upload-time = "2026-05-10T18:16:55.589Z" }, + { url = "https://files.pythonhosted.org/packages/f7/db/36e25fb81f99937ff1b96612a1dc9fd66f039cb9cc3aee12c01fac31aab9/librt-0.11.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ddd17bd87b2c56ddd60e546a7984a2e64c4e8eab92fb4cf3830a48ad5469d51", size = 566494, upload-time = "2026-05-10T18:16:56.975Z" }, + { url = "https://files.pythonhosted.org/packages/33/0d/3f622b47f0b013eeb9cf4cc07ae9bfe378d832a4eec998b2b209fe84244d/librt-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd43992b4473d42f12ff9e68326079f0696d9d4e6000e8f39a0238d482ba6ee2", size = 596858, upload-time = "2026-05-10T18:16:58.374Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/71b90bc93039c46a2000651f6ad60122b114c8f54c4ad306e0e96f5b75ad/librt-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f8e3e8056dd674e279741485e2e512d6e9a751c7455809d0114e6ebf8d781085", size = 590318, upload-time = "2026-05-10T18:16:59.676Z" }, + { url = "https://files.pythonhosted.org/packages/04/04/418cb3f75621e2b761fb1ab0f017f4d70a1a72a6e7c74ee4f7e8d198c2f3/librt-0.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c1f708d8ae9c56cf38a903c44297243d2ec83fd82b396b977e0144a3e76217e3", size = 575115, upload-time = "2026-05-10T18:17:01.007Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2c/5a2183ac58dd911f26b5d7e7d7d8f1d87fcecdddd99d6c12169a258ff62c/librt-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0add982e0e7b9fc14cf4b33789d5f13f66581889b88c2f58099f6ce8f92617bd", size = 617918, upload-time = "2026-05-10T18:17:02.682Z" }, + { url = "https://files.pythonhosted.org/packages/15/1f/dc6771a52592a4451be6effa200cbfc9cec61e4393d3033d81a9d307961d/librt-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:2b481d846ac894c4e8403c5fd0e87c5d11d6499e404b474602508a224ff531c8", size = 103562, upload-time = "2026-05-10T18:17:03.99Z" }, + { url = "https://files.pythonhosted.org/packages/62/4a/7d1415567027286a75ba1093ec4aca11f073e0f559c530cf3e0a757ad55c/librt-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:28edb433edde181112a908c78907af28f964eabc15f4dd16c9d66c834302677c", size = 124327, upload-time = "2026-05-10T18:17:05.465Z" }, + { url = "https://files.pythonhosted.org/packages/ce/62/b40b382fa0c66fee1478073eb8db352a4a6beda4a1adccf1df911d8c289c/librt-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dee008f20b542e3cd162ba338a7f9ec0f6d23d395f66fe8aeeec3c9d067ea253", size = 102572, upload-time = "2026-05-10T18:17:06.809Z" }, +] + [[package]] name = "lightning-utilities" version = "0.15.3" @@ -2524,6 +2663,74 @@ wheels = [ { 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 = "mypy" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ast-serialize" }, + { name = "librt", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "mypy-extensions" }, + { name = "pathspec" }, + { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", size = 3898359, upload-time = "2026-05-11T18:37:36.237Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/71/d351dca3e9b30da2328ee9d445c88b8388072808ebfbc49eb69d30b67749/mypy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11a6beb180257a805961aea9ec591bbd0bd17f1e18d35b8456d57aee5bedfedc", size = 14778792, upload-time = "2026-05-11T18:36:23.605Z" }, + { url = "https://files.pythonhosted.org/packages/2f/45/7d51594b644c17c0bcf74ed8cd5fc33b324276d708e8506f220b70dab9d9/mypy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ef78c1d306bbf9a8a12f526c44902c9c28dffd6c52c52bf6a72641ce18d3849", size = 13645739, upload-time = "2026-05-11T18:37:22.752Z" }, + { url = "https://files.pythonhosted.org/packages/65/01/455c31b170e9468265074840bf18863a8482a24103fdaabe4e199392aa5f/mypy-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c209a90853081ff01d01ee895cafe10f7db1474e0d95beaeef0f6c1db9119bbd", size = 14074199, upload-time = "2026-05-11T18:35:09.292Z" }, + { url = "https://files.pythonhosted.org/packages/41/5a/93093f0b29a9e982deafde698f740a2eb2e05886e79ccf0594c7fd5413a3/mypy-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47cebf61abde7c088a4e27718a8b13a81655686b2e9c251f5c0915a802248166", size = 14953128, upload-time = "2026-05-11T18:31:57.678Z" }, + { url = "https://files.pythonhosted.org/packages/7f/2f/a196f5331d96170ad3d28f144d2aba690d4b2911381f68d51e489c7ab82a/mypy-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d57a90ae5e872138a425ec328edbc9b235d1934c4377881a33ec05b341acc9a8", size = 15249378, upload-time = "2026-05-11T18:33:00.101Z" }, + { url = "https://files.pythonhosted.org/packages/54/de/94d321cc12da9f71341ac0c270efbed5c725750c7b4c334d957de9a087d9/mypy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:aea7f7a8a55b459c34275fc468ada6ca7c173a5e43a68f5dbe588a563d8a06b8", size = 11060994, upload-time = "2026-05-11T18:33:18.848Z" }, + { url = "https://files.pythonhosted.org/packages/e1/62/0c27ca55219a7c764a7fb88c7bb2b7b2f9780ade8bbf16bc8ed8400eef6b/mypy-2.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c989640253f0d76843e9c6c1bbf4bd48c5e85ada61bde4beb37cb3eca035685e", size = 9976743, upload-time = "2026-05-11T18:31:25.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", size = 14691685, upload-time = "2026-05-11T18:33:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", size = 13555165, upload-time = "2026-05-11T18:32:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", size = 13994376, upload-time = "2026-05-11T18:32:39.256Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", size = 14864618, upload-time = "2026-05-11T18:34:49.765Z" }, + { url = "https://files.pythonhosted.org/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", size = 15102063, upload-time = "2026-05-11T18:34:05.855Z" }, + { url = "https://files.pythonhosted.org/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", size = 11060564, upload-time = "2026-05-11T18:35:36.494Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", size = 9966983, upload-time = "2026-05-11T18:37:14.139Z" }, + { url = "https://files.pythonhosted.org/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", size = 14874381, upload-time = "2026-05-11T18:37:31.784Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", size = 13665501, upload-time = "2026-05-11T18:34:23.063Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", size = 14045750, upload-time = "2026-05-11T18:31:48.151Z" }, + { url = "https://files.pythonhosted.org/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", size = 15061630, upload-time = "2026-05-11T18:37:06.898Z" }, + { url = "https://files.pythonhosted.org/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", size = 15288831, upload-time = "2026-05-11T18:31:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", size = 11135228, upload-time = "2026-05-11T18:34:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/24/0a/6a12b9782ca0831a553192f351679f4548abc9d19a7cc93bb7feb02084c7/mypy-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:98ebb6589bb3b6d0c6f0c459d53ca55b8091fbc13d277c4041c885392e8195e8", size = 10040684, upload-time = "2026-05-11T18:36:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", size = 14852174, upload-time = "2026-05-11T18:31:38.929Z" }, + { url = "https://files.pythonhosted.org/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", size = 13651542, upload-time = "2026-05-11T18:36:04.636Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", size = 14033929, upload-time = "2026-05-11T18:35:55.742Z" }, + { url = "https://files.pythonhosted.org/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", size = 15039200, upload-time = "2026-05-11T18:33:10.281Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", size = 15272690, upload-time = "2026-05-11T18:32:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d7/9e90d2cf47100bea550ed2bc7b0d4de3a62181d84d5e37da0003e8462637/mypy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:767fe8c66dc3e01e19e1737d4c38ebefead16125e1b8e58ad421903b376f5c65", size = 11147435, upload-time = "2026-05-11T18:33:56.477Z" }, + { url = "https://files.pythonhosted.org/packages/ec/46/e5c449e858798e35ffc90946282a27c62a77be743fe17480e4977374eb91/mypy-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ecfe70d43775ab99562ab128ce49854a362044c9f894961f68f898c23cb7429d", size = 10035052, upload-time = "2026-05-11T18:32:30.049Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ca/b279a672e874aedd5498ae25f722dacc8aa86bbffb939b3f97cbb1cf6686/mypy-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7354c5a7f69d9345c3d6e69921d57088eea3ddeeb6b20d34c1b3855b02c36ec2", size = 14848422, upload-time = "2026-05-11T18:35:45.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/e6/3efe56c631d959b9b4454e208b0ac4b7f4f58b404c89f8bec7b49efdfc21/mypy-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:49890d4f76ac9e06ec117f9e09f3174da70a620a0c300953d8595c926e80947f", size = 13677374, upload-time = "2026-05-11T18:36:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/84/7f/8107ea87a44fd1f1b59882442f033c9c3488c127201b1d1d15f1cbd6022e/mypy-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:761be68e023ef5d94678772396a8af1220030f80837a3afd8d0aef3b419666f4", size = 14055743, upload-time = "2026-05-11T18:35:18.361Z" }, + { url = "https://files.pythonhosted.org/packages/51/4d/b6d34db183133b83761b9199a82d31557cdbb70a380d8c3b3438e11882a3/mypy-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c90345fc182dc363b891350457ec69c35140858538f38b4540845afcc32b1aef", size = 15020937, upload-time = "2026-05-11T18:34:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d7/f08360c691d758acb02f45022c34d98b92892f4ea756644e1000d4b9f3d8/mypy-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b84802e7b5a6daf1f5e15bc9fcd7ddae77be13981ffab037f1c67bb84d67d135", size = 15253371, upload-time = "2026-05-11T18:36:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/67/1b/09460a13719530a19bce27bd3bc8449e83569dd2ba7faf51c9c3c30c0b61/mypy-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:022c771234936ceac541ebaf836fe9e2abeb3f5e09aff21588fe543ff006fe21", size = 11326429, upload-time = "2026-05-11T18:34:13.526Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/75dbf0f82f7b6680340efc614af29dd0b3c17b8a4f1cd09b8bd2fd6bc814/mypy-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:498207db725cec88829a6a5c2fc771205fd043719ef98bc49aba8fb9fc4e6d57", size = 10218799, upload-time = "2026-05-11T18:32:23.491Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/caca04ed7d972fb6eb6dd1ccd6df1de5c38fae8c5b3dc1c4e8e0d85ee6b9/mypy-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d5e5cad0efeba72b93cd17490cc0d69c5ac9ca132994fe3fb0314808aeeb83e", size = 15923458, upload-time = "2026-05-11T18:35:28.64Z" }, + { url = "https://files.pythonhosted.org/packages/ed/52/2d90cbe49d014b13ed7ff337930c30bad35893fe38a1e4641e756bb62191/mypy-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff715050c127d724fd260a2e666e7747fdd83511c0c47d449d98238970aef780", size = 14757697, upload-time = "2026-05-11T18:36:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/ac/37/d98f4a14e081b238992d0ed96b6d39c7cc0148c9699eb71eaa68629665ea/mypy-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82208da9e09414d520e912d3e462d454854bed0810b71540bb016dcbca7308fd", size = 15405638, upload-time = "2026-05-11T18:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c2/15c46613b24a84fad2aea1248bf9619b99c2767ae9071fe224c179a0b7d4/mypy-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e79ebc1b904b84f0310dff7469655a9c36c7a68bddb37bdd42b67a332df61d08", size = 16215852, upload-time = "2026-05-11T18:32:50.296Z" }, + { url = "https://files.pythonhosted.org/packages/5c/90/9c16a57f482c76d25f6379762b56bbf65c711d8158cf271fb2802cfb0640/mypy-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e583edc957cfb0deb142079162ae826f58449b116c1d442f2d91c69d9fced081", size = 16452695, upload-time = "2026-05-11T18:33:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4c/215a4eeb63cacc5f17f516691ea7285d11e249802b942476bff15922a314/mypy-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b33b6cd332695bba180d55e717a79d3038e479a2c49cc5eb3d53603409b9a5d7", size = 12866622, upload-time = "2026-05-11T18:34:39.945Z" }, + { url = "https://files.pythonhosted.org/packages/4b/50/1043e1db5f455ffe4c9ab22747cd8ca2bc492b1e4f4e21b130a44ee2b217/mypy-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4f910fe825376a7b66ef7ca8c98e5a149e8cd64c19ae71d84047a74ee060d4e6", size = 10610798, upload-time = "2026-05-11T18:36:31.444Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", size = 2693302, upload-time = "2026-05-11T18:31:29.246Z" }, +] + +[[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 = "narwhals" version = "2.18.1" @@ -2554,23 +2761,28 @@ name = "networkx" version = "3.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -2605,9 +2817,9 @@ dependencies = [ { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "shapely" }, { name = "torch", version = "2.11.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "(extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "torch", version = "2.12.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "torch", version = "2.12.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "torch", version = "2.12.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128')" }, - { name = "torch", version = "2.12.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "torch", version = "2.12.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "torch", version = "2.12.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "extra == 'extra-10-neural-lam-gpu' or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "torch-geometric" }, { name = "tueplots" }, @@ -2616,8 +2828,8 @@ dependencies = [ [package.optional-dependencies] cpu = [ - { name = "torch", version = "2.12.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "torch", version = "2.12.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "torch", version = "2.12.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "torch", version = "2.12.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, ] gpu = [ { name = "torch", version = "2.12.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" } }, @@ -2628,9 +2840,13 @@ gpu-cu128 = [ [package.dev-dependencies] dev = [ + { name = "mypy" }, { name = "pooch" }, { name = "pre-commit" }, { name = "pytest" }, + { name = "types-pillow" }, + { name = "types-pyyaml" }, + { name = "types-tqdm" }, ] [package.metadata] @@ -2663,9 +2879,13 @@ provides-extras = ["cpu", "gpu", "gpu-cu128"] [package.metadata.requires-dev] dev = [ + { name = "mypy", specifier = ">=2.1.0" }, { name = "pooch", specifier = ">=1.8.2" }, { name = "pre-commit", specifier = ">=3.8.0" }, { name = "pytest", specifier = ">=8.3.2" }, + { name = "types-pillow" }, + { name = "types-pyyaml" }, + { name = "types-tqdm" }, ] [[package]] @@ -2716,23 +2936,28 @@ name = "numcodecs" version = "0.16.5" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -2839,23 +3064,28 @@ name = "numpy" version = "2.4.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -3432,6 +3662,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905, upload-time = "2024-05-06T19:51:39.271Z" }, ] +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + [[package]] name = "pillow" version = "12.1.1" @@ -4083,23 +4322,28 @@ name = "pyproj" version = "3.7.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -4236,9 +4480,9 @@ dependencies = [ { name = "packaging" }, { name = "pyyaml" }, { name = "torch", version = "2.11.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "(extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "torch", version = "2.12.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "torch", version = "2.12.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "torch", version = "2.12.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128')" }, - { name = "torch", version = "2.12.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "torch", version = "2.12.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "torch", version = "2.12.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "extra == 'extra-10-neural-lam-gpu' or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "torchmetrics" }, { name = "tqdm" }, @@ -4453,23 +4697,28 @@ name = "scikit-learn" version = "1.8.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -4588,23 +4837,28 @@ name = "scipy" version = "1.17.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -4854,23 +5108,28 @@ name = "spherical-geometry" version = "1.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -5083,7 +5342,8 @@ name = "torch" version = "2.11.0+cu128" source = { registry = "https://download.pytorch.org/whl/cu128" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -5135,21 +5395,21 @@ name = "torch" version = "2.12.0" source = { registry = "https://download.pytorch.org/whl/cpu" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'darwin'", + "python_full_version == '3.14.*' and sys_platform == 'darwin'", "python_full_version == '3.13.*' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and sys_platform == 'darwin'", "python_full_version < '3.11' and sys_platform == 'darwin'", ] dependencies = [ - { name = "filelock", marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "fsspec", marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "jinja2", marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "filelock", marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "fsspec", marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "jinja2", marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "setuptools", marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "sympy", marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "typing-extensions", marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "setuptools", marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "sympy", marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "typing-extensions", marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, ] wheels = [ { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.12.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1834bd984f8a2f4f16bdfbeecca9146184b220aa46276bf5756735b5dae12812", upload-time = "2026-05-12T16:20:02Z" }, @@ -5166,7 +5426,8 @@ name = "torch" version = "2.12.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -5226,21 +5487,23 @@ name = "torch" version = "2.12.0+cpu" source = { registry = "https://download.pytorch.org/whl/cpu" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform != 'darwin'", + "python_full_version >= '3.15' and sys_platform != 'darwin'", + "python_full_version == '3.14.*' and sys_platform != 'darwin'", "python_full_version == '3.13.*' and sys_platform != 'darwin'", "python_full_version == '3.12.*' and sys_platform != 'darwin'", "python_full_version == '3.11.*' and sys_platform != 'darwin'", + "python_full_version >= '3.15' and sys_platform == 'darwin'", "python_full_version < '3.11' and sys_platform != 'darwin'", ] dependencies = [ - { name = "filelock", marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "fsspec", marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "jinja2", marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "filelock", marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "fsspec", marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "jinja2", marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.11' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "setuptools", marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "sympy", marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "typing-extensions", marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "setuptools", marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "sympy", marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "typing-extensions", marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, ] wheels = [ { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.12.0%2Bcpu-cp310-cp310-linux_s390x.whl", hash = "sha256:0e04beb2ab285bdcc5bb15d9cf7b2a757cf0d9422092fa5747de946359e1b409", upload-time = "2026-05-12T23:15:34Z" }, @@ -5281,7 +5544,8 @@ name = "torch" version = "2.12.0+cu130" source = { registry = "https://download.pytorch.org/whl/cu130" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -5358,9 +5622,9 @@ dependencies = [ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "packaging" }, { name = "torch", version = "2.11.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "(extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, - { name = "torch", version = "2.12.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "torch", version = "2.12.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(python_full_version < '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "torch", version = "2.12.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128')" }, - { name = "torch", version = "2.12.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, + { name = "torch", version = "2.12.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(python_full_version >= '3.15' and extra == 'extra-10-neural-lam-cpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (python_full_version < '3.15' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu') or (sys_platform != 'darwin' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128') or (extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, { name = "torch", version = "2.12.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "extra == 'extra-10-neural-lam-gpu' or (extra == 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu-cu128')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/81/34/39b8b749333db56c0585d7a11fa62a283c087bb1dfc897d69fb8cedbefb1/torchmetrics-1.9.0.tar.gz", hash = "sha256:a488609948600df52d3db4fcdab02e62aab2a85ef34da67037dc3e65b8512faa", size = 581765, upload-time = "2026-03-09T17:41:22.443Z" } @@ -5385,7 +5649,8 @@ name = "triton" version = "3.6.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -5413,7 +5678,8 @@ name = "triton" version = "3.7.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14'", + "python_full_version >= '3.15'", + "python_full_version == '3.14.*'", "python_full_version == '3.13.*'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", @@ -5449,6 +5715,48 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/5b/dc9e79200e7e5b4795a242b777729ccf8687be9025c14bca403a6182e2c2/tueplots-0.2.4-py3-none-any.whl", hash = "sha256:aafe4ff0727ab127f2665488d070fd2df3fb3dff876c8cf3cfe6091d144744aa", size = 18016, upload-time = "2026-03-24T08:34:42.267Z" }, ] +[[package]] +name = "types-pillow" +version = "10.2.0.20240822" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/4a/4495264dddaa600d65d68bcedb64dcccf9d9da61adff51f7d2ffd8e4c9ce/types-Pillow-10.2.0.20240822.tar.gz", hash = "sha256:559fb52a2ef991c326e4a0d20accb3bb63a7ba8d40eb493e0ecb0310ba52f0d3", size = 35389, upload-time = "2024-08-22T02:32:48.15Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/23/e81a5354859831fcf54d488d33b80ba6133ea84f874a9c0ec40a4881e133/types_Pillow-10.2.0.20240822-py3-none-any.whl", hash = "sha256:d9dab025aba07aeb12fd50a6799d4eac52a9603488eca09d7662543983f16c5d", size = 54354, upload-time = "2024-08-22T02:32:46.664Z" }, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.20260518" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/83/4a1afc3fbfcf5b8d46fc390cd95ed6b0dc9010a265f4e9f46314efffa37a/types_pyyaml-6.0.12.20260518.tar.gz", hash = "sha256:d917f83fb38462550338c1297faedd860b3ec83912b96b1e3d73255f7473e466", size = 17850, upload-time = "2026-05-18T06:01:58.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/a2/c01db32be2ae7d6a1689972f3c492b149ee4e164b12fdfd9f64b50888215/types_pyyaml-6.0.12.20260518-py3-none-any.whl", hash = "sha256:d2150f75a231c9fe9c7463bd29487d93e60bac90400287351384bc2284eba7cd", size = 20312, upload-time = "2026-05-18T06:01:57.368Z" }, +] + +[[package]] +name = "types-requests" +version = "2.33.0.20260518" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/01/c5a19253fe1ac159159ddf9a3a07cec8bb5e486ec4d9002ad2821da0e5d2/types_requests-2.33.0.20260518.tar.gz", hash = "sha256:df7bd3bfe0ca8402dfb841e7d9be714bb5578203283d66d7dc4ef69343449a5e", size = 24752, upload-time = "2026-05-18T06:07:37.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/bc/b139710a3b6018f7fb2b9508b35c8af564e61bf2bf4fa619d088f3e16f85/types_requests-2.33.0.20260518-py3-none-any.whl", hash = "sha256:626d697d1adaaff76e2044dc8c5c051d8f21abc157bdfe204a75558076fe0bf0", size = 21391, upload-time = "2026-05-18T06:07:37.044Z" }, +] + +[[package]] +name = "types-tqdm" +version = "4.68.0.20260608" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "types-requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/e0/3facccb1ff69970c73fca7a8028286c233d4c1312c475a65fb3d896f56d9/types_tqdm-4.68.0.20260608.tar.gz", hash = "sha256:e1dfddf8770fbc30ecaf95ae57c286397831235064308f7dfc2b1d6684a76107", size = 18470, upload-time = "2026-06-08T06:26:06.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/e8/61d95bfd49d1609fb8e8c5e06f4a094183411988a6f448873f5de6602499/types_tqdm-4.68.0.20260608-py3-none-any.whl", hash = "sha256:450a6e7e9e9b604928968927c414b32970e40091213c4180e1ed470905b13eff", size = 24858, upload-time = "2026-06-08T06:26:05.741Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -5612,23 +5920,28 @@ name = "xarray" version = "2026.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", @@ -5810,23 +6123,28 @@ name = "zarr" version = "3.1.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra == 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra == 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform != 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and sys_platform == 'darwin' and extra == 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", - "python_full_version >= '3.14' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version >= '3.15' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", + "python_full_version == '3.14.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.13.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.12.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'", "python_full_version == '3.11.*' and extra != 'extra-10-neural-lam-cpu' and extra != 'extra-10-neural-lam-gpu' and extra != 'extra-10-neural-lam-gpu-cu128'",