From c595976ba62cbbd1df27b3dd34768279d669e431 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Tue, 23 Jun 2026 11:36:12 +0100 Subject: [PATCH 01/30] Integrate all estimators into estiMINT Single consolidated data source, two model folders, bednet->dn0 ported from minte. Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 6 + README.md | 61 ++- datasets/README.md | 14 + datasets/estimint_simulations_y9.parquet | Bin 0 -> 605004 bytes models/consolidate.py | 72 ++++ models/hbr/README.md | 17 + models/hbr/metrics/eir_OOF_metrics_K10CV.csv | 3 + models/hbr/metrics/eir_test_metrics.csv | 2 + models/hbr/metrics/hbr_OOF_metrics_K10CV.csv | 3 + models/hbr/metrics/hbr_test_metrics.csv | 2 + models/hbr/prepare.py | 36 ++ {scripts => models/hbr}/train_eir_to_hbr.py | 82 +--- .../hbr/train_hbr_to_eir.py | 93 +--- models/prevalence/README.md | 13 + .../metrics/eir_OOF_metrics_K10CV.csv | 3 + .../prevalence/metrics/eir_test_metrics.csv | 2 + models/prevalence/prepare.py | 28 ++ .../prevalence/train.py | 102 +---- pyproject.toml | 2 +- requirements.txt | 2 + scripts/prepare_eir_to_hbr_data.py | 60 --- scripts/prepare_hbr_data.py | 136 ------ scripts/prepare_mint_data.py | 95 ---- src/estimint/__init__.py | 8 +- src/estimint/bednet.py | 79 ++++ src/estimint/data/itn_dn0.csv | 405 ++++++++++++++++++ 26 files changed, 793 insertions(+), 533 deletions(-) create mode 100644 datasets/README.md create mode 100644 datasets/estimint_simulations_y9.parquet create mode 100644 models/consolidate.py create mode 100644 models/hbr/README.md create mode 100644 models/hbr/metrics/eir_OOF_metrics_K10CV.csv create mode 100644 models/hbr/metrics/eir_test_metrics.csv create mode 100644 models/hbr/metrics/hbr_OOF_metrics_K10CV.csv create mode 100644 models/hbr/metrics/hbr_test_metrics.csv create mode 100644 models/hbr/prepare.py rename {scripts => models/hbr}/train_eir_to_hbr.py (76%) rename scripts/train_on_hbr_data.py => models/hbr/train_hbr_to_eir.py (72%) create mode 100644 models/prevalence/README.md create mode 100644 models/prevalence/metrics/eir_OOF_metrics_K10CV.csv create mode 100644 models/prevalence/metrics/eir_test_metrics.csv create mode 100644 models/prevalence/prepare.py rename scripts/train_on_mint_data.py => models/prevalence/train.py (71%) delete mode 100644 scripts/prepare_eir_to_hbr_data.py delete mode 100644 scripts/prepare_hbr_data.py delete mode 100644 scripts/prepare_mint_data.py create mode 100644 src/estimint/bednet.py create mode 100644 src/estimint/data/itn_dn0.csv diff --git a/.gitignore b/.gitignore index 2f8e46e..a47f00b 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,9 @@ uv.lock # Training outputs output/ scripts/output/ + +# Model training artifacts (regenerable; shipped copies live in src/estimint/data/) +models/**/*.parquet +models/**/*.pkl +models/**/*.model +models/**/plots/ diff --git a/README.md b/README.md index a0b2a1c..3be6309 100644 --- a/README.md +++ b/README.md @@ -28,26 +28,32 @@ pip install -r requirements.txt | `storage.R` | `storage.py` | Model persistence and loading | | `run.R` | `run.py` | Model inference | -## API Reference +## Data & retraining pipeline -### Training +All training data lives in a single source, `datasets/estimint_simulations_y9.parquet`, built +from the raw simulation DuckDBs by `models/consolidate.py`. Two model folders derive +their views and train from it: -```python -from estimint import train_xgb_model - -model = train_xgb_model( - in_parquet="data/input.parquet", - out_dir="output/", - thr_lo=0.02, # Lower prevalence threshold - thr_hi=0.95, # Upper prevalence threshold - k_strata=16, # K-means strata for EIR - K=10, # CV folds - seed=42, - save_pkl=True, - save_plots=True, - save_artifacts=True -) ``` +datasets/ # training data (see datasets/README.md) +models/ + consolidate.py # raw DuckDBs -> datasets/estimint_simulations_y9.parquet + prevalence/ # prev_y9 -> EIR (estiMINT_model.pkl) + hbr/ # HBR<->EIR sub-models (estiMINT_HBR_model.pkl, estiMINT_EIR_to_HBR_model.pkl) +``` + +Retrain a model end-to-end, e.g. the prevalence model: + +```bash +python models/consolidate.py # (re)build the single source from the DuckDBs +python models/prevalence/prepare.py # derive the training view +python models/prevalence/train.py # train -> estiMINT_model.pkl + metrics/ + plots/ +``` + +The deployed models shipped with the package live in `src/estimint/data/` and are loaded by +name (`prevalence`, `hbr`, `eir_to_hbr`) — independent of the training pipeline above. + +## API Reference ### Inference @@ -55,8 +61,8 @@ model = train_xgb_model( from estimint import load_xgb_model, run_xgb_model import pandas as pd -# Load model -model = load_xgb_model("output/models/estiMINT_model.pkl") +# Load a bundled model by name: "prevalence", "hbr", or "eir_to_hbr" +model = load_xgb_model("prevalence") # Prepare input data new_data = pd.DataFrame({ @@ -80,13 +86,26 @@ print(f"Predicted EIR: {eir_predictions[0]:.2f}") from estimint import load_xgb_model, run_xgb_model, set_global_model # Set global model once -model = load_xgb_model("output/models/estiMINT_model.pkl") +model = load_xgb_model("prevalence") set_global_model(model) # Run predictions without passing model predictions = run_xgb_model(new_data) # Uses global model ``` +### Bednet → dn0 + +Map a bednet spec (net-type usage mix + insecticide resistance) to the `dn0` +covariate (probability a mosquito dies on contact), plus total ITN usage: + +```python +from estimint import calculate_dn0, net_types + +net_types() # ['pyrethroid_only', 'pyrethroid_pbo', 'pyrethroid_ppf', 'pyrethroid_pyrrole'] +res = calculate_dn0(0.5, py_only=0.4, py_pbo=0.3, py_pyrrole=0.2, py_ppf=0.1) +res.dn0, res.itn_use # weighted dn0, total net usage +``` + ## Utility Functions ```python @@ -140,7 +159,9 @@ df = strata_and_split(df, k_strata=16, seed=42) - duckdb >= 0.8.0 - xgboost >= 1.6.0 - scikit-learn >= 1.0.0 +- scipy >= 1.7.0 - matplotlib >= 3.4.0 +- pyarrow >= 10.0.0 (Parquet I/O for the training pipeline) - requests >= 2.28.0 (optional, for model download) - appdirs >= 1.4.0 (optional, for cache directory) diff --git a/datasets/README.md b/datasets/README.md new file mode 100644 index 0000000..5d33939 --- /dev/null +++ b/datasets/README.md @@ -0,0 +1,14 @@ +# datasets/ + +Training data for retraining the estiMINT models. Not shipped with the package. + +**`estimint_simulations_y9.parquet`** — 16,384 rows (4,096 parameter sets × 4 sims), +year-9 aggregates. Columns: `parameter_index`, `simulation_index`, `eir`, `dn0_use`, +`Q0`, `phi_bednets`, `seasonal`, `itn_use`, `irs_use`, `prev_y9`, `hbr_y9`. + +Rebuild from the raw DuckDBs in `MINT_DATA/`: +``` +python models/consolidate.py +``` + +Each model's `prepare.py` filters this source and sorts by key into its training view. diff --git a/datasets/estimint_simulations_y9.parquet b/datasets/estimint_simulations_y9.parquet new file mode 100644 index 0000000000000000000000000000000000000000..69e7cbbd7ad65656682ebf295802f09f38b280aa GIT binary patch literal 605004 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

XUtQ{QGm2aw4Q~yv~sOmLTG^s7L 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

  • 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

    ?q=$v>p4po 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 z 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

    })V6pYuUKz}X!mJ5KfV@B?qEBtx2*zK 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 Nd62Eq)SBuF{|9N(ghBuS literal 0 HcmV?d00001 diff --git a/models/consolidate.py b/models/consolidate.py new file mode 100644 index 0000000..635e035 --- /dev/null +++ b/models/consolidate.py @@ -0,0 +1,72 @@ +"""Build the single estiMINT data source from the two raw simulation DuckDBs. + +Joins the epi DB (eir, interventions, prevalence) and the entomology DB (HBR signal) +on (parameter_index, simulation_index) into one year-9 aggregated table. This parquet +is the sole source of truth; the per-model training views are derived from it. + +Each column is computed with the same SQL as the original extraction so values are +bit-identical to the legacy pipeline. +""" + +import duckdb +import pandas as pd + +EPI_DB = "/home/cosmo/Documents/Repos/MINT_DATA/malaria_simulations_4096.duckdb" +ENTO_DB = "/home/cosmo/Documents/Repos/MINT_DATA/HBR_malaria_simulations_4096.duckdb" +OUT = "/home/cosmo/Documents/Repos/estimint/datasets/estimint_simulations_y9.parquet" + +INTERVENTION_DAY = 3285 # day 3285 = 9 years +YEAR9_START = INTERVENTION_DAY - 365 + +KEYS = ["parameter_index", "simulation_index"] + +EPI_QUERY = f""" +SELECT + parameter_index, + simulation_index, + MAX(eir) AS eir, + MAX(dn0_use) AS dn0_use, + MAX(Q0) AS Q0, + MAX(phi_bednets) AS phi_bednets, + MAX(seasonal) AS seasonal, + MAX(itn_use) AS itn_use, + MAX(irs_use) AS irs_use, + AVG(prevalence) AS prev_y9 +FROM simulation_results +WHERE timesteps >= {YEAR9_START} AND timesteps < {INTERVENTION_DAY} +GROUP BY parameter_index, simulation_index +""" + +ENTO_QUERY = f""" +SELECT + parameter_index, + simulation_index, + AVG(CASE WHEN Im_Anopheles_count > 0 + THEN EIR_Anopheles * total_M_Anopheles / Im_Anopheles_count END) AS hbr_y9 +FROM simulation_results +WHERE timesteps >= {YEAR9_START} AND timesteps < {INTERVENTION_DAY} +GROUP BY parameter_index, simulation_index +""" + + +def build(): + with duckdb.connect(EPI_DB, read_only=True) as epi: + df_epi = epi.execute(EPI_QUERY).fetchdf() + with duckdb.connect(ENTO_DB, read_only=True) as ento: + df_hbr = ento.execute(ENTO_QUERY).fetchdf() + + df = df_epi.merge(df_hbr, on=KEYS, how="inner").sort_values(KEYS).reset_index(drop=True) + + assert len(df) == 16384, f"expected 16,384 keys, got {len(df):,}" + df.to_parquet(OUT, index=False) + + print(f"rows={len(df):,} params={df.parameter_index.nunique()} sims={df.simulation_index.nunique()}") + print(f"prev_y9 [{df.prev_y9.min():.4f}, {df.prev_y9.max():.4f}] " + f"prev>=0.02: {(df.prev_y9 >= 0.02).sum():,}") + print(f"hbr_y9 [{df.hbr_y9.min():.2f}, {df.hbr_y9.max():.2f}] " + f"hbr>0: {(df.hbr_y9 > 0).sum():,} null: {df.hbr_y9.isna().sum():,}") + print(f"wrote {OUT}") + + +if __name__ == "__main__": + build() diff --git a/models/hbr/README.md b/models/hbr/README.md new file mode 100644 index 0000000..db612df --- /dev/null +++ b/models/hbr/README.md @@ -0,0 +1,17 @@ +# models/hbr + +The HBR feature's two sub-models, both used by `estimate_eir_with_mosquito_delta` +(`src/estimint/hbr.py`) to answer "what happens to EIR if mosquito density changes by X%?". + +| Sub-model | Direction | Bundle name | File | +|---|---|---|---| +| `train_hbr_to_eir.py` | HBR + interventions → EIR | `hbr` | `estiMINT_HBR_model.pkl` | +| `train_eir_to_hbr.py` | EIR + interventions → HBR | `eir_to_hbr` | `estiMINT_EIR_to_HBR_model.pkl` | + +```bash +python models/hbr/prepare.py # source -> hbr_training.parquet + eir_to_hbr_training.parquet +python models/hbr/train_hbr_to_eir.py # -> estiMINT_HBR_model.pkl +python models/hbr/train_eir_to_hbr.py # -> estiMINT_EIR_to_HBR_model.pkl +``` + +Deployed copies live in `src/estimint/data/`. diff --git a/models/hbr/metrics/eir_OOF_metrics_K10CV.csv b/models/hbr/metrics/eir_OOF_metrics_K10CV.csv new file mode 100644 index 0000000..f60ae5c --- /dev/null +++ b/models/hbr/metrics/eir_OOF_metrics_K10CV.csv @@ -0,0 +1,3 @@ +set,R2,bias,RMSE,MAE +OOF_uncalibrated,0.9937114678283258,0.1975426785792437,7.503367295849099,1.811916642783641 +OOF_calibrated,0.9938349462151069,-0.11396988957813733,7.429335951261748,1.7968831645347725 diff --git a/models/hbr/metrics/eir_test_metrics.csv b/models/hbr/metrics/eir_test_metrics.csv new file mode 100644 index 0000000..ddc0eaa --- /dev/null +++ b/models/hbr/metrics/eir_test_metrics.csv @@ -0,0 +1,2 @@ +set,R2,bias,RMSE,MAE +Test,0.9932201789731747,-0.1516625971494146,7.79412320408285,1.7008778672664435 diff --git a/models/hbr/metrics/hbr_OOF_metrics_K10CV.csv b/models/hbr/metrics/hbr_OOF_metrics_K10CV.csv new file mode 100644 index 0000000..bf790a2 --- /dev/null +++ b/models/hbr/metrics/hbr_OOF_metrics_K10CV.csv @@ -0,0 +1,3 @@ +set,R2,bias,RMSE,MAE +OOF_uncalibrated,0.9998069592457883,-1107.6675606973777,23435.86049194724,2709.3842691018244 +OOF_calibrated,0.9998096907822673,119.85741076025299,23269.46044419048,3190.5668570747875 diff --git a/models/hbr/metrics/hbr_test_metrics.csv b/models/hbr/metrics/hbr_test_metrics.csv new file mode 100644 index 0000000..fd64886 --- /dev/null +++ b/models/hbr/metrics/hbr_test_metrics.csv @@ -0,0 +1,2 @@ +set,R2,bias,RMSE,MAE +Test,0.9999753512398193,1533.1655993230922,8372.508464605351,2530.611551719603 diff --git a/models/hbr/prepare.py b/models/hbr/prepare.py new file mode 100644 index 0000000..a3c9afa --- /dev/null +++ b/models/hbr/prepare.py @@ -0,0 +1,36 @@ +"""Derive the two HBR training views from the consolidated source. + +- hbr_training: HBR->EIR model (hbr_y9 > 0) +- eir_to_hbr_training: EIR->HBR model (prev_y9 >= 0.02 AND hbr_y9 > 0) + +Both sorted by key for a deterministic, reproducible view. +""" + +import pandas as pd + +ROOT = "/home/cosmo/Documents/Repos/estimint" +SOURCE = f"{ROOT}/datasets/estimint_simulations_y9.parquet" + +KEYS = ["parameter_index", "simulation_index"] +COLS = KEYS + ["eir", "dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "hbr_y9"] +MIN_PREVALENCE = 0.02 + + +def prepare(): + src = pd.read_parquet(SOURCE) + + hbr = src[src.hbr_y9 > 0][COLS].sort_values(KEYS).reset_index(drop=True) + assert len(hbr) == 16384, f"expected 16,384 hbr rows, got {len(hbr):,}" + assert not hbr.isna().any().any(), "unexpected NaN in hbr view" + hbr.to_parquet(f"{ROOT}/models/hbr/hbr_training.parquet", index=False) + print(f"hbr view: {len(hbr):,} rows -> models/hbr/hbr_training.parquet") + + e2h = src[(src.prev_y9 >= MIN_PREVALENCE) & (src.hbr_y9 > 0)][COLS].sort_values(KEYS).reset_index(drop=True) + assert len(e2h) == 12429, f"expected 12,429 eir_to_hbr rows, got {len(e2h):,}" + assert not e2h.isna().any().any(), "unexpected NaN in eir_to_hbr view" + e2h.to_parquet(f"{ROOT}/models/hbr/eir_to_hbr_training.parquet", index=False) + print(f"eir_to_hbr view: {len(e2h):,} rows -> models/hbr/eir_to_hbr_training.parquet") + + +if __name__ == "__main__": + prepare() diff --git a/scripts/train_eir_to_hbr.py b/models/hbr/train_eir_to_hbr.py similarity index 76% rename from scripts/train_eir_to_hbr.py rename to models/hbr/train_eir_to_hbr.py index 43a3f6f..f2c0ebc 100644 --- a/scripts/train_eir_to_hbr.py +++ b/models/hbr/train_eir_to_hbr.py @@ -1,14 +1,9 @@ -""" -Train estiMINT EIR-to-HBR model. - -This script: -1. Loads the prepared data (eir + interventions -> hbr_y9) -2. Trains XGBoost model using K-fold CV and QMAP calibration -3. Saves model to output/eir_to_hbr_retrained/ +"""Train the EIR->HBR model (eir + interventions -> hbr_y9). -This is the "reverse" model: given a baseline EIR and interventions, -predict what the human biting rate is. Used to derive baseline HBR -so users can apply percentage changes (e.g. "10% more mosquitoes"). +The reverse model: given baseline EIR and interventions, predict the human biting +rate so percentage mosquito-density changes can be applied. XGBoost with k-means +strata on log10(HBR), 10-fold CV, QMAP+scale calibration (no monotone constraint). +Reads models/hbr/eir_to_hbr_training.parquet; writes artifacts into this folder. """ import sys @@ -19,8 +14,7 @@ from pathlib import Path from sklearn.cluster import KMeans -# Add parent directory to path -sys.path.insert(0, str(Path(__file__).parent.parent / "src")) +sys.path.insert(0, str(Path(__file__).parents[2] / "src")) from estimint.utils import ( ts, r2, rmse, mse, mae, median_ae, mae_rel, rmsle, @@ -29,49 +23,28 @@ from estimint.data_processing import make_value_weights from estimint.plotting import plot_obs_pred -# Configuration -DATA_PATH = "/home/cosmo/Documents/Repos/estimint/output/eir_to_hbr_data/eir_to_hbr_training_data.csv" -OUTPUT_DIR = "/home/cosmo/Documents/Repos/estimint/output/eir_to_hbr_retrained" +HERE = Path(__file__).parent +DATA_PATH = HERE / "eir_to_hbr_training.parquet" +OUTPUT_DIR = HERE K_FOLDS = 10 K_STRATA = 16 SEED = 42 + def main(): - print("=" * 80) - print("Training estiMINT EIR-to-HBR Model (eir + interventions -> hbr_y9)") - print("=" * 80) - - data_path = Path(DATA_PATH) - if not data_path.exists(): - print(f"ERROR: Training data not found at {DATA_PATH}") - print("Please run prepare_eir_to_hbr_data.py first") - return 1 - - print(f"\nInput data: {data_path}") - print(f"Output dir: {OUTPUT_DIR}") - - # Create output directories - out_dir = Path(OUTPUT_DIR) - dir_models = out_dir / "models" - dir_plots = out_dir / "plots" - dir_metric = out_dir / "metrics" - dir_pred = out_dir / "predictions" - - for d in [dir_models, dir_plots, dir_metric, dir_pred]: + dir_plots = OUTPUT_DIR / "plots" + dir_metric = OUTPUT_DIR / "metrics" + for d in [dir_plots, dir_metric]: d.mkdir(parents=True, exist_ok=True) - # Load data ts("Loading training data...") - DT = pd.read_csv(data_path) + DT = pd.read_parquet(DATA_PATH) print(f"Loaded {len(DT):,} rows") - # Features: eir + interventions. Target: hbr_y9 features = ["eir", "dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use"] - # Transform HBR to log10 (large range, same reason as EIR) DT["hbr_log10"] = np.log10(DT["hbr_y9"]) - # XGBoost parameters xgb_params = { "objective": "reg:squarederror", "eval_metric": "rmse", @@ -85,7 +58,6 @@ def main(): "seed": SEED, } - # Create strata using k-means on log10(HBR) ts("Creating %d strata on log10(HBR) and 70/15/15 split...", K_STRATA) np.random.seed(SEED) @@ -98,7 +70,6 @@ def main(): id_map = {old_id: new_id + 1 for new_id, old_id in enumerate(ord_idx)} DT["strat_bin"] = np.array([id_map[c] for c in km.labels_]) - # Stratified split DT["split"] = None for b in sorted(DT["strat_bin"].unique()): idx = DT[DT["strat_bin"] == b].index.tolist() @@ -118,7 +89,6 @@ def main(): DT["split"] = DT["split"].fillna("train") - # Hold-out test set DT_test = DT[DT["split"] == "test"] X_test = DT_test[features].values.astype(np.float64) y_test = DT_test["hbr_log10"].values @@ -126,7 +96,6 @@ def main(): ts("Test set: %d rows", len(DT_test)) - # CV folds ts("Assigning %d-fold CV within TRAIN+VAL strata...", K_FOLDS) DTcv = DT[DT["split"] != "test"].copy() @@ -142,7 +111,6 @@ def main(): np.random.shuffle(folds) DTcv.loc[idx, "fold"] = folds - # K-fold CV training ts("Running %d-fold CV with early stopping...", K_FOLDS) oof_pred_raw = np.full(len(DTcv), np.nan) best_iters = np.zeros(K_FOLDS, dtype=int) @@ -179,14 +147,12 @@ def main(): obs_cv_raw = np.power(10, DTcv["hbr_log10"].values) - # Fit calibrator ts("Fitting final calibrator (QMAP + positive scale) on OOF...") cal_oof = fit_qmap_w(oof_pred_raw, obs_cv_raw, ngrid=1024, round_digits=8) oof_pred_cal = predict_qmap_w(oof_pred_raw, cal_oof) a_oof = scale_pos(obs_cv_raw, oof_pred_cal) oof_pred_final = np.maximum(0, a_oof * oof_pred_cal) - # OOF metrics oof_metrics = pd.DataFrame({ "set": ["OOF_uncalibrated", "OOF_calibrated"], "R2": [r2(obs_cv_raw, oof_pred_raw), r2(obs_cv_raw, oof_pred_final)], @@ -197,7 +163,6 @@ def main(): oof_metrics.to_csv(dir_metric / f"hbr_OOF_metrics_K{K_FOLDS}CV.csv", index=False) print("\n" + str(oof_metrics)) - # Train final model ts("Training final model on TRAIN+VAL with nrounds = median(best_iteration)...") best_nrounds = int(np.round(np.median(best_iters))) print(f"Best nrounds: {best_nrounds}") @@ -215,16 +180,14 @@ def main(): num_boost_round=best_nrounds, verbose_eval=False, ) - xgb_final.save_model(str(dir_models / "hbr_xgb_FINAL.model")) + xgb_final.save_model(str(OUTPUT_DIR / "hbr_xgb_FINAL.model")) - # Predict on TEST dtest = xgb.DMatrix(X_test, label=y_test) pred_log10_test_raw = xgb_final.predict(dtest) pred_raw_test = np.power(10, pred_log10_test_raw) pred_hbr_test = predict_qmap_w(pred_raw_test, cal_oof) pred_hbr_test = np.maximum(0, a_oof * pred_hbr_test) - # Test metrics test_metrics = pd.DataFrame({ "set": ["Test"], "R2": [r2(obs_hbr_test, pred_hbr_test)], @@ -235,7 +198,6 @@ def main(): test_metrics.to_csv(dir_metric / "hbr_test_metrics.csv", index=False) print("\n" + str(test_metrics)) - # Plot plot_obs_pred( obs_hbr_test, pred_hbr_test, f"HBR — Observed vs Predicted (XGBoost, K={K_FOLDS} CV, QMAP+Scale, test)", @@ -243,7 +205,6 @@ def main(): xlab="Observed HBR", ylab="Predicted HBR" ) - # Model bundle cal_bundle = { "kind": "qmap+scale", "qmap": {"xq": cal_oof["xq"], "yq": cal_oof["yq"]}, @@ -256,7 +217,7 @@ def main(): "transform": "log10", "inverse": "pow10", "training_data": { - "source": "MINTelligence malaria_simulations_4096.duckdb + HBR_malaria_simulations_4096.duckdb", + "source": "datasets/estimint_simulations_y9.parquet (prev_y9 >= 0.02 AND hbr_y9 > 0)", "n_rows": len(DT), "n_params": DT["parameter_index"].nunique() }, @@ -276,17 +237,12 @@ def main(): "preprocess": preprocess, } - with open(dir_models / "estiMINT_EIR_to_HBR_model.pkl", "wb") as f: + with open(OUTPUT_DIR / "estiMINT_EIR_to_HBR_model.pkl", "wb") as f: pickle.dump(model_bundle, f, protocol=pickle.HIGHEST_PROTOCOL) - print("\n" + "=" * 80) - print("Training Complete!") - print("=" * 80) - print(f"\nModel saved to: {dir_models}/estiMINT_EIR_to_HBR_model.pkl") - print(f"Plots saved to: {dir_plots}/") - print(f"Metrics saved to: {dir_metric}/") - + print(f"\nModel saved to: {OUTPUT_DIR}/estiMINT_EIR_to_HBR_model.pkl") return 0 + if __name__ == "__main__": sys.exit(main()) diff --git a/scripts/train_on_hbr_data.py b/models/hbr/train_hbr_to_eir.py similarity index 72% rename from scripts/train_on_hbr_data.py rename to models/hbr/train_hbr_to_eir.py index f0350d1..f8035f7 100644 --- a/scripts/train_on_hbr_data.py +++ b/models/hbr/train_hbr_to_eir.py @@ -1,10 +1,8 @@ -""" -Train estiMINT HBR model using MINTelligence data. +"""Train the HBR->EIR model (hbr_y9 + interventions -> EIR). -This script: -1. Loads the prepared HBR data from prepare_hbr_data.py -2. Trains XGBoost model (hbr_y9 + interventions -> EIR) using K-fold CV and QMAP calibration -3. Saves model to output/hbr_retrained/ +Same pipeline as the prevalence model but with hbr_y9 as the monotone feature. +Reads models/hbr/hbr_training.parquet; writes the model, booster, metrics and plot +into this folder. """ import sys @@ -15,8 +13,7 @@ from pathlib import Path from sklearn.cluster import KMeans -# Add parent directory to path -sys.path.insert(0, str(Path(__file__).parent.parent / "src")) +sys.path.insert(0, str(Path(__file__).parents[2] / "src")) from estimint.utils import ( ts, r2, rmse, mse, mae, median_ae, mae_rel, rmsle, @@ -25,54 +22,29 @@ from estimint.data_processing import make_value_weights from estimint.plotting import plot_obs_pred -# Configuration -DATA_PATH = "/home/cosmo/Documents/Repos/estimint/output/hbr_data/hbr_training_data.csv" -OUTPUT_DIR = "/home/cosmo/Documents/Repos/estimint/output/hbr_retrained" +HERE = Path(__file__).parent +DATA_PATH = HERE / "hbr_training.parquet" +OUTPUT_DIR = HERE K_FOLDS = 10 K_STRATA = 16 SEED = 42 + def main(): - print("=" * 80) - print("Training estiMINT HBR Model (hbr_y9 + interventions -> EIR)") - print("=" * 80) - - # Check if data exists - data_path = Path(DATA_PATH) - if not data_path.exists(): - print(f"ERROR: Training data not found at {DATA_PATH}") - print("Please run prepare_hbr_data.py first") - return 1 - - print(f"\nInput data: {data_path}") - print(f"Output dir: {OUTPUT_DIR}") - - # Create output directories - out_dir = Path(OUTPUT_DIR) - dir_models = out_dir / "models" - dir_plots = out_dir / "plots" - dir_metric = out_dir / "metrics" - dir_pred = out_dir / "predictions" - - for d in [dir_models, dir_plots, dir_metric, dir_pred]: + dir_plots = OUTPUT_DIR / "plots" + dir_metric = OUTPUT_DIR / "metrics" + for d in [dir_plots, dir_metric]: d.mkdir(parents=True, exist_ok=True) - # Load data ts("Loading training data...") - DT = pd.read_csv(data_path) + DT = pd.read_parquet(DATA_PATH) print(f"Loaded {len(DT):,} rows") - # Define features — same as prevalence model but with hbr_y9 instead of prev_y9 features = ["dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "hbr_y9"] - # Transform EIR to log10 DT["eir_log10"] = np.log10(DT["eir"]) - # XGBoost parameters (same as prevalence model) - # Monotone constraint: hbr_y9 (index 6) must be positively correlated with EIR - # More mosquito bites → more infectious bites, all else equal - # Features: ["dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "hbr_y9"] - # 0 0 0 0 0 0 +1 + # monotone constraint: hbr_y9 (index 6) positively correlated with EIR xgb_params = { "objective": "reg:squarederror", "eval_metric": "rmse", @@ -88,7 +60,6 @@ def main(): "monotone_constraints": "(0,0,0,0,0,0,1)", } - # Create strata using k-means on log10(EIR) ts("Creating %d strata on log10(EIR) and 70/15/15 split...", K_STRATA) np.random.seed(SEED) @@ -96,13 +67,11 @@ def main(): km = KMeans(n_clusters=K_STRATA, n_init=50, max_iter=5000, random_state=SEED) km.fit(eir_log10) - # Reorder cluster IDs by center value centers = km.cluster_centers_.flatten() ord_idx = np.argsort(centers) id_map = {old_id: new_id + 1 for new_id, old_id in enumerate(ord_idx)} DT["strat_bin"] = np.array([id_map[c] for c in km.labels_]) - # Stratified split DT["split"] = None for b in sorted(DT["strat_bin"].unique()): idx = DT[DT["strat_bin"] == b].index.tolist() @@ -122,7 +91,6 @@ def main(): DT["split"] = DT["split"].fillna("train") - # Hold-out test set DT_test = DT[DT["split"] == "test"] X_test = DT_test[features].values.astype(np.float64) y_test = DT_test["eir_log10"].values @@ -130,13 +98,11 @@ def main(): ts("Test set: %d rows", len(DT_test)) - # CV folds on train+val ts("Assigning %d-fold CV within TRAIN+VAL strata...", K_FOLDS) DTcv = DT[DT["split"] != "test"].copy() np.random.seed(SEED + 1) - # Assign folds within each stratum DTcv["fold"] = 0 for b in DTcv["strat_bin"].unique(): mask = DTcv["strat_bin"] == b @@ -147,7 +113,6 @@ def main(): np.random.shuffle(folds) DTcv.loc[idx, "fold"] = folds - # K-fold CV training ts("Running %d-fold CV with early stopping...", K_FOLDS) oof_pred_raw = np.full(len(DTcv), np.nan) best_iters = np.zeros(K_FOLDS, dtype=int) @@ -163,15 +128,12 @@ def main(): X_va = DTcv.loc[idx_val, features].values.astype(np.float64) y_va = DTcv.loc[idx_val, "eir_log10"].values - # Compute weights w_tr = make_value_weights(np.power(10, y_tr), digits=3) w_va = make_value_weights(np.power(10, y_va), digits=3) - # Create DMatrix objects dtr = xgb.DMatrix(X_tr, label=y_tr, weight=w_tr) dva = xgb.DMatrix(X_va, label=y_va, weight=w_va) - # Train model mdl = xgb.train( params=xgb_params, dtrain=dtr, @@ -182,21 +144,17 @@ def main(): ) best_iters[k - 1] = mdl.best_iteration - - # Predict on validation fold pred_log10_va = mdl.predict(dva) oof_pred_raw[idx_val.values] = np.power(10, pred_log10_va) obs_cv_raw = np.power(10, DTcv["eir_log10"].values) - # Fit calibrator on OOF predictions ts("Fitting final calibrator (QMAP + positive scale) on OOF...") cal_oof = fit_qmap_w(oof_pred_raw, obs_cv_raw, ngrid=1024, round_digits=8) oof_pred_cal = predict_qmap_w(oof_pred_raw, cal_oof) a_oof = scale_pos(obs_cv_raw, oof_pred_cal) oof_pred_final = np.maximum(0, a_oof * oof_pred_cal) - # Save OOF metrics oof_metrics = pd.DataFrame({ "set": ["OOF_uncalibrated", "OOF_calibrated"], "R2": [r2(obs_cv_raw, oof_pred_raw), r2(obs_cv_raw, oof_pred_final)], @@ -207,7 +165,6 @@ def main(): oof_metrics.to_csv(dir_metric / f"eir_OOF_metrics_K{K_FOLDS}CV.csv", index=False) print("\n" + str(oof_metrics)) - # Train final model on TRAIN+VAL ts("Training final model on TRAIN+VAL with nrounds = median(best_iteration)...") best_nrounds = int(np.round(np.median(best_iters))) print(f"Best nrounds: {best_nrounds}") @@ -225,16 +182,14 @@ def main(): num_boost_round=best_nrounds, verbose_eval=False, ) - xgb_final.save_model(str(dir_models / "eir_xgb_HBR_FINAL.model")) + xgb_final.save_model(str(OUTPUT_DIR / "eir_xgb_HBR_FINAL.model")) - # Predict on TEST and calibrate dtest = xgb.DMatrix(X_test, label=y_test) pred_log10_test_raw = xgb_final.predict(dtest) pred_raw_test = np.power(10, pred_log10_test_raw) pred_eir_test = predict_qmap_w(pred_raw_test, cal_oof) pred_eir_test = np.maximum(0, a_oof * pred_eir_test) - # Test set metrics test_metrics = pd.DataFrame({ "set": ["Test"], "R2": [r2(obs_eir_test, pred_eir_test)], @@ -245,7 +200,6 @@ def main(): test_metrics.to_csv(dir_metric / "eir_test_metrics.csv", index=False) print("\n" + str(test_metrics)) - # Save diagnostic plots plot_obs_pred( obs_eir_test, pred_eir_test, f"EIR — Observed vs Predicted (XGBoost HBR, K={K_FOLDS} CV, QMAP+Scale, test)", @@ -253,14 +207,12 @@ def main(): xlab="Observed EIR", ylab="Predicted EIR" ) - # Create calibration bundle cal_bundle = { "kind": "qmap+scale", "qmap": {"xq": cal_oof["xq"], "yq": cal_oof["yq"]}, "scale": a_oof } - # Create preprocessing metadata preprocess = { "features": features, "target": "eir", @@ -270,7 +222,7 @@ def main(): "note": "Trained on MINTelligence data, HBR > 0 (Im > 0)" }, "training_data": { - "source": "MINTelligence HBR_malaria_simulations_4096.duckdb", + "source": "datasets/estimint_simulations_y9.parquet (hbr_y9 > 0)", "n_rows": len(DT), "n_params": DT["parameter_index"].nunique() }, @@ -281,7 +233,6 @@ def main(): }, } - # Create model bundle model_bundle = { "class": "estiMINT_HBR_model", "booster": xgb_final, @@ -291,18 +242,12 @@ def main(): "preprocess": preprocess, } - # Save pickle bundle - with open(dir_models / "estiMINT_HBR_model.pkl", "wb") as f: + with open(OUTPUT_DIR / "estiMINT_HBR_model.pkl", "wb") as f: pickle.dump(model_bundle, f, protocol=pickle.HIGHEST_PROTOCOL) - print("\n" + "=" * 80) - print("Training Complete!") - print("=" * 80) - print(f"\nModel saved to: {dir_models}/estiMINT_HBR_model.pkl") - print(f"Plots saved to: {dir_plots}/") - print(f"Metrics saved to: {dir_metric}/") - + print(f"\nModel saved to: {OUTPUT_DIR}/estiMINT_HBR_model.pkl") return 0 + if __name__ == "__main__": sys.exit(main()) diff --git a/models/prevalence/README.md b/models/prevalence/README.md new file mode 100644 index 0000000..e43e317 --- /dev/null +++ b/models/prevalence/README.md @@ -0,0 +1,13 @@ +# models/prevalence + +Prevalence → EIR model — the default estiMINT emulator. + +Predicts **EIR** from year-9 prevalence (`prev_y9`) + 6 interventions. Bundled as +`prevalence` → `estiMINT_model.pkl`. + +```bash +python models/prevalence/prepare.py # datasets source -> training.parquet (prev_y9 >= 0.02) +python models/prevalence/train.py # -> estiMINT_model.pkl, eir_xgb_FINAL.model, metrics/, plots/ +``` + +Deployed copy lives in `src/estimint/data/estiMINT_model.pkl`. diff --git a/models/prevalence/metrics/eir_OOF_metrics_K10CV.csv b/models/prevalence/metrics/eir_OOF_metrics_K10CV.csv new file mode 100644 index 0000000..a0bacaa --- /dev/null +++ b/models/prevalence/metrics/eir_OOF_metrics_K10CV.csv @@ -0,0 +1,3 @@ +set,R2,bias,RMSE,MAE +OOF_uncalibrated,0.9975448045299296,-0.29231003393205607,5.201173980502499,1.1974636177941054 +OOF_calibrated,0.9977198930437194,-0.04791886282845037,5.012287271853999,1.227147129492564 diff --git a/models/prevalence/metrics/eir_test_metrics.csv b/models/prevalence/metrics/eir_test_metrics.csv new file mode 100644 index 0000000..960fa08 --- /dev/null +++ b/models/prevalence/metrics/eir_test_metrics.csv @@ -0,0 +1,2 @@ +set,R2,bias,RMSE,MAE +Test,0.9988711174876289,0.10276439693521482,3.539759142317308,1.1724200075408078 diff --git a/models/prevalence/prepare.py b/models/prevalence/prepare.py new file mode 100644 index 0000000..c97cfd5 --- /dev/null +++ b/models/prevalence/prepare.py @@ -0,0 +1,28 @@ +"""Derive the prevalence->EIR training view from the consolidated source. + +Filters prev_y9 >= 0.02 and sorts by key for a deterministic, reproducible view. +""" + +import pandas as pd + +ROOT = "/home/cosmo/Documents/Repos/estimint" +SOURCE = f"{ROOT}/datasets/estimint_simulations_y9.parquet" +OUT = f"{ROOT}/models/prevalence/training.parquet" + +KEYS = ["parameter_index", "simulation_index"] +COLS = KEYS + ["eir", "dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "prev_y9"] +MIN_PREVALENCE = 0.02 + + +def prepare(): + src = pd.read_parquet(SOURCE) + view = src[src.prev_y9 >= MIN_PREVALENCE][COLS].sort_values(KEYS).reset_index(drop=True) + + assert len(view) == 12429, f"expected 12,429 rows, got {len(view):,}" + assert not view.isna().any().any(), "unexpected NaN in prevalence view" + view.to_parquet(OUT, index=False) + print(f"prevalence view: {len(view):,} rows -> {OUT}") + + +if __name__ == "__main__": + prepare() diff --git a/scripts/train_on_mint_data.py b/models/prevalence/train.py similarity index 71% rename from scripts/train_on_mint_data.py rename to models/prevalence/train.py index 2c73df8..0b5be73 100644 --- a/scripts/train_on_mint_data.py +++ b/models/prevalence/train.py @@ -1,10 +1,8 @@ -""" -Retrain estiMINT using MINTelligence data. +"""Train the prevalence->EIR model (prev_y9 + interventions -> EIR). -This script: -1. Loads the prepared data from prepare_mint_data.py -2. Trains XGBoost model using K-fold CV and QMAP calibration -3. Saves model to output/mint_retrained/ +XGBoost with k-means strata on log10(EIR), 10-fold CV, and QMAP+scale calibration. +Reads models/prevalence/training.parquet; writes the model, booster, metrics and plot +into this folder. """ import sys @@ -15,8 +13,7 @@ from pathlib import Path from sklearn.cluster import KMeans -# Add parent directory to path -sys.path.insert(0, str(Path(__file__).parent.parent / "src")) +sys.path.insert(0, str(Path(__file__).parents[2] / "src")) from estimint.utils import ( ts, r2, rmse, mse, mae, median_ae, mae_rel, rmsle, @@ -25,54 +22,29 @@ from estimint.data_processing import make_value_weights from estimint.plotting import plot_obs_pred -# Configuration -DATA_PATH = "/home/cosmo/Documents/Repos/estimint/output/mint_data/mint_training_data.csv" -OUTPUT_DIR = "/home/cosmo/Documents/Repos/estimint/output/mint_retrained" +HERE = Path(__file__).parent +DATA_PATH = HERE / "training.parquet" +OUTPUT_DIR = HERE K_FOLDS = 10 K_STRATA = 16 SEED = 42 + def main(): - print("=" * 80) - print("Training estiMINT on MINTelligence Data") - print("=" * 80) - - # Check if data exists - data_path = Path(DATA_PATH) - if not data_path.exists(): - print(f"ERROR: Training data not found at {DATA_PATH}") - print("Please run prepare_mint_data.py first") - return 1 - - print(f"\nInput data: {data_path}") - print(f"Output dir: {OUTPUT_DIR}") - - # Create output directories - out_dir = Path(OUTPUT_DIR) - dir_models = out_dir / "models" - dir_plots = out_dir / "plots" - dir_metric = out_dir / "metrics" - dir_pred = out_dir / "predictions" - - for d in [dir_models, dir_plots, dir_metric, dir_pred]: + dir_plots = OUTPUT_DIR / "plots" + dir_metric = OUTPUT_DIR / "metrics" + for d in [dir_plots, dir_metric]: d.mkdir(parents=True, exist_ok=True) - # Load data ts("Loading training data...") - DT = pd.read_csv(data_path) + DT = pd.read_parquet(DATA_PATH) print(f"Loaded {len(DT):,} rows") - # Define features features = ["dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "prev_y9"] - # Transform EIR to log10 DT["eir_log10"] = np.log10(DT["eir"]) - # XGBoost parameters - # Monotone constraint: prev_y9 (index 6) must be positively correlated with EIR - # Higher prevalence → more infected humans → more transmission → higher EIR - # Features: ["dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "prev_y9"] - # 0 0 0 0 0 0 +1 + # monotone constraint: prev_y9 (index 6) positively correlated with EIR xgb_params = { "objective": "reg:squarederror", "eval_metric": "rmse", @@ -88,7 +60,6 @@ def main(): "monotone_constraints": "(0,0,0,0,0,0,1)", } - # Create strata using k-means on log10(EIR) ts("Creating %d strata on log10(EIR) and 70/15/15 split...", K_STRATA) np.random.seed(SEED) @@ -96,13 +67,11 @@ def main(): km = KMeans(n_clusters=K_STRATA, n_init=50, max_iter=5000, random_state=SEED) km.fit(eir_log10) - # Reorder cluster IDs by center value centers = km.cluster_centers_.flatten() ord_idx = np.argsort(centers) id_map = {old_id: new_id + 1 for new_id, old_id in enumerate(ord_idx)} DT["strat_bin"] = np.array([id_map[c] for c in km.labels_]) - # Stratified split DT["split"] = None for b in sorted(DT["strat_bin"].unique()): idx = DT[DT["strat_bin"] == b].index.tolist() @@ -122,7 +91,6 @@ def main(): DT["split"] = DT["split"].fillna("train") - # Hold-out test set DT_test = DT[DT["split"] == "test"] X_test = DT_test[features].values.astype(np.float64) y_test = DT_test["eir_log10"].values @@ -130,13 +98,11 @@ def main(): ts("Test set: %d rows", len(DT_test)) - # CV folds on train+val ts("Assigning %d-fold CV within TRAIN+VAL strata...", K_FOLDS) DTcv = DT[DT["split"] != "test"].copy() np.random.seed(SEED + 1) - # Assign folds within each stratum DTcv["fold"] = 0 for b in DTcv["strat_bin"].unique(): mask = DTcv["strat_bin"] == b @@ -147,7 +113,6 @@ def main(): np.random.shuffle(folds) DTcv.loc[idx, "fold"] = folds - # K-fold CV training ts("Running %d-fold CV with early stopping...", K_FOLDS) oof_pred_raw = np.full(len(DTcv), np.nan) best_iters = np.zeros(K_FOLDS, dtype=int) @@ -163,15 +128,12 @@ def main(): X_va = DTcv.loc[idx_val, features].values.astype(np.float64) y_va = DTcv.loc[idx_val, "eir_log10"].values - # Compute weights w_tr = make_value_weights(np.power(10, y_tr), digits=3) w_va = make_value_weights(np.power(10, y_va), digits=3) - # Create DMatrix objects dtr = xgb.DMatrix(X_tr, label=y_tr, weight=w_tr) dva = xgb.DMatrix(X_va, label=y_va, weight=w_va) - # Train model mdl = xgb.train( params=xgb_params, dtrain=dtr, @@ -182,21 +144,17 @@ def main(): ) best_iters[k - 1] = mdl.best_iteration - - # Predict on validation fold pred_log10_va = mdl.predict(dva) oof_pred_raw[idx_val.values] = np.power(10, pred_log10_va) obs_cv_raw = np.power(10, DTcv["eir_log10"].values) - # Fit calibrator on OOF predictions ts("Fitting final calibrator (QMAP + positive scale) on OOF...") cal_oof = fit_qmap_w(oof_pred_raw, obs_cv_raw, ngrid=1024, round_digits=8) oof_pred_cal = predict_qmap_w(oof_pred_raw, cal_oof) a_oof = scale_pos(obs_cv_raw, oof_pred_cal) oof_pred_final = np.maximum(0, a_oof * oof_pred_cal) - # Save OOF metrics oof_metrics = pd.DataFrame({ "set": ["OOF_uncalibrated", "OOF_calibrated"], "R2": [r2(obs_cv_raw, oof_pred_raw), r2(obs_cv_raw, oof_pred_final)], @@ -207,7 +165,6 @@ def main(): oof_metrics.to_csv(dir_metric / f"eir_OOF_metrics_K{K_FOLDS}CV.csv", index=False) print("\n" + str(oof_metrics)) - # Train final model on TRAIN+VAL ts("Training final model on TRAIN+VAL with nrounds = median(best_iteration)...") best_nrounds = int(np.round(np.median(best_iters))) print(f"Best nrounds: {best_nrounds}") @@ -225,16 +182,14 @@ def main(): num_boost_round=best_nrounds, verbose_eval=False, ) - xgb_final.save_model(str(dir_models / "eir_xgb_FINAL.model")) + xgb_final.save_model(str(OUTPUT_DIR / "eir_xgb_FINAL.model")) - # Predict on TEST and calibrate dtest = xgb.DMatrix(X_test, label=y_test) pred_log10_test_raw = xgb_final.predict(dtest) pred_raw_test = np.power(10, pred_log10_test_raw) pred_eir_test = predict_qmap_w(pred_raw_test, cal_oof) pred_eir_test = np.maximum(0, a_oof * pred_eir_test) - # Test set metrics test_metrics = pd.DataFrame({ "set": ["Test"], "R2": [r2(obs_eir_test, pred_eir_test)], @@ -245,7 +200,6 @@ def main(): test_metrics.to_csv(dir_metric / "eir_test_metrics.csv", index=False) print("\n" + str(test_metrics)) - # Save diagnostic plots plot_obs_pred( obs_eir_test, pred_eir_test, f"EIR — Observed vs Predicted (XGBoost, K={K_FOLDS} CV, QMAP+Scale, test)", @@ -253,14 +207,12 @@ def main(): xlab="Observed EIR", ylab="Predicted EIR" ) - # Create calibration bundle cal_bundle = { "kind": "qmap+scale", "qmap": {"xq": cal_oof["xq"], "yq": cal_oof["yq"]}, "scale": a_oof } - # Create preprocessing metadata preprocess = { "features": features, "target": "eir", @@ -271,7 +223,7 @@ def main(): "note": "Trained on MINTelligence data with prev >= 0.02" }, "training_data": { - "source": "MINTelligence malaria_simulations_4096.duckdb", + "source": "datasets/estimint_simulations_y9.parquet (prev_y9 >= 0.02)", "n_rows": len(DT), "n_params": DT["parameter_index"].nunique() }, @@ -282,7 +234,6 @@ def main(): }, } - # Create model bundle model_bundle = { "class": "estiMINT_model", "booster": xgb_final, @@ -292,27 +243,12 @@ def main(): "preprocess": preprocess, } - # Save pickle bundle - with open(dir_models / "estiMINT_model.pkl", "wb") as f: + with open(OUTPUT_DIR / "estiMINT_model.pkl", "wb") as f: pickle.dump(model_bundle, f, protocol=pickle.HIGHEST_PROTOCOL) - print("\n" + "=" * 80) - print("✓ Training Complete!") - print("=" * 80) - print(f"\nModel saved to: {dir_models}/estiMINT_model.pkl") - print(f"Plots saved to: {dir_plots}/") - print(f"Metrics saved to: {dir_metric}/") - - print("\n=== Next Steps ===") - print("To test the new model:") - print(f" export ESTIMINT_MODELS_DIR={dir_models}") - print(" cd /home/cosmo/Documents/Repos/MINTelligence/tst") - print(" python API_check.py") - print("\nTo compare with old model:") - print(" unset ESTIMINT_MODELS_DIR") - print(" python API_check.py") - + print(f"\nModel saved to: {OUTPUT_DIR}/estiMINT_model.pkl") return 0 + if __name__ == "__main__": sys.exit(main()) diff --git a/pyproject.toml b/pyproject.toml index 6d20c39..28e4aa2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "estimint" -version = "1.3.1" +version = "1.4.0" description = "EIR Estimation using Machine learning INTerventions - Python port" readme = "README.md" license = "MIT" diff --git a/requirements.txt b/requirements.txt index 038d617..8830c69 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,9 @@ pandas>=1.3.0 duckdb>=0.8.0 xgboost>=1.6.0 scikit-learn>=1.0.0 +scipy>=1.7.0 matplotlib>=3.4.0 +pyarrow>=10.0.0 # Optional: for model download functionality requests>=2.28.0 diff --git a/scripts/prepare_eir_to_hbr_data.py b/scripts/prepare_eir_to_hbr_data.py deleted file mode 100644 index 83de699..0000000 --- a/scripts/prepare_eir_to_hbr_data.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -Prepare training data for EIR -> HBR model. - -This script: -1. Loads mint_training_data.csv (has eir, interventions, prev_y9) -2. Loads hbr_training_data.csv (has eir, interventions, hbr_y9) -3. Joins on (parameter_index, simulation_index) -4. Outputs training data for eir + interventions -> hbr_y9 model -""" - -import pandas as pd -from pathlib import Path - -# Configuration -PREV_DATA = "/home/cosmo/Documents/Repos/estimint/output/mint_data/mint_training_data.csv" -HBR_DATA = "/home/cosmo/Documents/Repos/estimint/output/hbr_data/hbr_training_data.csv" -OUTPUT_DIR = Path("/home/cosmo/Documents/Repos/estimint/output/eir_to_hbr_data") - - -def prepare_data(): - print("Loading prevalence training data...") - df_prev = pd.read_csv(PREV_DATA) - print(f" {len(df_prev):,} rows") - - print("Loading HBR training data...") - df_hbr = pd.read_csv(HBR_DATA) - print(f" {len(df_hbr):,} rows") - - # Join on (parameter_index, simulation_index) - print("\nJoining on (parameter_index, simulation_index)...") - df = df_prev.merge( - df_hbr[["parameter_index", "simulation_index", "hbr_y9"]], - on=["parameter_index", "simulation_index"], - how="inner" - ) - print(f"Joined: {len(df):,} rows") - - # Keep: eir, interventions, hbr_y9 (target) - cols = ["parameter_index", "simulation_index", - "eir", "dn0_use", "Q0", "phi_bednets", "seasonal", - "itn_use", "irs_use", "hbr_y9"] - df = df[cols].copy() - - # Stats - print("\n=== Data Statistics ===") - print(f"EIR range: [{df['eir'].min():.2f}, {df['eir'].max():.2f}]") - print(f"HBR range: [{df['hbr_y9'].min():.2f}, {df['hbr_y9'].max():.2f}]") - print(f"Rows: {len(df):,}") - - # Save - OUTPUT_DIR.mkdir(parents=True, exist_ok=True) - csv_path = OUTPUT_DIR / "eir_to_hbr_training_data.csv" - df.to_csv(csv_path, index=False) - print(f"\nCSV saved to {csv_path}") - - return csv_path - - -if __name__ == "__main__": - prepare_data() diff --git a/scripts/prepare_hbr_data.py b/scripts/prepare_hbr_data.py deleted file mode 100644 index ecfc8a9..0000000 --- a/scripts/prepare_hbr_data.py +++ /dev/null @@ -1,136 +0,0 @@ -""" -Extract training data for HBR-based estiMINT model. - -This script: -1. Reads HBR_malaria_simulations_4096.duckdb (n_bitten, EIR_Anopheles, total_M, Im) -2. Reads malaria_simulations_4096.duckdb (intervention params + static EIR target) -3. Computes year 9 annual mean HBR = EIR_Anopheles * total_M / Im -4. Joins with intervention parameters -5. Saves as CSV for training -""" - -import duckdb -import pandas as pd -import numpy as np -from pathlib import Path - -# Configuration -HBR_DB_PATH = "/home/cosmo/Documents/Repos/MINT_DATA/HBR_malaria_simulations_4096.duckdb" -ORIG_DB_PATH = "/home/cosmo/Documents/Repos/MINT_DATA/malaria_simulations_4096.duckdb" -OUTPUT_DIR = Path("/home/cosmo/Documents/Repos/estimint/output/hbr_data") -INTERVENTION_DAY = 3285 # Day 3285 = 9 years -YEAR9_START = INTERVENTION_DAY - 365 # Day 2920 = start of year 9 - - -def extract_year9_data(): - """Extract year 9 HBR data from all simulations.""" - - # --- Step 1: Extract HBR from HBR database --- - print(f"Connecting to HBR DB: {HBR_DB_PATH}...") - conn_hbr = duckdb.connect(HBR_DB_PATH, read_only=True) - - total_rows, total_params = conn_hbr.execute(""" - SELECT COUNT(*) as total_rows, - COUNT(DISTINCT parameter_index) as unique_params - FROM simulation_results - """).fetchone() - print(f"HBR DB: {total_rows:,} rows, {total_params:,} parameter sets") - - print(f"\nExtracting year 9 mean HBR (days {YEAR9_START}-{INTERVENTION_DAY - 1})...") - print("HBR = EIR_Anopheles * total_M_Anopheles / Im_Anopheles_count") - - hbr_query = f""" - SELECT - parameter_index, - simulation_index, - AVG( - CASE WHEN Im_Anopheles_count > 0 - THEN EIR_Anopheles * total_M_Anopheles / Im_Anopheles_count - ELSE NULL - END - ) AS hbr_y9 - FROM simulation_results - WHERE timesteps >= {YEAR9_START} AND timesteps < {INTERVENTION_DAY} - GROUP BY parameter_index, simulation_index - """ - - print("Running HBR extraction query...") - df_hbr = conn_hbr.execute(hbr_query).fetchdf() - conn_hbr.close() - print(f"Extracted {len(df_hbr):,} rows from HBR DB") - - # --- Step 2: Extract intervention params from original database --- - print(f"\nConnecting to original DB: {ORIG_DB_PATH}...") - conn_orig = duckdb.connect(ORIG_DB_PATH, read_only=True) - - params_query = f""" - SELECT - parameter_index, - simulation_index, - MAX(eir) AS eir, - MAX(dn0_use) AS dn0_use, - MAX(Q0) AS Q0, - MAX(phi_bednets) AS phi_bednets, - MAX(seasonal) AS seasonal, - MAX(itn_use) AS itn_use, - MAX(irs_use) AS irs_use - FROM simulation_results - WHERE timesteps >= {YEAR9_START} AND timesteps < {INTERVENTION_DAY} - GROUP BY parameter_index, simulation_index - """ - - print("Running intervention params extraction query...") - df_params = conn_orig.execute(params_query).fetchdf() - conn_orig.close() - print(f"Extracted {len(df_params):,} rows from original DB") - - # --- Step 3: Join --- - print("\nJoining HBR with intervention parameters...") - df = df_params.merge(df_hbr, on=["parameter_index", "simulation_index"], how="inner") - print(f"Joined: {len(df):,} rows") - - # --- Step 4: Filter --- - # Remove rows where HBR is NaN (Im_Anopheles_count was 0 for all timesteps) - n_before = len(df) - df = df.dropna(subset=["hbr_y9"]) - n_nan = n_before - len(df) - if n_nan > 0: - print(f"Removed {n_nan} rows with NaN HBR (Im=0 throughout year 9)") - - # Remove rows with HBR <= 0 - n_before = len(df) - df = df[df["hbr_y9"] > 0].copy() - n_zero = n_before - len(df) - if n_zero > 0: - print(f"Removed {n_zero} rows with HBR <= 0") - - print(f"Final dataset: {len(df):,} rows") - - # --- Step 5: Statistics --- - print("\n=== Data Statistics ===") - print(f"EIR range: [{df['eir'].min():.2f}, {df['eir'].max():.2f}]") - print(f"HBR range: [{df['hbr_y9'].min():.2f}, {df['hbr_y9'].max():.2f}]") - print(f"dn0 range: [{df['dn0_use'].min():.4f}, {df['dn0_use'].max():.4f}]") - print(f"ITN range: [{df['itn_use'].min():.4f}, {df['itn_use'].max():.4f}]") - print(f"IRS range: [{df['irs_use'].min():.4f}, {df['irs_use'].max():.4f}]") - print(f"Seasonal: {df['seasonal'].value_counts().to_dict()}") - - # --- Step 6: Save --- - OUTPUT_DIR.mkdir(parents=True, exist_ok=True) - - csv_path = OUTPUT_DIR / "hbr_training_data.csv" - df.to_csv(csv_path, index=False) - print(f"\nCSV saved to {csv_path}") - - try: - parquet_path = OUTPUT_DIR / "hbr_training_data.parquet" - df.to_parquet(parquet_path, index=False) - print(f"Parquet saved to {parquet_path}") - except ImportError: - pass - - return csv_path - - -if __name__ == "__main__": - extract_year9_data() diff --git a/scripts/prepare_mint_data.py b/scripts/prepare_mint_data.py deleted file mode 100644 index 6ac3512..0000000 --- a/scripts/prepare_mint_data.py +++ /dev/null @@ -1,95 +0,0 @@ -""" -Extract training data from MINTelligence DuckDB for estiMINT retraining. - -This script: -1. Reads malaria_simulations_4096.duckdb -2. Extracts year 9 annual mean prevalence (avg over days 2920-3284) for each parameter set -3. Filters prevalence >= 0.02 (per user policy) -4. Saves as parquet for estiMINT training -""" - -import duckdb -import pandas as pd -from pathlib import Path - -# Configuration -DUCKDB_PATH = "/home/cosmo/Documents/Repos/MINT_DATA/malaria_simulations_4096.duckdb" -OUTPUT_DIR = Path("/home/cosmo/Documents/Repos/estimint/output/mint_data") -INTERVENTION_DAY = 3285 # Day 3285 = 9 years -YEAR9_START = INTERVENTION_DAY - 365 # Day 2920 = start of year 9 -MIN_PREVALENCE = 0.02 # User policy: never allow prevalence < 2% - -def extract_year9_data(): - """Extract year 9 data from all simulations.""" - print(f"Connecting to {DUCKDB_PATH}...") - conn = duckdb.connect(DUCKDB_PATH) - - # Check data size - total_rows, total_params = conn.execute(""" - SELECT COUNT(*) as total_rows, - COUNT(DISTINCT parameter_index) as unique_params - FROM simulation_results - """).fetchone() - print(f"Database contains: {total_rows:,} rows, {total_params:,} parameter sets") - - # Extract year 9 annual mean prevalence for all parameter sets - # Average over the full year before intervention (days 2920-3284) - print(f"\nExtracting annual mean prevalence for year 9 (days {YEAR9_START}-{INTERVENTION_DAY - 1})...") - - query = f""" - SELECT - parameter_index, - simulation_index, - MAX(eir) AS eir, - MAX(dn0_use) AS dn0_use, - MAX(Q0) AS Q0, - MAX(phi_bednets) AS phi_bednets, - MAX(seasonal) AS seasonal, - MAX(itn_use) AS itn_use, - MAX(irs_use) AS irs_use, - AVG(prevalence) AS prev_y9 - FROM simulation_results - WHERE timesteps >= {YEAR9_START} AND timesteps < {INTERVENTION_DAY} - GROUP BY parameter_index, simulation_index - """ - - print("Running extraction query...") - df = conn.execute(query).fetchdf() - conn.close() - - print(f"Extracted {len(df):,} rows (one per parameter×simulation)") - - # Filter by prevalence - print(f"\nFiltering prevalence >= {MIN_PREVALENCE}...") - df_filtered = df[df['prev_y9'] >= MIN_PREVALENCE].copy() - print(f"After filter: {len(df_filtered):,} rows ({len(df) - len(df_filtered):,} removed)") - - # Show statistics - print("\n=== Data Statistics ===") - print(f"EIR range: [{df_filtered['eir'].min():.2f}, {df_filtered['eir'].max():.2f}]") - print(f"Prevalence range: [{df_filtered['prev_y9'].min():.4f}, {df_filtered['prev_y9'].max():.4f}]") - print(f"dn0 range: [{df_filtered['dn0_use'].min():.4f}, {df_filtered['dn0_use'].max():.4f}]") - print(f"ITN range: [{df_filtered['itn_use'].min():.4f}, {df_filtered['itn_use'].max():.4f}]") - print(f"IRS range: [{df_filtered['irs_use'].min():.4f}, {df_filtered['irs_use'].max():.4f}]") - print(f"Seasonal: {df_filtered['seasonal'].value_counts().to_dict()}") - - # Save as both CSV (for train_on_mint_data.py) and parquet - OUTPUT_DIR.mkdir(parents=True, exist_ok=True) - - csv_path = OUTPUT_DIR / "mint_training_data.csv" - df_filtered.to_csv(csv_path, index=False) - print(f"\nCSV saved to {csv_path}") - - try: - parquet_path = OUTPUT_DIR / "mint_training_data.parquet" - df_filtered.to_parquet(parquet_path, index=False) - print(f"Parquet saved to {parquet_path}") - except ImportError: - pass - - output_path = csv_path - - return output_path - -if __name__ == "__main__": - extract_year9_data() diff --git a/src/estimint/__init__.py b/src/estimint/__init__.py index 022b0b9..3901ebf 100644 --- a/src/estimint/__init__.py +++ b/src/estimint/__init__.py @@ -15,7 +15,7 @@ - scikit-learn (stats::kmeans) """ -__version__ = "1.3.1" +__version__ = "1.4.0" __package_name__ = "estiMINT" # Public API exports @@ -57,6 +57,8 @@ from .hbr import estimate_eir_with_mosquito_delta +from .bednet import calculate_dn0, net_types, DN0Result + __all__ = [ # utils "ts", @@ -90,4 +92,8 @@ "run_xgb_model", # hbr "estimate_eir_with_mosquito_delta", + # bednet + "calculate_dn0", + "net_types", + "DN0Result", ] diff --git a/src/estimint/bednet.py b/src/estimint/bednet.py new file mode 100644 index 0000000..7e68432 --- /dev/null +++ b/src/estimint/bednet.py @@ -0,0 +1,79 @@ +"""Bednet -> dn0 estimator. + +`dn0` is the probability a mosquito dies on contact with a treated net — estiMINT's +bednet covariate. A bednet is specified as a usage mix over net types at an +insecticide-resistance level; this maps that spec to the usage-weighted dn0. + +Backed by the empirical resistance->dn0 table in data/itn_dn0.csv. +""" + +from __future__ import annotations + +from functools import lru_cache +from pathlib import Path +from typing import NamedTuple + +import numpy as np +import pandas as pd +from scipy.interpolate import UnivariateSpline + +_DATA = Path(__file__).parent / "data" / "itn_dn0.csv" + +# short alias -> canonical net-type name +_NET_TYPES = { + "py_only": "pyrethroid_only", + "py_pbo": "pyrethroid_pbo", + "py_pyrrole": "pyrethroid_pyrrole", + "py_ppf": "pyrethroid_ppf", +} +_NET_TYPES.update({v: v for v in _NET_TYPES.values()}) + + +class DN0Result(NamedTuple): + dn0: float # usage-weighted kill probability + itn_use: float # total pyrethroid-net usage + + +@lru_cache(maxsize=1) +def _splines() -> dict[str, UnivariateSpline]: + """Interpolating resistance->dn0 spline per net type (loaded/fit once).""" + df = pd.read_csv(_DATA).sort_values("resistance") + return { + nt: UnivariateSpline(g["resistance"].to_numpy(), g["dn0"].to_numpy(), s=0) + for nt, g in df.groupby("net_type") + } + + +def net_types() -> list[str]: + """Net types available in the dn0 table.""" + return sorted(_splines()) + + +def calculate_dn0(resistance_level: float, **usage: float) -> DN0Result: + """Usage-weighted dn0 for a bednet mix at a given resistance level. + + Pass net-type shares as keywords (short or canonical names), e.g. + ``calculate_dn0(0.5, py_only=0.4, py_pbo=0.6)``. Returns the weighted dn0 and + the total ITN usage. A mix summing to 0 returns (0, 0). + """ + if not usage: + raise ValueError("supply at least one = pair") + + mix: dict[str, float] = {} + for name, share in usage.items(): + canon = _NET_TYPES.get(name.lower()) + if canon is None: + raise ValueError(f"unknown net type: {name!r} (have {sorted(_NET_TYPES)})") + mix[canon] = mix.get(canon, 0.0) + share + + active = {nt: w for nt, w in mix.items() if w > 0} + if not active: + return DN0Result(0.0, 0.0) + + splines = _splines() + dn0 = float(np.average( + [float(splines[nt](resistance_level)) for nt in active], + weights=list(active.values()), + )) + itn_use = float(sum(w for nt, w in active.items() if nt.startswith("pyrethroid"))) + return DN0Result(dn0=dn0, itn_use=itn_use) diff --git a/src/estimint/data/itn_dn0.csv b/src/estimint/data/itn_dn0.csv new file mode 100644 index 0000000..b6815ee --- /dev/null +++ b/src/estimint/data/itn_dn0.csv @@ -0,0 +1,405 @@ +"resistance","dn0","net_type" +0,0.3376,"pyrethroid_only" +0.01,0.33695,"pyrethroid_only" +0.02,0.33625,"pyrethroid_only" +0.03,0.3353,"pyrethroid_only" +0.04,0.33435,"pyrethroid_only" +0.05,0.33345,"pyrethroid_only" +0.06,0.333,"pyrethroid_only" +0.07,0.332,"pyrethroid_only" +0.08,0.3311,"pyrethroid_only" +0.09,0.3306,"pyrethroid_only" +0.1,0.33,"pyrethroid_only" +0.11,0.329,"pyrethroid_only" +0.12,0.3282,"pyrethroid_only" +0.13,0.32745,"pyrethroid_only" +0.14,0.32665,"pyrethroid_only" +0.15,0.3255,"pyrethroid_only" +0.16,0.32475,"pyrethroid_only" +0.17,0.324,"pyrethroid_only" +0.18,0.3231,"pyrethroid_only" +0.19,0.322,"pyrethroid_only" +0.2,0.3207,"pyrethroid_only" +0.21,0.31985,"pyrethroid_only" +0.22,0.3189,"pyrethroid_only" +0.23,0.3181,"pyrethroid_only" +0.24,0.3171,"pyrethroid_only" +0.25,0.3163,"pyrethroid_only" +0.26,0.3154,"pyrethroid_only" +0.27,0.3143,"pyrethroid_only" +0.28,0.313,"pyrethroid_only" +0.29,0.31195,"pyrethroid_only" +0.3,0.311,"pyrethroid_only" +0.31,0.3098,"pyrethroid_only" +0.32,0.3086,"pyrethroid_only" +0.33,0.3079,"pyrethroid_only" +0.34,0.3067,"pyrethroid_only" +0.35,0.3056,"pyrethroid_only" +0.36,0.3047,"pyrethroid_only" +0.37,0.3038,"pyrethroid_only" +0.38,0.3024,"pyrethroid_only" +0.39,0.3009,"pyrethroid_only" +0.4,0.29925,"pyrethroid_only" +0.41,0.298,"pyrethroid_only" +0.42,0.29705,"pyrethroid_only" +0.43,0.2954,"pyrethroid_only" +0.44,0.2943,"pyrethroid_only" +0.45,0.29275,"pyrethroid_only" +0.46,0.2913,"pyrethroid_only" +0.47,0.2901,"pyrethroid_only" +0.48,0.28825,"pyrethroid_only" +0.49,0.28615,"pyrethroid_only" +0.5,0.285,"pyrethroid_only" +0.51,0.2836,"pyrethroid_only" +0.52,0.2818,"pyrethroid_only" +0.53,0.2804,"pyrethroid_only" +0.54,0.2791,"pyrethroid_only" +0.55,0.2776,"pyrethroid_only" +0.56,0.27585,"pyrethroid_only" +0.57,0.27415,"pyrethroid_only" +0.58,0.27235,"pyrethroid_only" +0.59,0.27075,"pyrethroid_only" +0.6,0.26835,"pyrethroid_only" +0.61,0.26585,"pyrethroid_only" +0.62,0.26355,"pyrethroid_only" +0.63,0.2618,"pyrethroid_only" +0.64,0.25935,"pyrethroid_only" +0.65,0.2571,"pyrethroid_only" +0.66,0.25475,"pyrethroid_only" +0.67,0.25305,"pyrethroid_only" +0.68,0.25135,"pyrethroid_only" +0.69,0.2489,"pyrethroid_only" +0.7,0.24675,"pyrethroid_only" +0.71,0.2441,"pyrethroid_only" +0.72,0.2423,"pyrethroid_only" +0.73,0.23975,"pyrethroid_only" +0.74,0.23695,"pyrethroid_only" +0.75,0.2344,"pyrethroid_only" +0.76,0.2311,"pyrethroid_only" +0.77,0.2273,"pyrethroid_only" +0.78,0.2247,"pyrethroid_only" +0.79,0.22155,"pyrethroid_only" +0.8,0.2175,"pyrethroid_only" +0.81,0.21405,"pyrethroid_only" +0.82,0.21005,"pyrethroid_only" +0.83,0.2064,"pyrethroid_only" +0.84,0.20275,"pyrethroid_only" +0.85,0.19715,"pyrethroid_only" +0.86,0.19205,"pyrethroid_only" +0.87,0.18725,"pyrethroid_only" +0.88,0.1817,"pyrethroid_only" +0.89,0.17575,"pyrethroid_only" +0.9,0.1694,"pyrethroid_only" +0.91,0.16265,"pyrethroid_only" +0.92,0.15495,"pyrethroid_only" +0.93,0.1468,"pyrethroid_only" +0.94,0.13795,"pyrethroid_only" +0.95,0.12805,"pyrethroid_only" +0.96,0.1162,"pyrethroid_only" +0.97,0.1022,"pyrethroid_only" +0.98,0.08455,"pyrethroid_only" +0.99,0.0601,"pyrethroid_only" +1,0,"pyrethroid_only" +0,0.50935,"pyrethroid_pbo" +0.01,0.50875,"pyrethroid_pbo" +0.02,0.5084,"pyrethroid_pbo" +0.03,0.5078,"pyrethroid_pbo" +0.04,0.5072,"pyrethroid_pbo" +0.05,0.5066,"pyrethroid_pbo" +0.06,0.50585,"pyrethroid_pbo" +0.07,0.5051,"pyrethroid_pbo" +0.08,0.5043,"pyrethroid_pbo" +0.09,0.5036,"pyrethroid_pbo" +0.1,0.50295,"pyrethroid_pbo" +0.11,0.50235,"pyrethroid_pbo" +0.12,0.5015,"pyrethroid_pbo" +0.13,0.5009,"pyrethroid_pbo" +0.14,0.50025,"pyrethroid_pbo" +0.15,0.49895,"pyrethroid_pbo" +0.16,0.4979,"pyrethroid_pbo" +0.17,0.4972,"pyrethroid_pbo" +0.18,0.4966,"pyrethroid_pbo" +0.19,0.49565,"pyrethroid_pbo" +0.2,0.4948,"pyrethroid_pbo" +0.21,0.49355,"pyrethroid_pbo" +0.22,0.4925,"pyrethroid_pbo" +0.23,0.4913,"pyrethroid_pbo" +0.24,0.49035,"pyrethroid_pbo" +0.25,0.4893,"pyrethroid_pbo" +0.26,0.4882,"pyrethroid_pbo" +0.27,0.4876,"pyrethroid_pbo" +0.28,0.48685,"pyrethroid_pbo" +0.29,0.48595,"pyrethroid_pbo" +0.3,0.48495,"pyrethroid_pbo" +0.31,0.4838,"pyrethroid_pbo" +0.32,0.48275,"pyrethroid_pbo" +0.33,0.4815,"pyrethroid_pbo" +0.34,0.4801,"pyrethroid_pbo" +0.35,0.4789,"pyrethroid_pbo" +0.36,0.478,"pyrethroid_pbo" +0.37,0.47695,"pyrethroid_pbo" +0.38,0.47545,"pyrethroid_pbo" +0.39,0.4738,"pyrethroid_pbo" +0.4,0.4722,"pyrethroid_pbo" +0.41,0.4709,"pyrethroid_pbo" +0.42,0.46965,"pyrethroid_pbo" +0.43,0.4684,"pyrethroid_pbo" +0.44,0.46645,"pyrethroid_pbo" +0.45,0.46445,"pyrethroid_pbo" +0.46,0.463,"pyrethroid_pbo" +0.47,0.4618,"pyrethroid_pbo" +0.48,0.4596,"pyrethroid_pbo" +0.49,0.458,"pyrethroid_pbo" +0.5,0.45665,"pyrethroid_pbo" +0.51,0.45485,"pyrethroid_pbo" +0.52,0.4521,"pyrethroid_pbo" +0.53,0.4499,"pyrethroid_pbo" +0.54,0.4477,"pyrethroid_pbo" +0.55,0.44565,"pyrethroid_pbo" +0.56,0.44385,"pyrethroid_pbo" +0.57,0.4421,"pyrethroid_pbo" +0.58,0.4408,"pyrethroid_pbo" +0.59,0.43885,"pyrethroid_pbo" +0.6,0.43665,"pyrethroid_pbo" +0.61,0.4343,"pyrethroid_pbo" +0.62,0.43155,"pyrethroid_pbo" +0.63,0.42945,"pyrethroid_pbo" +0.64,0.427,"pyrethroid_pbo" +0.65,0.4249,"pyrethroid_pbo" +0.66,0.42265,"pyrethroid_pbo" +0.67,0.4194,"pyrethroid_pbo" +0.68,0.41695,"pyrethroid_pbo" +0.69,0.4134,"pyrethroid_pbo" +0.7,0.41,"pyrethroid_pbo" +0.71,0.4064,"pyrethroid_pbo" +0.72,0.4032,"pyrethroid_pbo" +0.73,0.39995,"pyrethroid_pbo" +0.74,0.39585,"pyrethroid_pbo" +0.75,0.39165,"pyrethroid_pbo" +0.76,0.38695,"pyrethroid_pbo" +0.77,0.3832,"pyrethroid_pbo" +0.78,0.37685,"pyrethroid_pbo" +0.79,0.37245,"pyrethroid_pbo" +0.8,0.36675,"pyrethroid_pbo" +0.81,0.3621,"pyrethroid_pbo" +0.82,0.35645,"pyrethroid_pbo" +0.83,0.34985,"pyrethroid_pbo" +0.84,0.34285,"pyrethroid_pbo" +0.85,0.3344,"pyrethroid_pbo" +0.86,0.32665,"pyrethroid_pbo" +0.87,0.3178,"pyrethroid_pbo" +0.88,0.31045,"pyrethroid_pbo" +0.89,0.30185,"pyrethroid_pbo" +0.9,0.2913,"pyrethroid_pbo" +0.91,0.2811,"pyrethroid_pbo" +0.92,0.2697,"pyrethroid_pbo" +0.93,0.25735,"pyrethroid_pbo" +0.94,0.2438,"pyrethroid_pbo" +0.95,0.2285,"pyrethroid_pbo" +0.96,0.21145,"pyrethroid_pbo" +0.97,0.1912,"pyrethroid_pbo" +0.98,0.1701,"pyrethroid_pbo" +0.99,0.1387,"pyrethroid_pbo" +1,0.0714,"pyrethroid_pbo" +0,0.5611,"pyrethroid_pyrrole" +0.01,0.5608,"pyrethroid_pyrrole" +0.02,0.5606,"pyrethroid_pyrrole" +0.03,0.56035,"pyrethroid_pyrrole" +0.04,0.56,"pyrethroid_pyrrole" +0.05,0.5597,"pyrethroid_pyrrole" +0.06,0.55945,"pyrethroid_pyrrole" +0.07,0.5592,"pyrethroid_pyrrole" +0.08,0.55885,"pyrethroid_pyrrole" +0.09,0.5585,"pyrethroid_pyrrole" +0.1,0.5582,"pyrethroid_pyrrole" +0.11,0.5578,"pyrethroid_pyrrole" +0.12,0.5575,"pyrethroid_pyrrole" +0.13,0.5572,"pyrethroid_pyrrole" +0.14,0.55695,"pyrethroid_pyrrole" +0.15,0.55665,"pyrethroid_pyrrole" +0.16,0.5563,"pyrethroid_pyrrole" +0.17,0.55605,"pyrethroid_pyrrole" +0.18,0.55565,"pyrethroid_pyrrole" +0.19,0.5553,"pyrethroid_pyrrole" +0.2,0.5549,"pyrethroid_pyrrole" +0.21,0.55445,"pyrethroid_pyrrole" +0.22,0.55395,"pyrethroid_pyrrole" +0.23,0.5535,"pyrethroid_pyrrole" +0.24,0.55305,"pyrethroid_pyrrole" +0.25,0.5526,"pyrethroid_pyrrole" +0.26,0.55215,"pyrethroid_pyrrole" +0.27,0.5517,"pyrethroid_pyrrole" +0.28,0.5512,"pyrethroid_pyrrole" +0.29,0.55075,"pyrethroid_pyrrole" +0.3,0.55015,"pyrethroid_pyrrole" +0.31,0.54975,"pyrethroid_pyrrole" +0.32,0.5493,"pyrethroid_pyrrole" +0.33,0.54875,"pyrethroid_pyrrole" +0.34,0.5481,"pyrethroid_pyrrole" +0.35,0.54745,"pyrethroid_pyrrole" +0.36,0.5469,"pyrethroid_pyrrole" +0.37,0.5463,"pyrethroid_pyrrole" +0.38,0.54555,"pyrethroid_pyrrole" +0.39,0.545,"pyrethroid_pyrrole" +0.4,0.5444,"pyrethroid_pyrrole" +0.41,0.54365,"pyrethroid_pyrrole" +0.42,0.543,"pyrethroid_pyrrole" +0.43,0.5423,"pyrethroid_pyrrole" +0.44,0.54145,"pyrethroid_pyrrole" +0.45,0.5407,"pyrethroid_pyrrole" +0.46,0.53985,"pyrethroid_pyrrole" +0.47,0.5391,"pyrethroid_pyrrole" +0.48,0.5387,"pyrethroid_pyrrole" +0.49,0.538,"pyrethroid_pyrrole" +0.5,0.53705,"pyrethroid_pyrrole" +0.51,0.5362,"pyrethroid_pyrrole" +0.52,0.53535,"pyrethroid_pyrrole" +0.53,0.5346,"pyrethroid_pyrrole" +0.54,0.5335,"pyrethroid_pyrrole" +0.55,0.5322,"pyrethroid_pyrrole" +0.56,0.53095,"pyrethroid_pyrrole" +0.57,0.52965,"pyrethroid_pyrrole" +0.58,0.52835,"pyrethroid_pyrrole" +0.59,0.5272,"pyrethroid_pyrrole" +0.6,0.526,"pyrethroid_pyrrole" +0.61,0.5248,"pyrethroid_pyrrole" +0.62,0.52335,"pyrethroid_pyrrole" +0.63,0.5218,"pyrethroid_pyrrole" +0.64,0.5204,"pyrethroid_pyrrole" +0.65,0.51895,"pyrethroid_pyrrole" +0.66,0.517,"pyrethroid_pyrrole" +0.67,0.5147,"pyrethroid_pyrrole" +0.68,0.5125,"pyrethroid_pyrrole" +0.69,0.5105,"pyrethroid_pyrrole" +0.7,0.50815,"pyrethroid_pyrrole" +0.71,0.50665,"pyrethroid_pyrrole" +0.72,0.50485,"pyrethroid_pyrrole" +0.73,0.50285,"pyrethroid_pyrrole" +0.74,0.5003,"pyrethroid_pyrrole" +0.75,0.49645,"pyrethroid_pyrrole" +0.76,0.49245,"pyrethroid_pyrrole" +0.77,0.48945,"pyrethroid_pyrrole" +0.78,0.48595,"pyrethroid_pyrrole" +0.79,0.4821,"pyrethroid_pyrrole" +0.8,0.4785,"pyrethroid_pyrrole" +0.81,0.4745,"pyrethroid_pyrrole" +0.82,0.4707,"pyrethroid_pyrrole" +0.83,0.4663,"pyrethroid_pyrrole" +0.84,0.4611,"pyrethroid_pyrrole" +0.85,0.45375,"pyrethroid_pyrrole" +0.86,0.4487,"pyrethroid_pyrrole" +0.87,0.44215,"pyrethroid_pyrrole" +0.88,0.43495,"pyrethroid_pyrrole" +0.89,0.42685,"pyrethroid_pyrrole" +0.9,0.4184,"pyrethroid_pyrrole" +0.91,0.4084,"pyrethroid_pyrrole" +0.92,0.39935,"pyrethroid_pyrrole" +0.93,0.38825,"pyrethroid_pyrrole" +0.94,0.3751,"pyrethroid_pyrrole" +0.95,0.35935,"pyrethroid_pyrrole" +0.96,0.34085,"pyrethroid_pyrrole" +0.97,0.3195,"pyrethroid_pyrrole" +0.98,0.2931,"pyrethroid_pyrrole" +0.99,0.25815,"pyrethroid_pyrrole" +1,0.1522,"pyrethroid_pyrrole" +0,0.411138322,"pyrethroid_ppf" +0.01,0.410738335,"pyrethroid_ppf" +0.02,0.41027309,"pyrethroid_ppf" +0.03,0.409793133,"pyrethroid_ppf" +0.04,0.409306743,"pyrethroid_ppf" +0.05,0.408875158,"pyrethroid_ppf" +0.06,0.408389163,"pyrethroid_ppf" +0.07,0.407874187,"pyrethroid_ppf" +0.08,0.407368169,"pyrethroid_ppf" +0.09,0.406911369,"pyrethroid_ppf" +0.1,0.406394202,"pyrethroid_ppf" +0.11,0.405999656,"pyrethroid_ppf" +0.12,0.405512629,"pyrethroid_ppf" +0.13,0.404948765,"pyrethroid_ppf" +0.14,0.404325166,"pyrethroid_ppf" +0.15,0.403752309,"pyrethroid_ppf" +0.16,0.403259012,"pyrethroid_ppf" +0.17,0.402601499,"pyrethroid_ppf" +0.18,0.40205787,"pyrethroid_ppf" +0.19,0.401456336,"pyrethroid_ppf" +0.2,0.400865377,"pyrethroid_ppf" +0.21,0.40027895,"pyrethroid_ppf" +0.22,0.399787476,"pyrethroid_ppf" +0.23,0.399281617,"pyrethroid_ppf" +0.24,0.398658067,"pyrethroid_ppf" +0.25,0.39795047,"pyrethroid_ppf" +0.26,0.397332943,"pyrethroid_ppf" +0.27,0.396701888,"pyrethroid_ppf" +0.28,0.396064943,"pyrethroid_ppf" +0.29,0.395419071,"pyrethroid_ppf" +0.3,0.394717478,"pyrethroid_ppf" +0.31,0.39403687,"pyrethroid_ppf" +0.32,0.393265359,"pyrethroid_ppf" +0.33,0.39251508,"pyrethroid_ppf" +0.34,0.391647871,"pyrethroid_ppf" +0.35,0.390971017,"pyrethroid_ppf" +0.36,0.390280416,"pyrethroid_ppf" +0.37,0.389557538,"pyrethroid_ppf" +0.38,0.388838859,"pyrethroid_ppf" +0.39,0.388147134,"pyrethroid_ppf" +0.4,0.387212218,"pyrethroid_ppf" +0.41,0.386376772,"pyrethroid_ppf" +0.42,0.385543955,"pyrethroid_ppf" +0.43,0.384680441,"pyrethroid_ppf" +0.44,0.383842695,"pyrethroid_ppf" +0.45,0.382830366,"pyrethroid_ppf" +0.46,0.381868795,"pyrethroid_ppf" +0.47,0.380873363,"pyrethroid_ppf" +0.48,0.379781032,"pyrethroid_ppf" +0.49,0.378745029,"pyrethroid_ppf" +0.5,0.377749115,"pyrethroid_ppf" +0.51,0.376677561,"pyrethroid_ppf" +0.52,0.375641263,"pyrethroid_ppf" +0.53,0.374596265,"pyrethroid_ppf" +0.54,0.373553848,"pyrethroid_ppf" +0.55,0.37252551,"pyrethroid_ppf" +0.56,0.371450504,"pyrethroid_ppf" +0.57,0.370258805,"pyrethroid_ppf" +0.58,0.368827711,"pyrethroid_ppf" +0.59,0.367562241,"pyrethroid_ppf" +0.6,0.366180224,"pyrethroid_ppf" +0.61,0.364761708,"pyrethroid_ppf" +0.62,0.363175718,"pyrethroid_ppf" +0.63,0.361744949,"pyrethroid_ppf" +0.64,0.360302284,"pyrethroid_ppf" +0.65,0.358678589,"pyrethroid_ppf" +0.66,0.357034765,"pyrethroid_ppf" +0.67,0.35554949,"pyrethroid_ppf" +0.68,0.353882977,"pyrethroid_ppf" +0.69,0.352172989,"pyrethroid_ppf" +0.7,0.350214118,"pyrethroid_ppf" +0.71,0.348222221,"pyrethroid_ppf" +0.72,0.346098465,"pyrethroid_ppf" +0.73,0.344039531,"pyrethroid_ppf" +0.74,0.341698733,"pyrethroid_ppf" +0.75,0.339364293,"pyrethroid_ppf" +0.76,0.336432692,"pyrethroid_ppf" +0.77,0.333829905,"pyrethroid_ppf" +0.78,0.331296034,"pyrethroid_ppf" +0.79,0.328694818,"pyrethroid_ppf" +0.8,0.326090596,"pyrethroid_ppf" +0.81,0.323094398,"pyrethroid_ppf" +0.82,0.319969709,"pyrethroid_ppf" +0.83,0.316541081,"pyrethroid_ppf" +0.84,0.312907154,"pyrethroid_ppf" +0.85,0.308905452,"pyrethroid_ppf" +0.86,0.304491459,"pyrethroid_ppf" +0.87,0.299954622,"pyrethroid_ppf" +0.88,0.295134079,"pyrethroid_ppf" +0.89,0.290115536,"pyrethroid_ppf" +0.9,0.284421787,"pyrethroid_ppf" +0.91,0.2785551,"pyrethroid_ppf" +0.92,0.272253533,"pyrethroid_ppf" +0.93,0.264629624,"pyrethroid_ppf" +0.94,0.256081849,"pyrethroid_ppf" +0.95,0.246336764,"pyrethroid_ppf" +0.96,0.234677895,"pyrethroid_ppf" +0.97,0.221119723,"pyrethroid_ppf" +0.98,0.203330407,"pyrethroid_ppf" +0.99,0.178925153,"pyrethroid_ppf" +1,0.108489717,"pyrethroid_ppf" From a56f7eed855642b7b013e90077f0a0aa9103d29e Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Tue, 23 Jun 2026 14:29:54 +0100 Subject: [PATCH 02/30] update README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3be6309..eb94116 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Python port of the estiMINT R package for EIR (Entomological Inoculation Rate) estimation using machine learning. +Estimators: EIR from prevalence, EIR↔HBR (incl. the effect of mosquito-density changes), and bednet spec (net type + resistance) → `dn0`. + ## Installation ```bash From 992af0253b86704da3cb056193afd58d0c2494ca Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Tue, 23 Jun 2026 14:55:47 +0100 Subject: [PATCH 03/30] update README, more tests and remove fluff --- .coverage | Bin 0 -> 53248 bytes README.md | 19 ++++++--- datasets/README.md | 5 --- models/consolidate.py | 72 ----------------------------------- models/hbr/prepare.py | 2 +- models/prevalence/prepare.py | 2 +- tests/test_bednet.py | 52 +++++++++++++++++++++++++ tests/test_flows.py | 66 ++++++++++++++++++++++++++++++++ 8 files changed, 133 insertions(+), 85 deletions(-) create mode 100644 .coverage delete mode 100644 models/consolidate.py create mode 100644 tests/test_bednet.py create mode 100644 tests/test_flows.py diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..215ea203af380f2f3ea31fa6d4b72019e977232e GIT binary patch literal 53248 zcmeI4ON<;x8ON)qd#0ynXSN)h)v(z_TN0r4D*NzYOFWFSvmusjFv`n8Ic3~4Q#;!* z(>?C)v3DhmGeblW7sQD};K&(?a7!STa)~(bxFr{GE+ia)#5@i-V7}_dJZx{29m!ha z{98NysH*R)@B7tPRa4zN{nQg@oluG`&+piwIL;0+O=DFd7-JTFO7uxLlTM8Ef{xnQ z`Cg|MTl@YeO8o1rn0totXG{0<)ncpo-pr4SpSPZ#am*EKjWV!-00@8p2;4IS`cD+i z^8CCuxE$K`whVo{A^mt?`tp;fHqV_B=QbZXdrHJ<;%Gt8wz?`dh3{PwUFnN0r!9r! zHl2nYI&MpZ+cGWP3uIHxS(HYzmMXXw$*Z%P(k0q13#^{WM?;x2JPlUI~IM++Djs#WJBpli7_BwS!{*7Lzs~U$S z;)+9WFUh@RLoadmL$}Qx+H&OYM02LdRg1<_J=eL=lf%Ye5hKZ!$PL$95y}aQfX~e2 z%3nC5F^WpL6I^K1SEriY3%%&NMvY&q(60FWeR;FIxTw8wAqo_Qr&f2uV0dCp1kEsc zkI+&1d&iCHC6hs-dQrPAysfCqC}|Nl4n^~LpIJ{~*uLs$!b=L0r3V^q%2={N)Z1Qt zGS;Gq2_$t88Vk~5TRpd-x=NsYXm}T;Z@1)Hk{b^T2OUThIu$EdKDD@4=nO-kRvDfa z`tv!nys)4RtSF3<)=CcML{{qkUOhpuDrRh zmpe(hS|vHj_f5kr&&_H5xJRgQNqw>tPNQp6 z*sgoMFp6Jw8HJ~sdq(!g3P#r{dn&aY6{qg~xEBNtO{;3!3ci@8iluEkP@_<=B*7*mQ#!e*Vg4L-y0m}MNvC7G&1Ak(({QYn z#(vc~RXy<_LV{w6I%Pmz^cJ0|(j-@nSgHQCE-_JBJ9abf?y6D7G+x@4x2cO~qetyf zhE7KcRU|Sd3am?ZAR4};%w#T&3?pLOw^|jeIZZj~7#e%Cyrh3n?5HNLRn%UslJn}T zTz^qB%MU%I^?OMVjt8e&K;Hy9cIs<#nVE>JTQWyM_85)Q^c875xD@a)hUzk|L5+xU zv)5yEX{qE3Qejyw@HKve(H}Mt009sH0T2KI5C8!X009sH0T2LzdyjywWi(T*|15C8!X009sH0T2KI5C8!X_}CJt&KRtp zUElUPl3t$?biDOPy+*Gi-7r{xQg*#yT?X{ybNYStdf+!k7cF|1h20M5XYCsW(xC5O zLtQpq8IppNmd-BkUw*spE8+Z9!hX*s;i@^E^FioE@8sz2ZstgXxqsukZ7);K$_(buL>k*@!8UHDNk@xrlFHs^k5C8!X009sH0T2KI5C8!X z009vAKP7OoU})A(X5eL*V9!0q*b;m02)k;rYX-gOo}P8HF74@I_xazv8T|J!ySn+^ zA2RkVrBQa#BH{b9gO^$L^_v^dOw_piiC-@Vbea`s#Q(&u!_TG0o;HIvG!j2&NI z}n>tonHNY4!ZSz+Ykf27iVBh5wPi#^0d(0Keyd z;{QnW-~a+300JNY0w4eaAOHd&00JNY0w8dJ1l0WjEmMdNSt~l2(M!3m00ck)1V8`;KmY_l00cnb;0dVT|6~1s@a+H#KmY_l00ck)1V8`;KmY_l L00cnbZW8z(nvReU literal 0 HcmV?d00001 diff --git a/README.md b/README.md index eb94116..cf3a3f1 100644 --- a/README.md +++ b/README.md @@ -32,14 +32,12 @@ pip install -r requirements.txt ## Data & retraining pipeline -All training data lives in a single source, `datasets/estimint_simulations_y9.parquet`, built -from the raw simulation DuckDBs by `models/consolidate.py`. Two model folders derive -their views and train from it: +All training data lives in `datasets/estimint_simulations_y9.parquet`. Two model folders +derive their views from it and train: ``` datasets/ # training data (see datasets/README.md) models/ - consolidate.py # raw DuckDBs -> datasets/estimint_simulations_y9.parquet prevalence/ # prev_y9 -> EIR (estiMINT_model.pkl) hbr/ # HBR<->EIR sub-models (estiMINT_HBR_model.pkl, estiMINT_EIR_to_HBR_model.pkl) ``` @@ -47,8 +45,7 @@ models/ Retrain a model end-to-end, e.g. the prevalence model: ```bash -python models/consolidate.py # (re)build the single source from the DuckDBs -python models/prevalence/prepare.py # derive the training view +python models/prevalence/prepare.py # derive the training view from the parquet python models/prevalence/train.py # train -> estiMINT_model.pkl + metrics/ + plots/ ``` @@ -147,6 +144,16 @@ df["eir_log10"] = np.log10(df["eir"]) df = strata_and_split(df, k_strata=16, seed=42) ``` +## Testing + +```bash +pip install -e ".[dev]" +pytest +``` + +Covers the metric/utility helpers plus the three estimator flows: prevalence→EIR +inference, the mosquito-delta HBR pipeline, and bednet→dn0. + ## Key Differences from R Version 1. **File format**: Models saved as `.pkl` (pickle) instead of `.rds` diff --git a/datasets/README.md b/datasets/README.md index 5d33939..44b7de9 100644 --- a/datasets/README.md +++ b/datasets/README.md @@ -6,9 +6,4 @@ Training data for retraining the estiMINT models. Not shipped with the package. year-9 aggregates. Columns: `parameter_index`, `simulation_index`, `eir`, `dn0_use`, `Q0`, `phi_bednets`, `seasonal`, `itn_use`, `irs_use`, `prev_y9`, `hbr_y9`. -Rebuild from the raw DuckDBs in `MINT_DATA/`: -``` -python models/consolidate.py -``` - Each model's `prepare.py` filters this source and sorts by key into its training view. diff --git a/models/consolidate.py b/models/consolidate.py deleted file mode 100644 index 635e035..0000000 --- a/models/consolidate.py +++ /dev/null @@ -1,72 +0,0 @@ -"""Build the single estiMINT data source from the two raw simulation DuckDBs. - -Joins the epi DB (eir, interventions, prevalence) and the entomology DB (HBR signal) -on (parameter_index, simulation_index) into one year-9 aggregated table. This parquet -is the sole source of truth; the per-model training views are derived from it. - -Each column is computed with the same SQL as the original extraction so values are -bit-identical to the legacy pipeline. -""" - -import duckdb -import pandas as pd - -EPI_DB = "/home/cosmo/Documents/Repos/MINT_DATA/malaria_simulations_4096.duckdb" -ENTO_DB = "/home/cosmo/Documents/Repos/MINT_DATA/HBR_malaria_simulations_4096.duckdb" -OUT = "/home/cosmo/Documents/Repos/estimint/datasets/estimint_simulations_y9.parquet" - -INTERVENTION_DAY = 3285 # day 3285 = 9 years -YEAR9_START = INTERVENTION_DAY - 365 - -KEYS = ["parameter_index", "simulation_index"] - -EPI_QUERY = f""" -SELECT - parameter_index, - simulation_index, - MAX(eir) AS eir, - MAX(dn0_use) AS dn0_use, - MAX(Q0) AS Q0, - MAX(phi_bednets) AS phi_bednets, - MAX(seasonal) AS seasonal, - MAX(itn_use) AS itn_use, - MAX(irs_use) AS irs_use, - AVG(prevalence) AS prev_y9 -FROM simulation_results -WHERE timesteps >= {YEAR9_START} AND timesteps < {INTERVENTION_DAY} -GROUP BY parameter_index, simulation_index -""" - -ENTO_QUERY = f""" -SELECT - parameter_index, - simulation_index, - AVG(CASE WHEN Im_Anopheles_count > 0 - THEN EIR_Anopheles * total_M_Anopheles / Im_Anopheles_count END) AS hbr_y9 -FROM simulation_results -WHERE timesteps >= {YEAR9_START} AND timesteps < {INTERVENTION_DAY} -GROUP BY parameter_index, simulation_index -""" - - -def build(): - with duckdb.connect(EPI_DB, read_only=True) as epi: - df_epi = epi.execute(EPI_QUERY).fetchdf() - with duckdb.connect(ENTO_DB, read_only=True) as ento: - df_hbr = ento.execute(ENTO_QUERY).fetchdf() - - df = df_epi.merge(df_hbr, on=KEYS, how="inner").sort_values(KEYS).reset_index(drop=True) - - assert len(df) == 16384, f"expected 16,384 keys, got {len(df):,}" - df.to_parquet(OUT, index=False) - - print(f"rows={len(df):,} params={df.parameter_index.nunique()} sims={df.simulation_index.nunique()}") - print(f"prev_y9 [{df.prev_y9.min():.4f}, {df.prev_y9.max():.4f}] " - f"prev>=0.02: {(df.prev_y9 >= 0.02).sum():,}") - print(f"hbr_y9 [{df.hbr_y9.min():.2f}, {df.hbr_y9.max():.2f}] " - f"hbr>0: {(df.hbr_y9 > 0).sum():,} null: {df.hbr_y9.isna().sum():,}") - print(f"wrote {OUT}") - - -if __name__ == "__main__": - build() diff --git a/models/hbr/prepare.py b/models/hbr/prepare.py index a3c9afa..0ee44af 100644 --- a/models/hbr/prepare.py +++ b/models/hbr/prepare.py @@ -1,4 +1,4 @@ -"""Derive the two HBR training views from the consolidated source. +"""Derive the two HBR training views from datasets/estimint_simulations_y9.parquet. - hbr_training: HBR->EIR model (hbr_y9 > 0) - eir_to_hbr_training: EIR->HBR model (prev_y9 >= 0.02 AND hbr_y9 > 0) diff --git a/models/prevalence/prepare.py b/models/prevalence/prepare.py index c97cfd5..8edfbc6 100644 --- a/models/prevalence/prepare.py +++ b/models/prevalence/prepare.py @@ -1,4 +1,4 @@ -"""Derive the prevalence->EIR training view from the consolidated source. +"""Derive the prevalence->EIR training view from datasets/estimint_simulations_y9.parquet. Filters prev_y9 >= 0.02 and sorts by key for a deterministic, reproducible view. """ diff --git a/tests/test_bednet.py b/tests/test_bednet.py new file mode 100644 index 0000000..34647c6 --- /dev/null +++ b/tests/test_bednet.py @@ -0,0 +1,52 @@ +"""Tests for the bednet -> dn0 estimator.""" + +import pytest + +from estimint import calculate_dn0, net_types +from estimint.bednet import DN0Result + + +class TestNetTypes: + def test_lists_four_canonical_types(self): + types = net_types() + assert types == [ + "pyrethroid_only", + "pyrethroid_pbo", + "pyrethroid_ppf", + "pyrethroid_pyrrole", + ] + + +class TestCalculateDn0: + def test_returns_dn0_result(self): + res = calculate_dn0(0.5, py_only=1.0) + assert isinstance(res, DN0Result) + assert 0.0 <= res.dn0 <= 1.0 + assert res.itn_use == 1.0 + + def test_short_and_canonical_names_agree(self): + assert calculate_dn0(0.5, py_only=1.0) == calculate_dn0(0.5, pyrethroid_only=1.0) + + def test_usage_weighted_average(self): + a = calculate_dn0(0.4, py_only=1.0).dn0 + b = calculate_dn0(0.4, py_pbo=1.0).dn0 + mixed = calculate_dn0(0.4, py_only=0.5, py_pbo=0.5).dn0 + assert mixed == pytest.approx((a + b) / 2) + + def test_itn_use_sums_pyrethroid_shares(self): + assert calculate_dn0(0.5, py_only=0.4, py_pbo=0.3, py_ppf=0.1).itn_use == pytest.approx(0.8) + + def test_resistance_lowers_dn0(self): + # plain pyrethroid nets lose efficacy as resistance rises + assert calculate_dn0(0.0, py_only=1.0).dn0 > calculate_dn0(1.0, py_only=1.0).dn0 + + def test_zero_mix_returns_zero(self): + assert calculate_dn0(0.5, py_only=0.0) == DN0Result(0.0, 0.0) + + def test_no_nets_raises(self): + with pytest.raises(ValueError): + calculate_dn0(0.5) + + def test_unknown_net_raises(self): + with pytest.raises(ValueError, match="unknown net type"): + calculate_dn0(0.5, py_supernet=1.0) diff --git a/tests/test_flows.py b/tests/test_flows.py new file mode 100644 index 0000000..5ace6a0 --- /dev/null +++ b/tests/test_flows.py @@ -0,0 +1,66 @@ +"""End-to-end flow tests: prevalence -> EIR, and the mosquito-delta HBR pipeline. + +These exercise the bundled models in src/estimint/data, so they run offline. +""" + +import pandas as pd +import pytest + +from estimint import ( + load_xgb_model, + run_xgb_model, + estimate_eir_with_mosquito_delta, +) + +INTERVENTIONS = dict( + dn0_use=0.33, Q0=0.87, phi_bednets=0.82, + seasonal=0.0, itn_use=0.6, irs_use=0.0, +) + + +class TestPrevalenceToEir: + def test_predicts_positive_eir(self): + model = load_xgb_model("prevalence") + X = pd.DataFrame({"prev_y9": [0.30], **{k: [v] for k, v in INTERVENTIONS.items()}}) + eir = run_xgb_model(X, model) + assert len(eir) == 1 + assert eir[0] > 0 + + def test_higher_prevalence_gives_higher_eir(self): + model = load_xgb_model("prevalence") + rows = {"prev_y9": [0.10, 0.50], **{k: [v, v] for k, v in INTERVENTIONS.items()}} + eir = run_xgb_model(pd.DataFrame(rows), model) + assert eir[1] > eir[0] + + +class TestMosquitoDelta: + def _run(self, delta): + return estimate_eir_with_mosquito_delta( + prevalence=0.30, mosquito_delta=delta, **INTERVENTIONS + ) + + def test_returns_expected_keys(self): + res = self._run(0.25) + assert set(res) == { + "eir_baseline", "eir_new", "eir_multiplier", "hbr_baseline", "hbr_new", + } + + def test_zero_delta_is_identity(self): + res = self._run(0.0) + assert res["eir_new"] == res["eir_baseline"] + assert res["eir_multiplier"] == 1.0 + + def test_more_mosquitoes_raises_eir(self): + res = self._run(0.25) + assert res["eir_new"] > res["eir_baseline"] + assert res["eir_multiplier"] > 1.0 + assert res["hbr_new"] > res["hbr_baseline"] + + def test_fewer_mosquitoes_lowers_eir(self): + res = self._run(-0.50) + assert res["eir_new"] < res["eir_baseline"] + assert res["hbr_new"] < res["hbr_baseline"] + + def test_monotonic_in_delta(self): + eirs = [self._run(d)["eir_new"] for d in (-0.5, -0.25, 0.0, 0.25, 0.5, 1.0)] + assert eirs == sorted(eirs) From 6c32614c208ffbf967849cda8e1d35de23beffe8 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Tue, 23 Jun 2026 15:05:36 +0100 Subject: [PATCH 04/30] Fix hardcoded paths in prepare scripts; trim bednet docstrings --- models/hbr/prepare.py | 10 ++++++---- models/prevalence/prepare.py | 8 +++++--- src/estimint/bednet.py | 19 +++++-------------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/models/hbr/prepare.py b/models/hbr/prepare.py index 0ee44af..e0f19e6 100644 --- a/models/hbr/prepare.py +++ b/models/hbr/prepare.py @@ -6,10 +6,12 @@ Both sorted by key for a deterministic, reproducible view. """ +from pathlib import Path + import pandas as pd -ROOT = "/home/cosmo/Documents/Repos/estimint" -SOURCE = f"{ROOT}/datasets/estimint_simulations_y9.parquet" +HERE = Path(__file__).parent +SOURCE = HERE.parents[1] / "datasets" / "estimint_simulations_y9.parquet" KEYS = ["parameter_index", "simulation_index"] COLS = KEYS + ["eir", "dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "hbr_y9"] @@ -22,13 +24,13 @@ def prepare(): hbr = src[src.hbr_y9 > 0][COLS].sort_values(KEYS).reset_index(drop=True) assert len(hbr) == 16384, f"expected 16,384 hbr rows, got {len(hbr):,}" assert not hbr.isna().any().any(), "unexpected NaN in hbr view" - hbr.to_parquet(f"{ROOT}/models/hbr/hbr_training.parquet", index=False) + hbr.to_parquet(HERE / "hbr_training.parquet", index=False) print(f"hbr view: {len(hbr):,} rows -> models/hbr/hbr_training.parquet") e2h = src[(src.prev_y9 >= MIN_PREVALENCE) & (src.hbr_y9 > 0)][COLS].sort_values(KEYS).reset_index(drop=True) assert len(e2h) == 12429, f"expected 12,429 eir_to_hbr rows, got {len(e2h):,}" assert not e2h.isna().any().any(), "unexpected NaN in eir_to_hbr view" - e2h.to_parquet(f"{ROOT}/models/hbr/eir_to_hbr_training.parquet", index=False) + e2h.to_parquet(HERE / "eir_to_hbr_training.parquet", index=False) print(f"eir_to_hbr view: {len(e2h):,} rows -> models/hbr/eir_to_hbr_training.parquet") diff --git a/models/prevalence/prepare.py b/models/prevalence/prepare.py index 8edfbc6..08b6675 100644 --- a/models/prevalence/prepare.py +++ b/models/prevalence/prepare.py @@ -3,11 +3,13 @@ Filters prev_y9 >= 0.02 and sorts by key for a deterministic, reproducible view. """ +from pathlib import Path + import pandas as pd -ROOT = "/home/cosmo/Documents/Repos/estimint" -SOURCE = f"{ROOT}/datasets/estimint_simulations_y9.parquet" -OUT = f"{ROOT}/models/prevalence/training.parquet" +ROOT = Path(__file__).parents[2] +SOURCE = ROOT / "datasets" / "estimint_simulations_y9.parquet" +OUT = Path(__file__).parent / "training.parquet" KEYS = ["parameter_index", "simulation_index"] COLS = KEYS + ["eir", "dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "prev_y9"] diff --git a/src/estimint/bednet.py b/src/estimint/bednet.py index 7e68432..8e5a2ff 100644 --- a/src/estimint/bednet.py +++ b/src/estimint/bednet.py @@ -1,11 +1,4 @@ -"""Bednet -> dn0 estimator. - -`dn0` is the probability a mosquito dies on contact with a treated net — estiMINT's -bednet covariate. A bednet is specified as a usage mix over net types at an -insecticide-resistance level; this maps that spec to the usage-weighted dn0. - -Backed by the empirical resistance->dn0 table in data/itn_dn0.csv. -""" +"""Map a bednet spec (net-type usage mix + resistance level) to dn0, via data/itn_dn0.csv.""" from __future__ import annotations @@ -30,8 +23,8 @@ class DN0Result(NamedTuple): - dn0: float # usage-weighted kill probability - itn_use: float # total pyrethroid-net usage + dn0: float + itn_use: float @lru_cache(maxsize=1) @@ -50,11 +43,9 @@ def net_types() -> list[str]: def calculate_dn0(resistance_level: float, **usage: float) -> DN0Result: - """Usage-weighted dn0 for a bednet mix at a given resistance level. + """Usage-weighted dn0 for a net-type mix at a resistance level. - Pass net-type shares as keywords (short or canonical names), e.g. - ``calculate_dn0(0.5, py_only=0.4, py_pbo=0.6)``. Returns the weighted dn0 and - the total ITN usage. A mix summing to 0 returns (0, 0). + Net-type shares are keywords, e.g. ``calculate_dn0(0.5, py_only=0.4, py_pbo=0.6)``. """ if not usage: raise ValueError("supply at least one = pair") From 7c99d0c7ebad1570e68aba6024966a4040732b5f Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Tue, 23 Jun 2026 21:24:33 +0100 Subject: [PATCH 05/30] Add run_scenarios pipeline, CI/publish workflows, split deps into extras, drop requirements.txt, resync uv.lock --- .coverage | Bin 53248 -> 53248 bytes .github/workflows/publish.yml | 37 + .github/workflows/tests.yml | 36 + MANIFEST.in | 1 - README.md | 127 ++- pyproject.toml | 48 +- requirements.txt | 21 - src/estimint/__init__.py | 18 +- src/estimint/data_processing.py | 22 +- src/estimint/plotting.py | 13 +- src/estimint/scenarios.py | 118 +++ tests/test_scenarios.py | 81 ++ uv.lock | 1392 ++++++++++++++++++++++++++++++- 13 files changed, 1815 insertions(+), 99 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/tests.yml delete mode 100644 requirements.txt create mode 100644 src/estimint/scenarios.py create mode 100644 tests/test_scenarios.py diff --git a/.coverage b/.coverage index 215ea203af380f2f3ea31fa6d4b72019e977232e..ad663e99750cd1edfbe244cceff9773d346d532a 100644 GIT binary patch delta 454 zcmZozz}&Eac|w*{F9UxZuRp&o&m3Mg?u$IRoL$`W*b_OE*?Kn%3UIP*j$k{)#?>6n z#4au>%GfTsS%vp9<7OTHiwev}dIp;eSOjEvc-}DZ@8z%MH|G1qw}~&GPnY)t?`Ga2 zUOk>SKr_zpFgfr{*7q|LNYBYnO3W$NE2wnhW?^XLoNVcD#8I4_nwMCVnZG&DcN!DW zthWsO`*@4_O?ck&ZsGgPSHSy`SD#OhZ!>=#(5$mOlMQ1X*?62;8aWx!w8u_UlH%rD z!NC8K{~`ZL{&oCI_-FDL^ZNn~dCIo}sJV-e$(noer9K;eE*3^kDb}Xl3=Sv$+edIt zmhF#JtHT-vY3&B+E-D#F&p z`;T$*(tg!YF=ilNkGY9i9;^dIFfyE3Qp3jt6qnBH|5gV6-~3zo-}2w*-@|`{|1keW{%8DO_)h`dJDpz|WD_G3H<)7O0#oc@ N>lwK>Uzl%T000U*ehL5p delta 407 zcmZozz}&Eac|w*{1OtB@uN1#7Pdd*>?m0XboT1#A>^hu!Y!MqLUSZwb%XWy3t3`l` zU0hU@v4eSYB=2QLV+A14)m2bX&qyrJP**5PttbHr!2wXt11O`ApQccfk*biASdzF| zi~q6$vx%PZCIc1$DQ;c^2L8SLwfx3>pZGTM<@4$Ce&F5ATf}RySx`WTm&t*9vc8`g zTY64@Qew{LJl|4Sqw(v1ob4^~=XT#6Q!pJGb+O(U&;lzLY z2#(2L`ywZo^s91lumL56*qY|nPhQfm8YIdL tag/create a Release -> this runs. +on: + release: + types: [published] + +jobs: + publish: + name: build + publish to PyPI + runs-on: ubuntu-latest + + # PyPI Trusted Publishing (OIDC) — no API token stored as a secret. + # One-time setup: add this repo + workflow as a trusted publisher in the + # PyPI project settings (https://pypi.org/manage/project/estimint/settings/publishing/). + environment: + name: pypi + url: https://pypi.org/project/estimint/ + permissions: + id-token: write + + steps: + - uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Build sdist + wheel + run: uv build + + # uv detects the GitHub Actions OIDC token automatically when + # id-token: write is granted, so no credentials are needed here. + - name: Publish to PyPI + run: uv publish diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..e851584 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,36 @@ +name: tests + +on: + push: + branches: ["**"] + pull_request: + +concurrency: + group: tests-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + name: pytest (Python ${{ matrix.python-version }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.9", "3.10", "3.11", "3.12"] + + steps: + - uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + python-version: ${{ matrix.python-version }} + + # Install core + dev only. This both runs the test suite and proves the + # core (inference) install works without the train/viz extras. + - name: Install project + run: uv sync --extra dev + + - name: Run tests + run: uv run pytest diff --git a/MANIFEST.in b/MANIFEST.in index 12fbd8a..97c6b5e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,3 @@ include README.md -include requirements.txt recursive-include src/estimint/data * recursive-include src/estimint/inst * diff --git a/README.md b/README.md index cf3a3f1..cb70877 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,44 @@ Python port of the estiMINT R package for EIR (Entomological Inoculation Rate) estimation using machine learning. -Estimators: EIR from prevalence, EIR↔HBR (incl. the effect of mosquito-density changes), and bednet spec (net type + resistance) → `dn0`. +It estimates EIR from prevalence, converts between EIR and human biting rate (including the effect of changes in mosquito density), and turns a bednet specification (net type and resistance level) into the `dn0` killing parameter. ## Installation ```bash -pip install -e . +pip install estimint # core: inference only (numpy, pandas, xgboost, scipy) ``` -Or install dependencies directly: +Optional extras, by use case: ```bash -pip install -r requirements.txt +pip install "estimint[train]" # data prep + model training (duckdb, scikit-learn, pyarrow) +pip install "estimint[viz]" # plotting (matplotlib) +pip install "estimint[all]" # train + viz + model download +pip install "estimint[dev]" # test/lint/type-check toolchain ``` -## File Mapping (R → Python) +The `run_scenarios` pipeline also needs the stateMINT emulator (Python 3.12+). For now it +comes from the `mamba2-train` branch. With uv this is handled for you: + +```bash +uv sync --extra scenarios +``` + +With plain pip, install stateMINT from the branch yourself, then estiMINT: + +```bash +pip install "git+https://github.com/mrc-ide/stateMINT.git@mamba2-train" +pip install estimint +``` + +For local development with [uv](https://docs.astral.sh/uv/): + +```bash +uv sync --extra all --extra dev +``` + +## File mapping (R to Python) | R File | Python File | Description | |--------|-------------|-------------| @@ -50,7 +73,7 @@ python models/prevalence/train.py # train -> estiMINT_model.pkl + metri ``` The deployed models shipped with the package live in `src/estimint/data/` and are loaded by -name (`prevalence`, `hbr`, `eir_to_hbr`) — independent of the training pipeline above. +name (`prevalence`, `hbr`, `eir_to_hbr`). This is independent of the training pipeline above. ## API Reference @@ -92,10 +115,10 @@ set_global_model(model) predictions = run_xgb_model(new_data) # Uses global model ``` -### Bednet → dn0 +### Bednet to dn0 -Map a bednet spec (net-type usage mix + insecticide resistance) to the `dn0` -covariate (probability a mosquito dies on contact), plus total ITN usage: +Turn a bednet specification (a mix of net types and an insecticide resistance level) into +the `dn0` covariate, the probability a mosquito dies on contact, along with total ITN usage. ```python from estimint import calculate_dn0, net_types @@ -105,6 +128,53 @@ res = calculate_dn0(0.5, py_only=0.4, py_pbo=0.3, py_pyrrole=0.2, py_ppf=0.1) res.dn0, res.itn_use # weighted dn0, total net usage ``` +### Run scenarios + +`run_scenarios` runs the whole pipeline in one call. You give it a list of scenarios and +get back a DataFrame. For each scenario it works out the bednet killing effect, estimates +the EIR (from prevalence, from biting rate, or taken directly), optionally adjusts for a +change in mosquito density, then runs the stateMINT emulator forward to the prevalence and +cases trajectories. + +This needs the [stateMINT](https://github.com/mrc-ide/stateMINT) package installed as well +as estiMINT. estiMINT only loads it when you call `run_scenarios`, and the model weights +download from HuggingFace. + +```python +from estimint import run_scenarios + +scenarios = [ + dict(name="PBO nets, prevalence input, 60% more mosquitoes", + input="prevalence", value=0.30, + net="pyrethroid_pbo", resistance=0.55, net_usage=0.85, + Q0=0.90, phi_bednets=0.85, seasonal=1, irs_use=0.40, lsm=0.0, + mosquito_delta=0.60), + dict(name="Biting rate input", + input="hbr", value=250000.0, + net="pyrethroid_ppf", resistance=0.45, net_usage=0.50, + Q0=0.80, phi_bednets=0.82, seasonal=0, irs_use=0.0), + dict(name="EIR supplied directly, no nets", + input="eir", value=20.0, + Q0=0.88, phi_bednets=0.78, seasonal=1, irs_use=0.60), +] + +df = run_scenarios(scenarios) +print(df[["name", "eir_baseline", "eir_final", "prev_y9", "cases_endline"]]) +``` + +Every scenario needs `input` and `value`, plus `Q0`, `phi_bednets`, `seasonal` and +`irs_use`. `lsm` defaults to 0. To include nets give `net`, `resistance` and `net_usage`, +or leave `net` out for none. `mosquito_delta` only applies when `input` is `"prevalence"`. + +The returned DataFrame has one row per scenario. Alongside the inputs it gives the +estimated EIR (`eir_baseline`, and `eir_final` after any mosquito-density change) and the +stateMINT output. That output is year-9 prevalence (`prev_y9`), endline prevalence and +cases, and the full 157-step `prev_series` and `cases_series`. What you do with it is up to +you. + +The `estimint.scenarios` module is also where the simulation-based inference and experiment +code will go. + ## Utility Functions ```python @@ -128,6 +198,9 @@ y_calibrated = predict_qmap_w(y_pred, cal) ## Data Processing +These functions need the training extras. Install them with `pip install "estimint[train]"`, +which adds duckdb and scikit-learn. + ```python from estimint import load_and_filter, make_value_weights, strata_and_split @@ -147,12 +220,24 @@ df = strata_and_split(df, k_strata=16, seed=42) ## Testing ```bash -pip install -e ".[dev]" -pytest +uv sync --extra dev # or: pip install -e ".[dev]" +uv run pytest # or: pytest ``` -Covers the metric/utility helpers plus the three estimator flows: prevalence→EIR -inference, the mosquito-delta HBR pipeline, and bednet→dn0. +This covers the metric and utility helpers, the EIR estimators (prevalence, HBR and direct +EIR), the mosquito-density HBR pipeline, and the bednet calculation. + +## CI and releases + +The test suite runs on every push and pull request across Python 3.9 to 3.12, defined in +[`.github/workflows/tests.yml`](.github/workflows/tests.yml). + +Releases publish to PyPI from [`.github/workflows/publish.yml`](.github/workflows/publish.yml). +It builds with `uv build` and uploads with `uv publish` using +[PyPI trusted publishing](https://docs.astral.sh/uv/guides/integration/github/#publishing-to-pypi), +so no token is stored. To cut a release, bump `version` in `pyproject.toml` and publish a +GitHub Release. The first time, register this repository as a trusted publisher in the PyPI +project settings. ## Key Differences from R Version @@ -163,16 +248,20 @@ inference, the mosquito-delta HBR pipeline, and bednet→dn0. ## Dependencies +Core, always installed, and enough for inference: + - numpy >= 1.20.0 - pandas >= 1.3.0 -- duckdb >= 0.8.0 - xgboost >= 1.6.0 -- scikit-learn >= 1.0.0 - scipy >= 1.7.0 -- matplotlib >= 3.4.0 -- pyarrow >= 10.0.0 (Parquet I/O for the training pipeline) -- requests >= 2.28.0 (optional, for model download) -- appdirs >= 1.4.0 (optional, for cache directory) + +Optional extras, installed with `estimint[name]`: + +- `train` adds duckdb, scikit-learn and pyarrow for data prep and model training +- `viz` adds matplotlib for plotting +- `download` adds requests and appdirs for fetching published models +- `all` combines train, viz and download +- `dev` is the test and lint toolchain (pytest, pytest-cov, black, isort, mypy, flake8) ## License diff --git a/pyproject.toml b/pyproject.toml index 28e4aa2..cf7d77e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,16 +31,49 @@ classifiers = [ "Topic :: Scientific/Engineering :: Bio-Informatics", ] +# Core runtime dependencies: everything needed to load a bundled model and run +# inference (load_xgb_model / run_xgb_model / run_scenarios / calculate_dn0). dependencies = [ "numpy>=1.20.0", "pandas>=1.3.0", - "duckdb>=0.8.0", "xgboost>=1.6.0", - "scikit-learn>=1.0.0", - "matplotlib>=3.4.0", + "scipy>=1.7.0", ] [project.optional-dependencies] +# Data preparation + model training (not needed for inference): +# duckdb -> load_and_filter() SQL over the simulation parquet +# scikit-learn -> strata_and_split() K-means stratification +# pyarrow -> parquet engine for pd.read_parquet in models/*/train.py +train = [ + "duckdb>=0.8.0", + "scikit-learn>=1.0.0", + "pyarrow>=10.0.0", +] +# Plotting (plot_obs_pred and training diagnostic plots): +viz = [ + "matplotlib>=3.4.0", +] +# Optional model download from GitHub releases (graceful fallback if absent): +download = [ + "requests>=2.28.0", + "appdirs>=1.4.0", +] +# run_scenarios pipeline: the stateMINT mamba2 emulator (PyPI distribution: mintstate, +# imported as stateMINT). Needs Python >=3.12. Pinned to the mamba2-train branch via +# [tool.uv.sources] for now. +scenarios = [ + "mintstate; python_version >= '3.12'", +] +# Everything a model developer needs (train + plot + download): +all = [ + "duckdb>=0.8.0", + "scikit-learn>=1.0.0", + "pyarrow>=10.0.0", + "matplotlib>=3.4.0", + "requests>=2.28.0", + "appdirs>=1.4.0", +] dev = [ "pytest>=7.0.0", "pytest-cov>=4.0.0", @@ -49,10 +82,6 @@ dev = [ "mypy>=1.0.0", "flake8>=6.0.0", ] -download = [ - "requests>=2.28.0", - "appdirs>=1.4.0", -] [project.urls] Homepage = "https://github.com/CosmoNaught/estiMINT" @@ -60,6 +89,11 @@ Documentation = "https://github.com/CosmoNaught/estiMINT#readme" Repository = "https://github.com/CosmoNaught/estiMINT" Issues = "https://github.com/CosmoNaught/estiMINT/issues" +[tool.uv.sources] +# Dev-only override: pull mintstate from the mamba2-train branch. This is stripped from +# the published package metadata, so it does not block PyPI uploads. +mintstate = { git = "https://github.com/mrc-ide/stateMINT.git", branch = "mamba2-train" } + [tool.setuptools.packages.find] where = ["src"] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 8830c69..0000000 --- a/requirements.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Core dependencies -numpy>=1.20.0 -pandas>=1.3.0 -duckdb>=0.8.0 -xgboost>=1.6.0 -scikit-learn>=1.0.0 -scipy>=1.7.0 -matplotlib>=3.4.0 -pyarrow>=10.0.0 - -# Optional: for model download functionality -requests>=2.28.0 -appdirs>=1.4.0 - -# Optional: development dependencies -# pytest>=7.0.0 -# pytest-cov>=4.0.0 -# black>=23.0.0 -# isort>=5.12.0 -# mypy>=1.0.0 -# flake8>=6.0.0 diff --git a/src/estimint/__init__.py b/src/estimint/__init__.py index 3901ebf..6d7174a 100644 --- a/src/estimint/__init__.py +++ b/src/estimint/__init__.py @@ -6,13 +6,13 @@ Equivalent to: estiMINT-package.R -Dependencies (equivalent to R imports): -- pandas, polars (data.table equivalent) -- duckdb (DBI + duckdb) -- xgboost (xgboost) -- numpy (stats) -- matplotlib, seaborn (ggplot2) -- scikit-learn (stats::kmeans) +Dependencies +------------ +Core (inference): numpy, pandas, xgboost, scipy. +Optional extras: +- train: duckdb, scikit-learn, pyarrow (data prep + model training) +- viz: matplotlib (plotting) +- download: requests, appdirs (fetch published models) """ __version__ = "1.4.0" @@ -59,6 +59,8 @@ from .bednet import calculate_dn0, net_types, DN0Result +from .scenarios import run_scenarios + __all__ = [ # utils "ts", @@ -96,4 +98,6 @@ "calculate_dn0", "net_types", "DN0Result", + # scenarios + "run_scenarios", ] diff --git a/src/estimint/data_processing.py b/src/estimint/data_processing.py index e413cd4..2315779 100644 --- a/src/estimint/data_processing.py +++ b/src/estimint/data_processing.py @@ -7,8 +7,8 @@ from typing import Dict, Tuple, Optional import numpy as np import pandas as pd -import duckdb -from sklearn.cluster import KMeans + +# duckdb / scikit-learn imported lazily in the functions below (estimint[train]). def load_and_filter( @@ -37,6 +37,14 @@ def load_and_filter( - 'DT': DataFrame with rows passing filters - 'DT_excluded': DataFrame with rows failing filters """ + try: + import duckdb + except ImportError: + raise ImportError( + "load_and_filter() requires duckdb. " + "Install the training extras: pip install estimint[train]" + ) + con = duckdb.connect(database=":memory:") try: @@ -141,9 +149,17 @@ def strata_and_split( pd.DataFrame DataFrame with added 'strat_bin' and 'split' columns """ + try: + from sklearn.cluster import KMeans + except ImportError: + raise ImportError( + "strata_and_split() requires scikit-learn. " + "Install the training extras: pip install estimint[train]" + ) + DT = DT.copy() np.random.seed(seed) - + # K-means clustering on log10(EIR) eir_log10 = DT["eir_log10"].values.reshape(-1, 1) km = KMeans(n_clusters=k_strata, n_init=50, max_iter=5000, random_state=seed) diff --git a/src/estimint/plotting.py b/src/estimint/plotting.py index 4533c01..6639eeb 100644 --- a/src/estimint/plotting.py +++ b/src/estimint/plotting.py @@ -8,9 +8,10 @@ from pathlib import Path import numpy as np -import matplotlib.pyplot as plt from numpy.typing import ArrayLike +# matplotlib imported lazily in plot_obs_pred (estimint[viz]). + def plot_obs_pred( obs: ArrayLike, @@ -45,9 +46,17 @@ def plot_obs_pred( None Saves plot to file """ + try: + import matplotlib.pyplot as plt + except ImportError: + raise ImportError( + "plot_obs_pred() requires matplotlib. " + "Install the plotting extras: pip install estimint[viz]" + ) + obs = np.asarray(obs) pred = np.asarray(pred) - + # Create figure fig, ax = plt.subplots(figsize=(7.5, 6), dpi=150) diff --git a/src/estimint/scenarios.py b/src/estimint/scenarios.py new file mode 100644 index 0000000..b848890 --- /dev/null +++ b/src/estimint/scenarios.py @@ -0,0 +1,118 @@ +"""One-call estiMINT -> stateMINT scenario runner (stateMINT imported lazily).""" + +from __future__ import annotations + +from typing import Any, Dict, List, Union + +import numpy as np +import pandas as pd + +from .bednet import calculate_dn0 +from .run import run_xgb_model +from .hbr import estimate_eir_with_mosquito_delta +from .storage import load_xgb_model + +HF_REPO = "dide-ic/stateMINT" +# 157 windows of 14 days from day 2190; intervention at day 3285. +_ABS_T = 2190 + 14 * np.arange(157) +_IDX_Y9 = int(np.argmin(np.abs(_ABS_T - 3285))) + +_MODELS: Dict[str, Any] = {} +_EMULATORS: Dict[str, Dict[str, Any]] = {} + + +def _est_models() -> Dict[str, Any]: + if not _MODELS: + _MODELS["prevalence"] = load_xgb_model("prevalence") + _MODELS["hbr"] = load_xgb_model("hbr") + return _MODELS + + +def _emulators(hf_repo: str) -> Dict[str, Any]: + if hf_repo not in _EMULATORS: + try: + from stateMINT.model import Mamba2Regressor + except ImportError as e: + raise ImportError( + "run_scenarios needs stateMINT. Install it with: " + 'uv sync --extra scenarios (or pip install ' + '"git+https://github.com/mrc-ide/stateMINT.git@mamba2-train").' + ) from e + _EMULATORS[hf_repo] = { + p: Mamba2Regressor.from_pretrained(hf_repo, predictor=p) + for p in ("prevalence", "cases") + } + return _EMULATORS[hf_repo] + + +def _estimate_eir(scn: Dict[str, Any], est: Dict[str, Any]) -> Dict[str, Any]: + """scenario -> EIR + the stateMINT covariate dict.""" + net = scn.get("net") + if net: + res = calculate_dn0(scn["resistance"], **{net: scn["net_usage"]}) + dn0_use, itn_use = res.dn0, res.itn_use * scn["net_usage"] + else: + dn0_use = itn_use = 0.0 + + Q0, phi, seasonal = scn["Q0"], scn["phi_bednets"], float(scn["seasonal"]) + irs_use, lsm = scn["irs_use"], scn.get("lsm", 0.0) + feats = dict(dn0_use=dn0_use, Q0=Q0, phi_bednets=phi, + seasonal=seasonal, itn_use=itn_use, irs_use=irs_use) + + mode, value = scn["input"], float(scn["value"]) + if mode == "eir": + eir_base = value + elif mode == "prevalence": + eir_base = float(run_xgb_model(pd.DataFrame({**{k: [v] for k, v in feats.items()}, "prev_y9": [value]}), est["prevalence"])[0]) + elif mode == "hbr": + eir_base = float(run_xgb_model(pd.DataFrame({**{k: [v] for k, v in feats.items()}, "hbr_y9": [value]}), est["hbr"])[0]) + else: + raise ValueError(f"'input' must be 'prevalence', 'hbr' or 'eir'; got {mode!r}") + + eir_final, hbr_baseline, hbr_new = eir_base, np.nan, np.nan + delta = scn.get("mosquito_delta") + if delta is not None and mode == "prevalence": + r = estimate_eir_with_mosquito_delta(prevalence=value, mosquito_delta=delta, **feats) + eir_final, hbr_baseline, hbr_new = r["eir_new"], r["hbr_baseline"], r["hbr_new"] + + # future = use: interventions stay on past day 3285. + cov = dict(eir=eir_final, dn0_use=dn0_use, dn0_future=dn0_use, Q0=Q0, phi_bednets=phi, + seasonal=seasonal, routine=0.0, itn_use=itn_use, irs_use=irs_use, + itn_future=itn_use, irs_future=irs_use, lsm=lsm) + row = dict(name=scn.get("name"), input_mode=mode, net=net or "none", + dn0_use=dn0_use, itn_use=itn_use, irs_use=irs_use, lsm=lsm, seasonal=seasonal, + eir_baseline=eir_base, mosquito_delta=delta, eir_final=eir_final, + hbr_baseline=hbr_baseline, hbr_new=hbr_new) + return {"row": row, "cov": cov} + + +def run_scenarios( + scenarios: Union[List[Dict[str, Any]], pd.DataFrame], + *, + hf_repo: str = HF_REPO, +) -> pd.DataFrame: + """Run scenarios end-to-end (estiMINT EIR -> stateMINT emulator) -> DataFrame. + + Each scenario: input ("prevalence"|"hbr"|"eir") + value; Q0, phi_bednets, seasonal, + irs_use; lsm (opt); nets via net/resistance/net_usage (opt); mosquito_delta (opt, + prevalence only); name (opt). Output adds prev_y9/prev_endline/cases_endline and the + length-157 prev_series/cases_series. + """ + if isinstance(scenarios, pd.DataFrame): + scenarios = scenarios.to_dict(orient="records") + if not scenarios: + return pd.DataFrame() + + est = _est_models() + emu = _emulators(hf_repo) + + parts = [_estimate_eir(scn, est) for scn in scenarios] + covs = [p["cov"] for p in parts] + prev = np.asarray(emu["prevalence"].predict(covs), dtype=np.float32) + cases = np.maximum(np.asarray(emu["cases"].predict(covs), dtype=np.float32), 0.0) + + return pd.DataFrame([ + {**part["row"], "prev_y9": float(p[_IDX_Y9]), "prev_endline": float(p[-1]), + "cases_endline": float(c[-1]), "prev_series": p, "cases_series": c} + for part, p, c in zip(parts, prev, cases) + ]) diff --git a/tests/test_scenarios.py b/tests/test_scenarios.py new file mode 100644 index 0000000..837c79d --- /dev/null +++ b/tests/test_scenarios.py @@ -0,0 +1,81 @@ +"""Tests for the run_scenarios pipeline. + +The estiMINT half (_estimate_eir) is tested offline against the bundled models. +The full run_scenarios call also runs the stateMINT emulator, so it is skipped +unless stateMINT is installed. +""" + +import numpy as np +import pytest + +from estimint.scenarios import _estimate_eir, _est_models, run_scenarios + +INTV = dict(Q0=0.87, phi_bednets=0.82, seasonal=0.0, irs_use=0.0) + + +@pytest.fixture(scope="module") +def est(): + return _est_models() + + +class TestEstimateEir: + def test_prevalence_input(self, est): + out = _estimate_eir(dict(input="prevalence", value=0.30, **INTV), est) + assert out["row"]["eir_baseline"] > 0 + assert out["cov"]["eir"] == out["row"]["eir_final"] + # no nets, no delta + assert out["row"]["dn0_use"] == 0.0 + assert np.isnan(out["row"]["hbr_baseline"]) + + def test_eir_input_passes_through(self, est): + out = _estimate_eir(dict(input="eir", value=20.0, **INTV), est) + assert out["row"]["eir_baseline"] == 20.0 + assert out["row"]["eir_final"] == 20.0 + + def test_hbr_input(self, est): + out = _estimate_eir(dict(input="hbr", value=250000.0, **INTV), est) + assert out["row"]["eir_baseline"] > 0 + + def test_bednet_spec_scales_itn_by_usage(self, est): + # mirrors the demo script: itn_use = calculate_dn0(...).itn_use * net_usage + out = _estimate_eir( + dict(input="prevalence", value=0.30, net="pyrethroid_only", + resistance=0.30, net_usage=0.70, **INTV), est) + assert out["row"]["dn0_use"] > 0 + assert out["row"]["itn_use"] == pytest.approx(0.70 * 0.70) + + def test_mosquito_delta_direction(self, est): + up = _estimate_eir(dict(input="prevalence", value=0.30, mosquito_delta=0.25, **INTV), est) + down = _estimate_eir(dict(input="prevalence", value=0.30, mosquito_delta=-0.50, **INTV), est) + assert up["row"]["eir_final"] > up["row"]["eir_baseline"] + assert down["row"]["eir_final"] < down["row"]["eir_baseline"] + assert up["row"]["hbr_new"] > up["row"]["hbr_baseline"] + + def test_covariate_dict_keys(self, est): + out = _estimate_eir(dict(input="eir", value=15.0, lsm=0.3, **INTV), est) + assert set(out["cov"]) == { + "eir", "dn0_use", "dn0_future", "Q0", "phi_bednets", "seasonal", + "routine", "itn_use", "irs_use", "itn_future", "irs_future", "lsm", + } + assert out["cov"]["lsm"] == 0.3 + assert out["cov"]["dn0_future"] == out["cov"]["dn0_use"] + + def test_bad_input_raises(self, est): + with pytest.raises(ValueError, match="input"): + _estimate_eir(dict(input="nope", value=1.0, **INTV), est) + + +class TestRunScenariosFullPipeline: + def test_end_to_end(self): + pytest.importorskip("stateMINT", reason="stateMINT not installed") + df = run_scenarios([ + dict(name="prev+delta", input="prevalence", value=0.30, + net="pyrethroid_pbo", resistance=0.55, net_usage=0.85, + Q0=0.90, phi_bednets=0.85, seasonal=1, irs_use=0.40, mosquito_delta=0.60), + dict(name="eir", input="eir", value=20.0, + Q0=0.88, phi_bednets=0.78, seasonal=1, irs_use=0.60), + ]) + assert len(df) == 2 + assert {"eir_final", "prev_y9", "prev_series", "cases_series"} <= set(df.columns) + assert len(df.iloc[0]["prev_series"]) == 157 + assert (df["cases_series"].iloc[0] >= 0).all() diff --git a/uv.lock b/uv.lock index 1f1cef7..e49baf6 100644 --- a/uv.lock +++ b/uv.lock @@ -2,12 +2,66 @@ version = 1 revision = 3 requires-python = ">=3.9" resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", "python_full_version < '3.10'", ] +[[package]] +name = "absl-py" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/c7/8de93764ad66968d19329a7e0c147a2bb3c7054c554d4a119111b8f9440f/absl_py-2.4.0.tar.gz", hash = "sha256:8c6af82722b35cf71e0f4d1d47dcaebfff286e27110a99fc359349b247dfb5d4", size = 116543, upload-time = "2026-01-28T10:17:05.322Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/a6/907a406bb7d359e6a63f99c313846d9eec4f7e6f7437809e03aa00fa3074/absl_py-2.4.0-py3-none-any.whl", hash = "sha256:88476fd881ca8aab94ffa78b7b6c632a782ab3ba1cd19c9bd423abc4fb4cd28d", size = 135750, upload-time = "2026-01-28T10:17:04.19Z" }, +] + +[[package]] +name = "aiofiles" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.9.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } + +[[package]] +name = "anyio" +version = "4.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna", marker = "python_full_version >= '3.12'" }, + { name = "typing-extensions", marker = "python_full_version == '3.12.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/b5/001890774a9552aff22502b8da382593109ce0c95314abaebbb116567545/anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89", size = 253586, upload-time = "2026-06-15T22:00:49.021Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/16/9826f089383c593cdfc4a6e5aca94d9e91ae1692c57af82c3b2aa5e810f7/anyio-4.14.0-py3-none-any.whl", hash = "sha256:dd9b7a2a9799ed6552fde617b2c5df02b7fdd7d88392fc48101e51bae46164d9", size = 123506, upload-time = "2026-06-15T22:00:47.595Z" }, +] + [[package]] name = "appdirs" version = "1.4.4" @@ -23,7 +77,8 @@ version = "25.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "mypy-extensions" }, { name = "packaging" }, { name = "pathspec" }, @@ -196,18 +251,40 @@ name = "click" version = "8.3.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "colorama", marker = "python_full_version >= '3.10' and python_full_version < '3.12' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -370,11 +447,20 @@ name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", ] dependencies = [ - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ @@ -575,7 +661,15 @@ name = "coverage" version = "7.12.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -734,23 +828,34 @@ wheels = [ [[package]] name = "estimint" -version = "1.2.0" +version = "1.4.0" source = { editable = "." } dependencies = [ - { name = "duckdb" }, - { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "pandas" }, - { name = "scikit-learn", version = "1.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "xgboost", version = "2.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "xgboost", version = "3.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] [package.optional-dependencies] +all = [ + { name = "appdirs" }, + { name = "duckdb" }, + { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pyarrow", version = "21.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pyarrow", version = "24.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "requests" }, + { name = "scikit-learn", version = "1.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] dev = [ { name = "black" }, { name = "flake8" }, @@ -765,25 +870,67 @@ download = [ { name = "appdirs" }, { name = "requests" }, ] +scenarios = [ + { name = "mintstate", marker = "python_full_version >= '3.12'" }, +] +train = [ + { name = "duckdb" }, + { name = "pyarrow", version = "21.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pyarrow", version = "24.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "scikit-learn", version = "1.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +viz = [ + { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] [package.metadata] requires-dist = [ + { name = "appdirs", marker = "extra == 'all'", specifier = ">=1.4.0" }, { name = "appdirs", marker = "extra == 'download'", specifier = ">=1.4.0" }, { name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" }, - { name = "duckdb", specifier = ">=0.8.0" }, + { name = "duckdb", marker = "extra == 'all'", specifier = ">=0.8.0" }, + { name = "duckdb", marker = "extra == 'train'", specifier = ">=0.8.0" }, { name = "flake8", marker = "extra == 'dev'", specifier = ">=6.0.0" }, { name = "isort", marker = "extra == 'dev'", specifier = ">=5.12.0" }, - { name = "matplotlib", specifier = ">=3.4.0" }, + { name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.4.0" }, + { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.4.0" }, + { name = "mintstate", marker = "python_full_version >= '3.12' and extra == 'scenarios'", git = "https://github.com/mrc-ide/stateMINT.git?branch=mamba2-train" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, { name = "numpy", specifier = ">=1.20.0" }, { name = "pandas", specifier = ">=1.3.0" }, + { name = "pyarrow", marker = "extra == 'all'", specifier = ">=10.0.0" }, + { name = "pyarrow", marker = "extra == 'train'", specifier = ">=10.0.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" }, + { name = "requests", marker = "extra == 'all'", specifier = ">=2.28.0" }, { name = "requests", marker = "extra == 'download'", specifier = ">=2.28.0" }, - { name = "scikit-learn", specifier = ">=1.0.0" }, + { name = "scikit-learn", marker = "extra == 'all'", specifier = ">=1.0.0" }, + { name = "scikit-learn", marker = "extra == 'train'", specifier = ">=1.0.0" }, + { name = "scipy", specifier = ">=1.7.0" }, { name = "xgboost", specifier = ">=1.6.0" }, ] -provides-extras = ["dev", "download"] +provides-extras = ["train", "viz", "download", "scenarios", "all", "dev"] + +[[package]] +name = "etils" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/ce/6e067242fde898841922ac6fc82b0bb2fe35c38e995880bdffdfbe30182a/etils-1.14.0.tar.gz", hash = "sha256:8136e7f4c4173cd0af0ca5481c4475152f0b8686192951eefa60ee8711e1ede4", size = 108127, upload-time = "2026-03-04T17:41:36.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/3d/589663aeeacd59bb2f3e8596bfd3e81cf0fb18d70bb433199041f469771b/etils-1.14.0-py3-none-any.whl", hash = "sha256:b5df7341f54dbe1405a4450b2741207b4a8c279780402b45f87202b94dfc52b4", size = 172934, upload-time = "2026-03-04T17:41:35.01Z" }, +] + +[package.optional-dependencies] +epath = [ + { name = "fsspec", marker = "python_full_version >= '3.12'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, + { name = "zipp", marker = "python_full_version >= '3.12'" }, +] +epy = [ + { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, +] [[package]] name = "exceptiongroup" @@ -797,6 +944,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] +[[package]] +name = "filelock" +version = "3.29.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/dc/be6cbe99670cd6e4ad387123647cb08e0c32975e223f82551e914c5568a6/filelock-3.29.4.tar.gz", hash = "sha256:10cdb3656fc44541cdf30652a93fb10ec6b05325620eb316bd26893e4201538a", size = 63028, upload-time = "2026-06-13T16:12:00.744Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/37/a065dc3bd6e49423a6532c642ca7378d3f467b1ef44c2800c937af7f9739/filelock-3.29.4-py3-none-any.whl", hash = "sha256:dac1648087d5115554850d113e7dd8c83ab2d38e3435dde2d4f163847e57b767", size = 42757, upload-time = "2026-06-13T16:11:59.582Z" }, +] + [[package]] name = "flake8" version = "7.3.0" @@ -811,6 +967,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" }, ] +[[package]] +name = "flax" +version = "0.12.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jax", marker = "python_full_version >= '3.12'" }, + { name = "msgpack", marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "optax", marker = "python_full_version >= '3.12'" }, + { name = "orbax-checkpoint", marker = "python_full_version >= '3.12'" }, + { name = "pyyaml", marker = "python_full_version >= '3.12'" }, + { name = "rich", marker = "python_full_version >= '3.12'" }, + { name = "tensorstore", marker = "python_full_version >= '3.12'" }, + { name = "treescope", marker = "python_full_version >= '3.12'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/19/4a8e128e2296eede00dc7a8586d374ef0b2770146a5cda1f50aa86f001ee/flax-0.12.7.tar.gz", hash = "sha256:abfd6acb17d6b93d1d7d7dfae7d3856222b92b35d35ab2487b77639c31dc673a", size = 5476434, upload-time = "2026-04-22T06:07:12.017Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/65/4bd2abfd4cb6e917b2626de5cbfc034dfc94b74dd95b8272d93f2ad66bed/flax-0.12.7-py3-none-any.whl", hash = "sha256:79d590793fa3a282ac36b4464f2ea9d1e69fe1d026c4618451b01731e8086e32", size = 525130, upload-time = "2026-04-22T06:07:10.254Z" }, +] + [[package]] name = "fonttools" version = "4.60.1" @@ -884,7 +1061,15 @@ name = "fonttools" version = "4.61.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -941,6 +1126,114 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" }, ] +[[package]] +name = "fsspec" +version = "2026.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/a1/ae4e3e5003468d6391d2c77b6fa1cd73bd5d13511d81c642d7b28ac90ed4/fsspec-2026.6.0.tar.gz", hash = "sha256:f5bac145310fe30e16e1471bd6840b2d990d609e872251d7e674241822abf01a", size = 313646, upload-time = "2026-06-16T01:57:28.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/22/4222d7ddf3da30f363edaa98e329c2bce6c65497c9cb2810931c8b2c0fbc/fsspec-2026.6.0-py3-none-any.whl", hash = "sha256:02e0b71817df9b2169dc30a16832045764def1191b43dcff5bb85bdee212d2a1", size = 203949, upload-time = "2026-06-16T01:57:26.358Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/2d/57fd21d84d93efb4bd0b962383790e19dd1bc053501b4264c97903b4e83e/hf_xet-1.5.1.tar.gz", hash = "sha256:51ef4500dab3764b41135ee1381a4b62ce56fc54d4c92b719b59e597d6df5bf6", size = 876636, upload-time = "2026-06-08T23:02:53.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/ee/dd9ba7beae1005e54131b7d45263cc74c8a066d47d354e6d58ae9445a388/hf_xet-1.5.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:dbf48c0d02cf0b2e568944330c60d9120c272dabe013bd892d48e25bc6797577", size = 4069485, upload-time = "2026-06-08T23:02:13.193Z" }, + { url = "https://files.pythonhosted.org/packages/b6/bc/9cae6cfeb4e03070874e73e5c97c66eb90369d3206b6a2b1ef5f96520888/hf_xet-1.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78e4e5192ad2b674c2e1160b651cb9134db974f8ae1835bdfbfb0166b894a43", size = 3838493, upload-time = "2026-06-08T23:02:15.282Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b4/d5c01e0eb6d9f2ca2dacd84d0d1b71e6cfbb2ef3208c968528e010e9b3d7/hf_xet-1.5.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6f7a04a8ad962422e225bc49fbbac99dc1806764b1f3e54dbd154bffa7593947", size = 4505658, upload-time = "2026-06-08T23:02:17.196Z" }, + { url = "https://files.pythonhosted.org/packages/76/c5/29a7598c0c6383c523dc22186d577f4e04267a626cd95ae60f67c00bfe66/hf_xet-1.5.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:d48199c2bf4f8df0adc55d31d1368b6ec0e4d4f45bc86b08038089c23db0bed8", size = 4292822, upload-time = "2026-06-08T23:02:18.608Z" }, + { url = "https://files.pythonhosted.org/packages/04/9a/dceaf6ca69390126b86ea825fb354b93d01163199070b7bd849225de9468/hf_xet-1.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:97f212a88d14bbf573619a74b7fecb238de77d08fc702e54dec6f78276ca3283", size = 4491255, upload-time = "2026-06-08T23:02:20.124Z" }, + { url = "https://files.pythonhosted.org/packages/48/a7/e5a7afaacf6c1791fdbeeac42951fb81c3d2bc482992b115dedcc86d963e/hf_xet-1.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f61e3665892a6c8c5e765395838b8ddf36185da835253d4bc4509a81e49fb342", size = 4711062, upload-time = "2026-06-08T23:02:21.863Z" }, + { url = "https://files.pythonhosted.org/packages/53/49/2802f8433c9742ce281bddc1e65c02c32268ca3098d66828b05e12e45ee2/hf_xet-1.5.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f4ad3ebd4c32dd2b27099d69dc7b2df821e30767e46fb6ee6a0713778243b8ff", size = 4017205, upload-time = "2026-06-08T23:02:23.495Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5a/50c71195b9fb883659f596e7252faf4c18c58e753a9013bdbf9bac5d2250/hf_xet-1.5.1-cp313-cp313t-win_arm64.whl", hash = "sha256:8298485c1e36e7e67cbd01eeb1376619b7af43d4f1ec245caae306f890a8a32d", size = 3845426, upload-time = "2026-06-08T23:02:25.124Z" }, + { url = "https://files.pythonhosted.org/packages/05/24/5e0c28f80371c17d49fed004597d9d132cb75c1f6f53db2cb95f459d2312/hf_xet-1.5.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:3474760d10e3bb6f92ff3f024fcb00c0b3e4001e9b035c7483e49a5dd17aa70f", size = 4069676, upload-time = "2026-06-08T23:02:26.759Z" }, + { url = "https://files.pythonhosted.org/packages/d2/17/261ba565b6a4d960fb478f61fdf919c0be5824645aaf1c319eca660c1611/hf_xet-1.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6762d89b9e3267dfd502b29b2a327b4525f33b17e7b509a78d94e2151a30ce30", size = 3838509, upload-time = "2026-06-08T23:02:28.573Z" }, + { url = "https://files.pythonhosted.org/packages/4e/44/7ffdc2e184b0d41fc0f683ba3936ef669ab63cf242cf36ef50e57d683668/hf_xet-1.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bf67e6ed10260cef62e852789dc91ebb03f382d5bdc4b1dbeb64763ea275e7d6", size = 4505881, upload-time = "2026-06-08T23:02:30.257Z" }, + { url = "https://files.pythonhosted.org/packages/63/b6/788060d5aa4d5e671f1a31bf69624c314eb2d8babab3aa562f9e5d53444e/hf_xet-1.5.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c6b6cd08ca095058780b50b8ce4d6cbf6787bcf27841705d58a9d32246e3e47a", size = 4292995, upload-time = "2026-06-08T23:02:31.993Z" }, + { url = "https://files.pythonhosted.org/packages/22/93/c5540cbd6b55529b7dc42f6734e88cebee21aefbea34128b66229df56c57/hf_xet-1.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e1af0de8ca6f190d4294a28b88023db64a1e2d1d719cab044baf75bec569e7a9", size = 4491570, upload-time = "2026-06-08T23:02:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/03/f3/9d8ceab30f44f36c1679b1b8683054c71a0dadc787dbf07421891742d3ca/hf_xet-1.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4f561cbbb92f80960772059864b7fb07eae879adde1b2e781ec6f86f6ac26c59", size = 4711565, upload-time = "2026-06-08T23:02:35.454Z" }, + { url = "https://files.pythonhosted.org/packages/cd/54/27ed9a5e2cc583b4df82f75a03a4df8dbf55f5a9fa1f47f1fadfb20dbeac/hf_xet-1.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e7dbb40617410f432182d918e37c12303fe6700fd6aa6c5964e30a535a4461d6", size = 4017343, upload-time = "2026-06-08T23:02:37.14Z" }, + { url = "https://files.pythonhosted.org/packages/ae/12/ecb2fc8d45e767580e3a37faa97cb895608b614965567efb4f18cff67e27/hf_xet-1.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6071d5ccb4d8d2cbd5fea5cc798da4f0ba3f44e25369591c4e89a4987050e61d", size = 3845716, upload-time = "2026-06-08T23:02:39.073Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d8/5e54cf37434759d1f4f2ba9b66077ff9d4c4e1f37b6bd7975da5c40d94ab/hf_xet-1.5.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6abd35c3221eff63836618ddfb954dcf84798603f71d8e33e3ed7b04acfdbe6e", size = 4077794, upload-time = "2026-06-08T23:02:40.656Z" }, + { url = "https://files.pythonhosted.org/packages/35/94/4b2ecfbad8f8b04701a23aefb62f540b9137d058b7e1dbef16a32676f0e9/hf_xet-1.5.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:94e761bbd266bf4c03cee73753916062665ce8365aa40ed321f45afcb934b41e", size = 3845354, upload-time = "2026-06-08T23:02:42.702Z" }, + { url = "https://files.pythonhosted.org/packages/de/cc/f99f4bc7295023d7bd9ebbfd51f75cc530ca262c1227666268b8208f4b77/hf_xet-1.5.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:892e3a3a3aecc12aded8b93cf4f9cd059282c7de0732f7d55026f3abdf474350", size = 4514864, upload-time = "2026-06-08T23:02:44.497Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6e/21f7e5a2381278bd3b7b7a5a4d90038518bb6308a0c1daf5d9f8268bb178/hf_xet-1.5.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a93df2039190502835b1db8cd7e178b0b7b889fe9ab51299d5ced26e0dd879a4", size = 4303784, upload-time = "2026-06-08T23:02:46.203Z" }, + { url = "https://files.pythonhosted.org/packages/35/0e/f992bb6927ac1cb30ef74e62268f551f338bc32b2191f7c96a44c6f7283e/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0c97106032ef70467b4f6bc2d0ccc266d7613ee076afc56516c502f87ce1c4a6", size = 4500703, upload-time = "2026-06-08T23:02:47.628Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d1/90a498d05447980b977b1669246eeeeae4cfb0ea3e7a286eaba627f91bf9/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6208adb15d192b90e4c2ad2a27ed864359b2cb0f2494eb6d7c7f3699ac02e2bf", size = 4719498, upload-time = "2026-06-08T23:02:49.268Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b6/20f99cfe97cc663a711f7b33cc21d4793e51968e9a26125b4afcd77315ba/hf_xet-1.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:f7b3002f95d1c13e24bcb4537baa8f0eb3838957067c91bb4959bc004a6435f5", size = 4026419, upload-time = "2026-06-08T23:02:50.829Z" }, + { url = "https://files.pythonhosted.org/packages/f9/fa/77453694888f03e5a8c8852d1514a0894d8e81c622d39edbaf308ea0dcf4/hf_xet-1.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:93d090b57b211133f6c0dab0205ef5cb6d89162979ba75a74845045cc3063b8e", size = 3855178, upload-time = "2026-06-08T23:02:52.452Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi", marker = "python_full_version >= '3.12'" }, + { name = "h11", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "python_full_version >= '3.12'" }, + { name = "certifi", marker = "python_full_version >= '3.12'" }, + { name = "httpcore", marker = "python_full_version >= '3.12'" }, + { name = "idna", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "1.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "filelock", marker = "python_full_version >= '3.12'" }, + { name = "fsspec", marker = "python_full_version >= '3.12'" }, + { name = "hf-xet", marker = "(python_full_version >= '3.12' and platform_machine == 'AMD64') or (python_full_version >= '3.12' and platform_machine == 'aarch64') or (python_full_version >= '3.12' and platform_machine == 'amd64') or (python_full_version >= '3.12' and platform_machine == 'arm64') or (python_full_version >= '3.12' and platform_machine == 'x86_64')" }, + { name = "httpx", marker = "python_full_version >= '3.12'" }, + { name = "packaging", marker = "python_full_version >= '3.12'" }, + { name = "pyyaml", marker = "python_full_version >= '3.12'" }, + { name = "tqdm", marker = "python_full_version >= '3.12'" }, + { name = "typer", marker = "python_full_version >= '3.12'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/7e/fad82ad491b226e832d2da90a1a59f36acd4526cda8c726f639834754aa4/huggingface_hub-1.20.1.tar.gz", hash = "sha256:9f6d63bfbeab2d2a8357200a9bc4f18cd2c8bfac9579f792f5922e77bf6471d0", size = 859910, upload-time = "2026-06-18T22:06:53.348Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/b5/ff8516e74b459da3dce9567540c39f2d305ee7a2655109f6802873ff1588/huggingface_hub-1.20.1-py3-none-any.whl", hash = "sha256:274448a45c1ba6f112fe2fb168ead05574c654faa156904157a84085cfae14bd", size = 719837, upload-time = "2026-06-18T22:06:51.486Z" }, +] + +[[package]] +name = "humanize" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/66/a3921783d54be8a6870ac4ccffcd15c4dc0dd7fcce51c6d63b8c63935276/humanize-4.15.0.tar.gz", hash = "sha256:1dd098483eb1c7ee8e32eb2e99ad1910baefa4b75c3aff3a82f4d78688993b10", size = 83599, upload-time = "2025-12-20T20:16:13.19Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl", hash = "sha256:b1186eb9f5a9749cd9cb8565aee77919dd7c8d076161cf44d70e59e3301e1769", size = 132203, upload-time = "2025-12-20T20:16:11.67Z" }, +] + [[package]] name = "idna" version = "3.11" @@ -991,7 +1284,15 @@ name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -1020,7 +1321,15 @@ name = "isort" version = "7.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -1029,6 +1338,68 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1", size = 94672, upload-time = "2025-10-11T13:30:57.665Z" }, ] +[[package]] +name = "jax" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaxlib", marker = "python_full_version >= '3.12'" }, + { name = "ml-dtypes", marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opt-einsum", marker = "python_full_version >= '3.12'" }, + { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/73/eb91d98fcadfa2cbcfdd4e417ab116e47eb20882acc5ee678e47c35d6b57/jax-0.10.2.tar.gz", hash = "sha256:bf77428a8c2e6904c4f46d5ab12aa5cfc6cad2179f07f7e4c0fc75ac86ef0639", size = 2775110, upload-time = "2026-06-17T23:44:57.818Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/82/5ab5211079a151b6f661529369c0c8e98ec64cabf5c0cf22a0a05af124d8/jax-0.10.2-py3-none-any.whl", hash = "sha256:724d73c4678d8b06f6a6ab4db1b8a2fea8cd4f1e2c2564f99601634ec7b8d1c6", size = 3219515, upload-time = "2026-06-17T23:42:41.259Z" }, +] + +[[package]] +name = "jaxlib" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes", marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/2c/7038fc73154307389631b5b2dbe5ac529e1918eecc19a27e6644ad114bbf/jaxlib-0.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5a98873fc867623b81f2bee15d554b8edd6588a183d01fa50d21b1e3db96ff2b", size = 61429039, upload-time = "2026-06-17T23:43:44.858Z" }, + { url = "https://files.pythonhosted.org/packages/66/c6/d69a0a33046f84930b89387861c061996d5207671b35080898679ca9960a/jaxlib-0.10.2-cp311-cp311-manylinux_2_27_aarch64.whl", hash = "sha256:d44565dcfd1b4f60f76d911c6512118a8a4fc764bdef92663fecb8bfccd54f23", size = 81079180, upload-time = "2026-06-17T23:43:48.245Z" }, + { url = "https://files.pythonhosted.org/packages/e2/27/fb54e3265c0ffcb687f93e9fb761c589acebbe958c3fed1b2c74c3f0e782/jaxlib-0.10.2-cp311-cp311-manylinux_2_27_x86_64.whl", hash = "sha256:1faca3c5d4662cb4a6130a68105d68bb520764817e165d6eebfd6786c0d1f30f", size = 85448560, upload-time = "2026-06-17T23:43:51.724Z" }, + { url = "https://files.pythonhosted.org/packages/21/bc/31fbb3d892c3cb97c73af9226eca63d60d8e224017145bdb6871d1d24da6/jaxlib-0.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:e7a9214e6b0b9e0825d905573d1bbf2253c20e9d7464a63e085b60519975553f", size = 65867603, upload-time = "2026-06-17T23:43:54.939Z" }, + { url = "https://files.pythonhosted.org/packages/ca/93/ee9cc8743191544f65d26ab7eeb82d65968fe60905662d1a5554d056654b/jaxlib-0.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47bb7c011515ea862be7e8313f40f9c56cbec09dc98a0fcb5016785fcd454c01", size = 61434612, upload-time = "2026-06-17T23:43:57.808Z" }, + { url = "https://files.pythonhosted.org/packages/11/06/8cc36021bf74d617c312eeed94c280282bb1bcbb32b63f2a42b10ae41575/jaxlib-0.10.2-cp312-cp312-manylinux_2_27_aarch64.whl", hash = "sha256:53b72977ae582c03a9e8e1cdee1efbf8ebc1418270965b0e69eade57acf40331", size = 81085366, upload-time = "2026-06-17T23:44:01.067Z" }, + { url = "https://files.pythonhosted.org/packages/48/17/38b718af2353dba7753300871e83fbb64a88a772e12727ae27373ab675ce/jaxlib-0.10.2-cp312-cp312-manylinux_2_27_x86_64.whl", hash = "sha256:fe88ec443714c4379968b6c109f9fa617c7ad19b802828e4d7bf861cd66da4b7", size = 85467828, upload-time = "2026-06-17T23:44:04.238Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c2/d41d13826ebdfe62e56cd87ba70fab3bb9fcbea4a6c9086739a91667e5bf/jaxlib-0.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:4b08f5fbc596b83f76308181863996f93d901d1f09cfd4e130a65c1998e1b371", size = 65900139, upload-time = "2026-06-17T23:44:07.476Z" }, + { url = "https://files.pythonhosted.org/packages/c2/68/eaa4cebe253359196a8e80a33b242959e27d8d2a6ae3d09339f21da2acb8/jaxlib-0.10.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4df530afa354a22dc1747a5d560640450cbb895d49889338a3f58c76a4c76c8e", size = 61434805, upload-time = "2026-06-17T23:44:10.511Z" }, + { url = "https://files.pythonhosted.org/packages/25/c1/4b884ea5962b6beb3c0f93742db54246bbf8b3274e48b0aca47908e454be/jaxlib-0.10.2-cp313-cp313-manylinux_2_27_aarch64.whl", hash = "sha256:45b28b0238697ab74bbcf20411aafb6db42acc31836cc2fd711e5cf056bf9556", size = 81084260, upload-time = "2026-06-17T23:44:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/36/ac/4ee28c65861605945223145fbcd3c9362ec2255ddf7d917574e205548c82/jaxlib-0.10.2-cp313-cp313-manylinux_2_27_x86_64.whl", hash = "sha256:9e4818b4a8756fd3918766ca2aa5342125809f4f08a6fe46026d4386e7c23644", size = 85467706, upload-time = "2026-06-17T23:44:17.471Z" }, + { url = "https://files.pythonhosted.org/packages/79/54/9918b0f77a25a1299818c0610305ca2bea38ed90584f4489b60357e2dd39/jaxlib-0.10.2-cp313-cp313-win_amd64.whl", hash = "sha256:c75d6f1df1c9cff08e110b4a21c79560fdc502f4288972d6b117d25dafd44352", size = 65897894, upload-time = "2026-06-17T23:44:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/56/5b/70df11da52a8b1a826184cccc05a3fec8aed76058a980021873fba3069cb/jaxlib-0.10.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4c202d8ff7c1f3b5049dbd8f1e30e52759cd4e0a5835f0b3c7ae076a05818e28", size = 61564746, upload-time = "2026-06-17T23:44:24.421Z" }, + { url = "https://files.pythonhosted.org/packages/23/5c/184a648ea5db6c8b1a08fc5784c157b4c557255e009fb56091393df3c6de/jaxlib-0.10.2-cp313-cp313t-manylinux_2_27_aarch64.whl", hash = "sha256:b7b029bb95d981566750475b9719a9d6b66ed5dd2748851667899b6cfe075299", size = 81204888, upload-time = "2026-06-17T23:44:27.57Z" }, + { url = "https://files.pythonhosted.org/packages/6c/5c/539596a55265711d74147913278bcdc38412980be7d74d9c9d860297c486/jaxlib-0.10.2-cp313-cp313t-manylinux_2_27_x86_64.whl", hash = "sha256:e8b126097d609b0c6e6786e89f6dd6978adc02ebd5f63a1c61293fbac7821305", size = 85583810, upload-time = "2026-06-17T23:44:30.962Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/27471ec9f1d04674f6e62de809412371e097aed3eca7d9483e677c54c214/jaxlib-0.10.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:72eba28b12fee02616fa42aa4b881b4ab62d7757c7843c462401d3fb34a27be4", size = 61446097, upload-time = "2026-06-17T23:44:34.196Z" }, + { url = "https://files.pythonhosted.org/packages/af/c8/941a7f7f37510f51290a5bd1a413aeef977fb8ba8adc0cfe8391233a764c/jaxlib-0.10.2-cp314-cp314-manylinux_2_27_aarch64.whl", hash = "sha256:f18f56fee90699cfba9b6627045a7a299702cb0e2af82ce180d9a6a7c8048093", size = 81096546, upload-time = "2026-06-17T23:44:37.486Z" }, + { url = "https://files.pythonhosted.org/packages/69/77/ac054882c220872512df28d16aeb648fe0e651efbb5be4fd7c4817fd88b0/jaxlib-0.10.2-cp314-cp314-manylinux_2_27_x86_64.whl", hash = "sha256:ca34f363197fb0ac4082582ca755007910369e33f8a8ba3d35ed94b71070107d", size = 85472993, upload-time = "2026-06-17T23:44:40.904Z" }, + { url = "https://files.pythonhosted.org/packages/0d/7d/c592d1fa69c210be0d2743fffc598dfc2f54efa9671c5f6f5d1e151c6f4a/jaxlib-0.10.2-cp314-cp314-win_amd64.whl", hash = "sha256:99818b0a18adc0b899abf4873795e8d65169441d87ab2e5cbb228e73d0f25808", size = 68376553, upload-time = "2026-06-17T23:44:44.968Z" }, + { url = "https://files.pythonhosted.org/packages/54/9b/91b00ec74985d29708b50420b4103c1f651c8f1c253d4fcb49d1bbb532cd/jaxlib-0.10.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fc62997fce8831819551a2a5469a818169b09582b5b648c102d11ac7205bb812", size = 61564620, upload-time = "2026-06-17T23:44:48.217Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c7/49d2b19c3b3105c30e1d3af2062e82e1977fb239d3dc3cbb583ef676dda7/jaxlib-0.10.2-cp314-cp314t-manylinux_2_27_aarch64.whl", hash = "sha256:a24d6e3cba263978293eae8b41330d5ccf24d6cdd1a6bcd4e82aff34e767620d", size = 81206365, upload-time = "2026-06-17T23:44:51.419Z" }, + { url = "https://files.pythonhosted.org/packages/bf/99/006cedf443f4a01f2088651facce79b2105bfb4905bfe9162eb0920a6dfb/jaxlib-0.10.2-cp314-cp314t-manylinux_2_27_x86_64.whl", hash = "sha256:5a2ac7aed7c4e661f67600bbcdec9e589151c1efec91f4cdb8d484af1a45c895", size = 85584458, upload-time = "2026-06-17T23:44:55.377Z" }, +] + +[[package]] +name = "jaxtyping" +version = "0.3.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wadler-lindig", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/c1/091b8852bd7cbf50bd655543c8506033cf4029300c67f8c176c1286879a9/jaxtyping-0.3.11.tar.gz", hash = "sha256:b09c14acf6686feb9e0df5b0d8c6e7c5b6f8d36bf059ee54cd522a186c2ef050", size = 46489, upload-time = "2026-06-13T18:35:23.167Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/38/c66bbdc5047f4776c2bd3e47e5295a350e3fa44d5b8942105e71c2a876a0/jaxtyping-0.3.11-py3-none-any.whl", hash = "sha256:8a4bedc4e3f963fa82df41bd13c7ebc2bad925601eb48614c65798f21329d4e3", size = 56593, upload-time = "2026-06-13T18:35:22.01Z" }, +] + [[package]] name = "joblib" version = "1.5.2" @@ -1146,7 +1517,15 @@ name = "kiwisolver" version = "1.4.9" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -1337,6 +1716,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/7e/521c046b3bc9316c408d159bc4f2c4be607280b3646416b953bdd4efda6f/librt-0.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:b47395091e7e0ece1e6ebac9b98bf0c9084d1e3d3b2739aa566be7e56e3f7bf2", size = 21408, upload-time = "2025-11-29T14:01:55.126Z" }, ] +[[package]] +name = "mamba2-jax" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flax", marker = "python_full_version >= '3.12'" }, + { name = "jax", marker = "python_full_version >= '3.12'" }, + { name = "jaxlib", marker = "python_full_version >= '3.12'" }, + { name = "optax", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/c1/f5a9a7af5c852ef17c01512accba38e0b9b963a4421a274fe6a012d678a8/mamba2_jax-1.1.2.tar.gz", hash = "sha256:8113ad7236128b52806a8055afe6d5cbf1d17288e4e980ba3529942b26cd7daf", size = 24843, upload-time = "2026-06-23T14:44:46.957Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/11/a93dc336650403849ce471f6c114a0cf660c4cbc7b7d3ce9835234ae0933/mamba2_jax-1.1.2-py3-none-any.whl", hash = "sha256:17d015f0ac6d64c94bbf4be6d90b875eaad643bb78686508572ec0af7bc71721", size = 19936, upload-time = "2026-06-23T14:44:45.712Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + [[package]] name = "matplotlib" version = "3.9.4" @@ -1405,7 +1811,15 @@ name = "matplotlib" version = "3.10.7" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -1416,7 +1830,8 @@ dependencies = [ { name = "fonttools", version = "4.61.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "kiwisolver", version = "1.4.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "packaging", marker = "python_full_version >= '3.10'" }, { name = "pillow", version = "12.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pyparsing", marker = "python_full_version >= '3.10'" }, @@ -1489,6 +1904,154 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mintstate" +version = "0.2.1.dev2+g3cc9c6381" +source = { git = "https://github.com/mrc-ide/stateMINT.git?branch=mamba2-train#3cc9c6381cbe4d359a20762f8e11e279976aac48" } +dependencies = [ + { name = "etils", marker = "python_full_version >= '3.12'" }, + { name = "flax", marker = "python_full_version >= '3.12'" }, + { name = "huggingface-hub", marker = "python_full_version >= '3.12'" }, + { name = "jax", marker = "python_full_version >= '3.12'" }, + { name = "jaxtyping", marker = "python_full_version >= '3.12'" }, + { name = "mamba2-jax", marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "omegaconf", marker = "python_full_version >= '3.12'" }, + { name = "orbax-checkpoint", marker = "python_full_version >= '3.12'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/3a/c5b855752a70267ff729c349e650263adb3c206c29d28cc8ea7ace30a1d5/ml_dtypes-0.5.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b95e97e470fe60ed493fd9ae3911d8da4ebac16bd21f87ffa2b7c588bf22ea2c", size = 679735, upload-time = "2025-11-17T22:31:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/41/79/7433f30ee04bd4faa303844048f55e1eb939131c8e5195a00a96a0939b64/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4b801ebe0b477be666696bda493a9be8356f1f0057a57f1e35cd26928823e5a", size = 5051883, upload-time = "2025-11-17T22:31:33.658Z" }, + { url = "https://files.pythonhosted.org/packages/10/b1/8938e8830b0ee2e167fc75a094dea766a1152bde46752cd9bfc57ee78a82/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:388d399a2152dd79a3f0456a952284a99ee5c93d3e2f8dfe25977511e0515270", size = 5030369, upload-time = "2025-11-17T22:31:35.595Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a3/51886727bd16e2f47587997b802dd56398692ce8c6c03c2e5bb32ecafe26/ml_dtypes-0.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:4ff7f3e7ca2972e7de850e7b8fcbb355304271e2933dd90814c1cb847414d6e2", size = 210738, upload-time = "2025-11-17T22:31:37.43Z" }, + { url = "https://files.pythonhosted.org/packages/c6/5e/712092cfe7e5eb667b8ad9ca7c54442f21ed7ca8979745f1000e24cf8737/ml_dtypes-0.5.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6c7ecb74c4bd71db68a6bea1edf8da8c34f3d9fe218f038814fd1d310ac76c90", size = 679734, upload-time = "2025-11-17T22:31:39.223Z" }, + { url = "https://files.pythonhosted.org/packages/4f/cf/912146dfd4b5c0eea956836c01dcd2fce6c9c844b2691f5152aca196ce4f/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc11d7e8c44a65115d05e2ab9989d1e045125d7be8e05a071a48bc76eb6d6040", size = 5056165, upload-time = "2025-11-17T22:31:41.071Z" }, + { url = "https://files.pythonhosted.org/packages/a9/80/19189ea605017473660e43762dc853d2797984b3c7bf30ce656099add30c/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b9a53598f21e453ea2fbda8aa783c20faff8e1eeb0d7ab899309a0053f1483", size = 5034975, upload-time = "2025-11-17T22:31:42.758Z" }, + { url = "https://files.pythonhosted.org/packages/b4/24/70bd59276883fdd91600ca20040b41efd4902a923283c4d6edcb1de128d2/ml_dtypes-0.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:7c23c54a00ae43edf48d44066a7ec31e05fdc2eee0be2b8b50dd1903a1db94bb", size = 210742, upload-time = "2025-11-17T22:31:44.068Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c9/64230ef14e40aa3f1cb254ef623bf812735e6bec7772848d19131111ac0d/ml_dtypes-0.5.4-cp311-cp311-win_arm64.whl", hash = "sha256:557a31a390b7e9439056644cb80ed0735a6e3e3bb09d67fd5687e4b04238d1de", size = 160709, upload-time = "2025-11-17T22:31:46.557Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a1/4008f14bbc616cfb1ac5b39ea485f9c63031c4634ab3f4cf72e7541f816a/ml_dtypes-0.5.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c760d85a2f82e2bed75867079188c9d18dae2ee77c25a54d60e9cc79be1bc48", size = 676888, upload-time = "2025-11-17T22:31:56.907Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b7/dff378afc2b0d5a7d6cd9d3209b60474d9819d1189d347521e1688a60a53/ml_dtypes-0.5.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce756d3a10d0c4067172804c9cc276ba9cc0ff47af9078ad439b075d1abdc29b", size = 5036993, upload-time = "2025-11-17T22:31:58.497Z" }, + { url = "https://files.pythonhosted.org/packages/eb/33/40cd74219417e78b97c47802037cf2d87b91973e18bb968a7da48a96ea44/ml_dtypes-0.5.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:533ce891ba774eabf607172254f2e7260ba5f57bdd64030c9a4fcfbd99815d0d", size = 5010956, upload-time = "2025-11-17T22:31:59.931Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8b/200088c6859d8221454825959df35b5244fa9bdf263fd0249ac5fb75e281/ml_dtypes-0.5.4-cp313-cp313-win_amd64.whl", hash = "sha256:f21c9219ef48ca5ee78402d5cc831bd58ea27ce89beda894428bc67a52da5328", size = 212224, upload-time = "2025-11-17T22:32:01.349Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/dfc3775cb36367816e678f69a7843f6f03bd4e2bcd79941e01ea960a068e/ml_dtypes-0.5.4-cp313-cp313-win_arm64.whl", hash = "sha256:35f29491a3e478407f7047b8a4834e4640a77d2737e0b294d049746507af5175", size = 160798, upload-time = "2025-11-17T22:32:02.864Z" }, + { url = "https://files.pythonhosted.org/packages/4f/74/e9ddb35fd1dd43b1106c20ced3f53c2e8e7fc7598c15638e9f80677f81d4/ml_dtypes-0.5.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:304ad47faa395415b9ccbcc06a0350800bc50eda70f0e45326796e27c62f18b6", size = 702083, upload-time = "2025-11-17T22:32:04.08Z" }, + { url = "https://files.pythonhosted.org/packages/74/f5/667060b0aed1aa63166b22897fdf16dca9eb704e6b4bbf86848d5a181aa7/ml_dtypes-0.5.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a0df4223b514d799b8a1629c65ddc351b3efa833ccf7f8ea0cf654a61d1e35d", size = 5354111, upload-time = "2025-11-17T22:32:05.546Z" }, + { url = "https://files.pythonhosted.org/packages/40/49/0f8c498a28c0efa5f5c95a9e374c83ec1385ca41d0e85e7cf40e5d519a21/ml_dtypes-0.5.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531eff30e4d368cb6255bc2328d070e35836aa4f282a0fb5f3a0cd7260257298", size = 5366453, upload-time = "2025-11-17T22:32:07.115Z" }, + { url = "https://files.pythonhosted.org/packages/8c/27/12607423d0a9c6bbbcc780ad19f1f6baa2b68b18ce4bddcdc122c4c68dc9/ml_dtypes-0.5.4-cp313-cp313t-win_amd64.whl", hash = "sha256:cb73dccfc991691c444acc8c0012bee8f2470da826a92e3a20bb333b1a7894e6", size = 225612, upload-time = "2025-11-17T22:32:08.615Z" }, + { url = "https://files.pythonhosted.org/packages/e5/80/5a5929e92c72936d5b19872c5fb8fc09327c1da67b3b68c6a13139e77e20/ml_dtypes-0.5.4-cp313-cp313t-win_arm64.whl", hash = "sha256:3bbbe120b915090d9dd1375e4684dd17a20a2491ef25d640a908281da85e73f1", size = 164145, upload-time = "2025-11-17T22:32:09.782Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2b857d3af6ac0d39db1de7c706e69c7f9791627209c3d6dedbfca8c7e5faec22", size = 673781, upload-time = "2025-11-17T22:32:11.364Z" }, + { url = "https://files.pythonhosted.org/packages/04/f9/067b84365c7e83bda15bba2b06c6ca250ce27b20630b1128c435fb7a09aa/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:805cef3a38f4eafae3a5bf9ebdcdb741d0bcfd9e1bd90eb54abd24f928cd2465", size = 5036145, upload-time = "2025-11-17T22:32:12.783Z" }, + { url = "https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14a4fd3228af936461db66faccef6e4f41c1d82fcc30e9f8d58a08916b1d811f", size = 5010230, upload-time = "2025-11-17T22:32:14.38Z" }, + { url = "https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl", hash = "sha256:8c6a2dcebd6f3903e05d51960a8058d6e131fe69f952a5397e5dbabc841b6d56", size = 221032, upload-time = "2025-11-17T22:32:15.763Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/9c912fe6ea747bb10fe2f8f54d027eb265db05dfb0c6335e3e063e74e6e8/ml_dtypes-0.5.4-cp314-cp314-win_arm64.whl", hash = "sha256:5a0f68ca8fd8d16583dfa7793973feb86f2fbb56ce3966daf9c9f748f52a2049", size = 163353, upload-time = "2025-11-17T22:32:16.932Z" }, + { url = "https://files.pythonhosted.org/packages/cd/02/48aa7d84cc30ab4ee37624a2fd98c56c02326785750cd212bc0826c2f15b/ml_dtypes-0.5.4-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:bfc534409c5d4b0bf945af29e5d0ab075eae9eecbb549ff8a29280db822f34f9", size = 702085, upload-time = "2025-11-17T22:32:18.175Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e7/85cb99fe80a7a5513253ec7faa88a65306be071163485e9a626fce1b6e84/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2314892cdc3fcf05e373d76d72aaa15fda9fb98625effa73c1d646f331fcecb7", size = 5355358, upload-time = "2025-11-17T22:32:19.7Z" }, + { url = "https://files.pythonhosted.org/packages/79/2b/a826ba18d2179a56e144aef69e57fb2ab7c464ef0b2111940ee8a3a223a2/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d2ffd05a2575b1519dc928c0b93c06339eb67173ff53acb00724502cda231cf", size = 5366332, upload-time = "2025-11-17T22:32:21.193Z" }, + { url = "https://files.pythonhosted.org/packages/84/44/f4d18446eacb20ea11e82f133ea8f86e2bf2891785b67d9da8d0ab0ef525/ml_dtypes-0.5.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4381fe2f2452a2d7589689693d3162e876b3ddb0a832cde7a414f8e1adf7eab1", size = 236612, upload-time = "2025-11-17T22:32:22.579Z" }, + { url = "https://files.pythonhosted.org/packages/ad/3f/3d42e9a78fe5edf792a83c074b13b9b770092a4fbf3462872f4303135f09/ml_dtypes-0.5.4-cp314-cp314t-win_arm64.whl", hash = "sha256:11942cbf2cf92157db91e5022633c0d9474d4dfd813a909383bd23ce828a4b7d", size = 168825, upload-time = "2025-11-17T22:32:23.766Z" }, + { url = "https://files.pythonhosted.org/packages/af/a1/4f20f56ba9c21c7ee78505dc9f782017ffc9ae9ff261179e28da710e3900/ml_dtypes-0.5.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d81fdb088defa30eb37bf390bb7dde35d3a83ec112ac8e33d75ab28cc29dd8b0", size = 676875, upload-time = "2025-11-17T22:32:24.954Z" }, + { url = "https://files.pythonhosted.org/packages/71/85/846992d38a1f3ca561ac5d05f7bd8654695f2a3c202fcdc4f9e53951f211/ml_dtypes-0.5.4-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88c982aac7cb1cbe8cbb4e7f253072b1df872701fcaf48d84ffbb433b6568f24", size = 5046025, upload-time = "2025-11-17T22:32:26.767Z" }, + { url = "https://files.pythonhosted.org/packages/22/08/f9aaafa02f46b1d81bf3b7a158b1b9df24df6e4b8ec0082a26eaf16ce229/ml_dtypes-0.5.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9b61c19040397970d18d7737375cffd83b1f36a11dd4ad19f83a016f736c3ef", size = 5018614, upload-time = "2025-11-17T22:32:28.231Z" }, + { url = "https://files.pythonhosted.org/packages/63/8a/bc7f9c8c358214dba25f70077dbc85aac85f92d255a6f20dd3ae64026a43/ml_dtypes-0.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:3d277bf3637f2a62176f4575512e9ff9ef51d00e39626d9fe4a161992f355af2", size = 210704, upload-time = "2025-11-17T22:32:29.696Z" }, +] + +[[package]] +name = "msgpack" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/16/f70100614b69feb3ade7285f08c9c52d6cda0a5c03f3f5e2facd63acb211/msgpack-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c7b398c56ff125feae96c2737abfec5595f1fa0aa186df60c56040b8accb95c", size = 82926, upload-time = "2026-06-18T16:12:31.531Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3c/08ecd5cdfe4e2de43aec79062028ad0f7b2d9b1fea5430068c198ba570da/msgpack-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1548006a91aa93c5da81f3bdcebc1a0d10cea2d25969754fbe848da622b2b895", size = 82730, upload-time = "2026-06-18T16:12:32.894Z" }, + { url = "https://files.pythonhosted.org/packages/19/9f/a70c9cb1a04ecc134005149367dcfe35d167284e8f65035a1e4156ad17b5/msgpack-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dabedcd0f23559f3596428c6589c1cd8c6eaed3a0d720795b07b0225d769203", size = 400729, upload-time = "2026-06-18T16:12:34.052Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7f/5ce020168cf0439041526e95aa068c722c016aee21624e331aeabeee2e8e/msgpack-1.2.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83efa1c898e0fc5380fc0cabbf75164c52e3b5cbb45973710d75821928380c73", size = 407625, upload-time = "2026-06-18T16:12:35.239Z" }, + { url = "https://files.pythonhosted.org/packages/79/70/fb7668ce0386819303047057aef6fc1da73b584291d9cff82b821744e2ef/msgpack-1.2.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01e2dd6c9b19d333a00282330cc8a73d38d8dabc306dc5b42cd668c3ac82e833", size = 377891, upload-time = "2026-06-18T16:12:36.684Z" }, + { url = "https://files.pythonhosted.org/packages/3d/dc/9ebe654a73c3aed2e40aa6b52e3c2a02b5f53ef0085fa235a45d5b367f87/msgpack-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:350cb813d0af6e65d2f7ef0d729f7ff5be5a8bce03665892f43e5883d4ecc1b8", size = 391987, upload-time = "2026-06-18T16:12:37.839Z" }, + { url = "https://files.pythonhosted.org/packages/42/eb/b67cf64218a2fa25e1c671fe1d3dbb06cbeb973e71bc4b822da079862d0b/msgpack-1.2.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ee1d9ed27d0497b848923746cf762ed2e7db24f4be7eec8e5cbe8c766aa707b7", size = 374603, upload-time = "2026-06-18T16:12:39.221Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2e/9ee200cde32fd1a0101b4006202fde554c1860adfb9bf7bff31ea4c08df8/msgpack-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:633727297ed063441fd1cda2288865487f33ad14eeb8831afb5f0c396a62cfce", size = 405121, upload-time = "2026-06-18T16:12:40.524Z" }, + { url = "https://files.pythonhosted.org/packages/43/b6/f10117be7ca7a51e8feed699a907b8e663a8cd66e115ae6b4fb30cc7945c/msgpack-1.2.1-cp310-cp310-win32.whl", hash = "sha256:298872ecf9e61950f1c6af4ca969b859ee91783bb920ef6e6172697d0c8aad74", size = 64088, upload-time = "2026-06-18T16:12:41.762Z" }, + { url = "https://files.pythonhosted.org/packages/ba/93/89976c696fb0224662239d952c47b4d1661b34d79a332ef5584facaa8579/msgpack-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2ff164c1b0bcb740b073b99e945234d0212852fa378e44a208c425379140dbeb", size = 70113, upload-time = "2026-06-18T16:12:42.78Z" }, + { url = "https://files.pythonhosted.org/packages/f4/6b/e9b1cdc042c4458801d2545ed782a95f3d6ba8e270cce8745b8603c7f748/msgpack-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29a3f6e9667868429d8240dfd063ea5ffdc1321c13d783aa23827a38de0dcb22", size = 82812, upload-time = "2026-06-18T16:12:45.022Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3a/dd518a1bf78ed1e9ad8afe57307c079a00eafe4b3068932a27ca1ea56b4f/msgpack-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aded5bdf32609dc7987a49bbbd15a8ef096193f96dd8bbeb791de729e650acf5", size = 82739, upload-time = "2026-06-18T16:12:46.025Z" }, + { url = "https://files.pythonhosted.org/packages/70/e0/7ba9e1542bf0771a27b8b37c1316e3f95ae9d748fd765284655c476ad4ef/msgpack-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:146ee4e9ce80b365c6d4c47073da9da7bcec473e58194ceee5dd7620ace77e06", size = 414233, upload-time = "2026-06-18T16:12:47.029Z" }, + { url = "https://files.pythonhosted.org/packages/03/8d/671d81534ea0e2b0e8a121be100020da09eb78861fe3aa8f3ef7dcd3bed1/msgpack-1.2.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a28d076ca7c82b9c8728ad90b7147489449557038bed50e4241eb832395169b4", size = 423843, upload-time = "2026-06-18T16:12:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b6/e5c737515ed1f166664b87601b532f58cbb73d8aa6a90b99f7c2c5037e8e/msgpack-1.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7d31c0ac0c640f877804c67cb2bc9f4e23dc2db97e96c2e67fa27d38283b41f8", size = 390772, upload-time = "2026-06-18T16:12:49.624Z" }, + { url = "https://files.pythonhosted.org/packages/a8/46/62ed8c2e87d7021eab19921594d961ef3aa3794eec76c716dc30f3bfd433/msgpack-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ff92d7feeaf5bc26c51495b69e2f99ed97ab79346fb6555f44be7dd2ac6503b", size = 409559, upload-time = "2026-06-18T16:12:50.936Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/59aa3887b860bbf43532835e192b1c388a17590d6068ae4f8b2bc74c906e/msgpack-1.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:779197a6513bab3c3632265e3d0f7cb3227e62510841a6f34f1eaa37efbb345e", size = 387838, upload-time = "2026-06-18T16:12:52.161Z" }, + { url = "https://files.pythonhosted.org/packages/09/11/f8563e471093420cf6478cb3271a0175d8402b82d879783d4035d2d03360/msgpack-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:67f6dd22fa72a93752643f07889796d62739a13415ee630169a8ce764f86cf9f", size = 421732, upload-time = "2026-06-18T16:12:53.556Z" }, + { url = "https://files.pythonhosted.org/packages/57/cf/e673683c4c6c90c1022b24c65af4b03eda72b182a1176ef6449069d66acc/msgpack-1.2.1-cp311-cp311-win32.whl", hash = "sha256:91054a783328e0ea7954b8771095705c8d2243b814743fbaadf14552c9c52c5d", size = 64091, upload-time = "2026-06-18T16:12:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/ca212739d179f9083bff2c7c08c24101c3555a334fadc2b876b18768a3ae/msgpack-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2eda0b7ebb1283a98d3e4492ac933c8af6aff59fd3df1c3ed024f536af4b1dc8", size = 70462, upload-time = "2026-06-18T16:12:55.898Z" }, + { url = "https://files.pythonhosted.org/packages/6d/be/6798347b425e26f35db82e69dd83c09716c856a3714e7bffc4c0860fd830/msgpack-1.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ee967f7c7e1df2890c671ff2ee51a28ded0efc95da3e507176dee881ce36c66", size = 65059, upload-time = "2026-06-18T16:12:57.053Z" }, + { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, + { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504, upload-time = "2026-06-18T16:13:08.822Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421, upload-time = "2026-06-18T16:13:09.828Z" }, + { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775, upload-time = "2026-06-18T16:13:11.056Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151, upload-time = "2026-06-18T16:13:12.173Z" }, + { url = "https://files.pythonhosted.org/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351, upload-time = "2026-06-18T16:13:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518, upload-time = "2026-06-18T16:13:14.233Z" }, + { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405, upload-time = "2026-06-18T16:13:15.435Z" }, + { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257, upload-time = "2026-06-18T16:13:17.022Z" }, + { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469, upload-time = "2026-06-18T16:13:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802, upload-time = "2026-06-18T16:13:19.685Z" }, + { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273, upload-time = "2026-06-18T16:13:21.028Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471, upload-time = "2026-06-18T16:13:22.293Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274, upload-time = "2026-06-18T16:13:23.455Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795, upload-time = "2026-06-18T16:13:24.687Z" }, + { url = "https://files.pythonhosted.org/packages/77/58/cce442852c6b9e1639c7c8ac8fd9143121cb32dab0f308df4d1426a8eb9c/msgpack-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:05f340e47e7e47d2da8db9b53e1bb1d294369e9ef45a747441309f6650b8351d", size = 83610, upload-time = "2026-06-18T16:13:25.724Z" }, + { url = "https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:810b916696c86ef0deb3b74588480224df4c1b071136c34183e4a2a4284d7ac7", size = 83138, upload-time = "2026-06-18T16:13:26.781Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/99e58722feaffc5f2fbcc0c8c0d1451ab9f84097f7af87291b46af2390f4/msgpack-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca0dacff965c47afdc3749a8469d7302a8f801d6a28758d55120d75e66ce6889", size = 406090, upload-time = "2026-06-18T16:13:28.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/03/8c63e8cf52958534ef688625965ab04c269a6cadd8caef16758b380a821a/msgpack-1.2.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e2bf9280bceb5efca998435904b5d3e9fdbcc11d90dc9df30aec7973252b720", size = 412106, upload-time = "2026-06-18T16:13:29.427Z" }, + { url = "https://files.pythonhosted.org/packages/63/d2/155d9e71b40e41fd934bc0c48b9b2770f22263e1ac20aad8e29fdca7be3f/msgpack-1.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6c4be5d1c02a42b066ca6ddb71adf36432868fdcdb6ee87e634e86e0674190", size = 374851, upload-time = "2026-06-18T16:13:30.631Z" }, + { url = "https://files.pythonhosted.org/packages/98/48/deaf2326262a8d5ea3295ce9649912ecd3f551ba7ec8e33c665d2ba583f3/msgpack-1.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec0e675d59150a6269ddc9139087c722292664a37d071a849c05c473350f1f2d", size = 396168, upload-time = "2026-06-18T16:13:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/2a/b4410f906c2ec0008f1608d3ab5143afc3ad3f4e6da0fed3ea2231d0bef4/msgpack-1.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dd3bfe82d53edfe4b7fc9a7ec9761e23a7a5b1dac22264505af428253c29ed24", size = 371959, upload-time = "2026-06-18T16:13:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/59/86/1edc67270099a528fa2093ea60fe191233cd238e4bd30cfacf7db79fc959/msgpack-1.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ad5467fc3f68b5468e06c5f788d712e9f8ffc8b0cd1bcb160c105c1ee92dae7", size = 408457, upload-time = "2026-06-18T16:13:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/82/90/8b630fef07d8c5ab457b71ff2c217910c83d333c7a68472c186e87cc504a/msgpack-1.2.1-cp314-cp314-win32.whl", hash = "sha256:98b58bdb89c46190e4609bb36abe17c6d4105ad13f9c5f8f6f64d320f8ced3fb", size = 65942, upload-time = "2026-06-18T16:13:36.056Z" }, + { url = "https://files.pythonhosted.org/packages/16/f1/467b81e98b24dd3885d7b1857728797b4ffc76a7a7483af4fb321a07de3c/msgpack-1.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:74847557e28ce71bd3c438a447ca90e4b507e997ddbdef8a12a7b283b86c156b", size = 72627, upload-time = "2026-06-18T16:13:37.079Z" }, + { url = "https://files.pythonhosted.org/packages/a7/1d/5d8c4c89985feb6acefb82a09e501c60392261856d2408d20bfe4f0360b1/msgpack-1.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:b50b727bd652bdc37d950336c848ef20ec54a4cafc38dce19b1cd86ad625d0f7", size = 66908, upload-time = "2026-06-18T16:13:38.23Z" }, + { url = "https://files.pythonhosted.org/packages/1b/02/ad2afb678b4de94496cd432b581759b756a92c1192d8c767edd6b132efdc/msgpack-1.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8d00f177ca88a77c1cf848d204a38f249751650b601cb6532acc68805d8a8273", size = 86000, upload-time = "2026-06-18T16:13:39.44Z" }, + { url = "https://files.pythonhosted.org/packages/54/74/0b797484013128837f3b1cbb6cea019277c4de4e377dc512b4d9a0f92940/msgpack-1.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5bb9c386f0a329c035ddbab4b72d1028bf9627add8dda41070288563d57ed1b1", size = 86544, upload-time = "2026-06-18T16:13:40.447Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b4/b774d7eb95561739907fec675582f83203cf41c597a418c2589b4bfb8e9d/msgpack-1.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20466cca18c49c7292a8984bc15d65857b171e7264bdcb5f96baf8be238791fc", size = 427661, upload-time = "2026-06-18T16:13:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f9/3243191dc9937e00756c8bc1b0272fed8f23758e43df2a3b46f533e5090f/msgpack-1.2.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:196300e7e5d6e74d50f1607ab9c06c4a1484c383cd22defd727902591f7e8dde", size = 426375, upload-time = "2026-06-18T16:13:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/23/c7/1693111db9944ba4ad4b67a1e788400d78a0b6af7a6523dc7e4e58f8274b/msgpack-1.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575957e79cd51903a4e8495a242442949641e08f1efd5197b43bebd3ea7682b4", size = 380495, upload-time = "2026-06-18T16:13:44.306Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2b/92f86956a0c13e8662f7e2ad630c4eb4db07497b967589bd5245e018b2c1/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8c2ed1e48cc0f460bf3c7780e7137ff21a4e18433451916f2442c1b21036cd7d", size = 410897, upload-time = "2026-06-18T16:13:45.629Z" }, + { url = "https://files.pythonhosted.org/packages/da/ea/1479f72d200313a76fc2f823a79d1e07ed052ab7b8a0280640aa7b95de42/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f6277e5f783c36786a145e0247fc189a03f35f84b251646e53592d2bc12b355", size = 378519, upload-time = "2026-06-18T16:13:46.998Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/fa006060ffa1011d32bfae826fe766fe73e02982183601633b7121058ab3/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9389552ecf4784886345ead0647e4edc96bee37cbab05b75540f542f766c48c", size = 419815, upload-time = "2026-06-18T16:13:48.205Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/aab6c946570496b78e67804721f3d5e2d62a93081b9b37df77764ef56347/msgpack-1.2.1-cp314-cp314t-win32.whl", hash = "sha256:c1c79a604a2969a868a78b6ebd27a887e00c624f14f66b3038e0590cb23332d1", size = 70914, upload-time = "2026-06-18T16:13:49.385Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/e608956488a2af014cfe6e3d665e090b8ee42aa14b07f8f95b8880d66b09/msgpack-1.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f12038a35fabd52e56a3547bab42401af49a45caa6dd00b34c44de235bc93ee2", size = 77999, upload-time = "2026-06-18T16:13:50.467Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8a/27e2e57055176e366a46b85d02d68e7a5bcfbdd8474c9706375d965f24d3/msgpack-1.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0adcf06ffde0777c0e1a9b771a2b1c4226ba1bbf748c8efcc02fcdeca3299107", size = 71160, upload-time = "2026-06-18T16:13:51.498Z" }, +] + [[package]] name = "mypy" version = "1.19.0" @@ -1550,6 +2113,15 @@ 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 = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + [[package]] name = "numpy" version = "2.0.2" @@ -1675,7 +2247,6 @@ name = "numpy" version = "2.3.5" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", "python_full_version == '3.11.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } @@ -1755,6 +2326,68 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, ] +[[package]] +name = "numpy" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/05/3d27272d30698dc0ecb7fdfaa41ad70303b444f81722bb99bce1d818638a/numpy-2.5.0.tar.gz", hash = "sha256:5a129578019311b6e56bdd714250f19b518f7dceeeb8d1af5490f4942d3f891c", size = 20652461, upload-time = "2026-06-21T20:57:51.95Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/0a/11486d02add7b1384dff7374d124b1cfbb0ee864dcc9f6a2c0380638cf84/numpy-2.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:489780423903667933b4ed6197b6ec3b75ea5dd17d1d8f0f38d798feb6921561", size = 16789987, upload-time = "2026-06-21T20:56:16.657Z" }, + { url = "https://files.pythonhosted.org/packages/55/b2/285f48640a181947b4587a3766d21ec1eaa7fea833d4b49957e09da467a2/numpy-2.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ece55976ced6bca95a03ae2839e2e5ccffe8eb6a3e7022415645eb154a81e4e6", size = 11760322, upload-time = "2026-06-21T20:56:19.813Z" }, + { url = "https://files.pythonhosted.org/packages/dd/67/b032db1eb03ca30d16eda3b0c22aaa615338b9263c2fd559d0f29451aca4/numpy-2.5.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:c83b664b0e6eee9594fa920cf0639d8af796606d3fad6cc70180c87e4b97c7be", size = 5319605, upload-time = "2026-06-21T20:56:22.173Z" }, + { url = "https://files.pythonhosted.org/packages/b9/83/03fc7300c7c6b6c84c487b1dc80d322817b95fbd1f4dd57a85e23b7198de/numpy-2.5.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:bf80333980bf37f523341ddd72c783f39d6829ec7736b9eb99086388a2d52cc2", size = 6653628, upload-time = "2026-06-21T20:56:23.914Z" }, + { url = "https://files.pythonhosted.org/packages/82/49/2ec21730bc63ccfda829323f7040a8ed4715b3852ce658689cf74ee96a8c/numpy-2.5.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1a4874217b36d5ac8fc876f52e39df56f8182c88463e9e2dceabf7ca8b7efb8", size = 15153691, upload-time = "2026-06-21T20:56:25.631Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6b/f4a3d0637692c49da8ef99d72d52526f92e0a8d6ac4f0ca9f31441b9d9ea/numpy-2.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aaa760137137e8d3c920d27927748215b56014f92667dc9b6c27dfc61249255a", size = 16660066, upload-time = "2026-06-21T20:56:28.009Z" }, + { url = "https://files.pythonhosted.org/packages/3a/2f/c354ec86d1f3f5c19649463b0d39652e160736e5b0a4cd18dff0576715c4/numpy-2.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7174ce8265fc7f7417d171c9ea8fe905220748893ea67a2a7abe726ec331c4b0", size = 16514638, upload-time = "2026-06-21T20:56:30.26Z" }, + { url = "https://files.pythonhosted.org/packages/06/34/43efdcb319988648580f93c11f1ae82cf7e2faa74925e98e454ae3aa95f8/numpy-2.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b8c3daaf99de52415d20b42f8e8155c78642cb04207d02f9d317a0dcf1b3fb54", size = 18419647, upload-time = "2026-06-21T20:56:32.41Z" }, + { url = "https://files.pythonhosted.org/packages/71/e2/f5d1676b1d7fb682eb5e9a1641e7ebd2414b3216c370661d1029778908b4/numpy-2.5.0-cp312-cp312-win32.whl", hash = "sha256:6206db0af545d73d068add6d992279145f158428d1da6cc49adc4b630c5d6ee5", size = 6056688, upload-time = "2026-06-21T20:56:34.657Z" }, + { url = "https://files.pythonhosted.org/packages/8f/7c/48f115d1c58a34032facebcd51fdf2d02df2c51d4a46a81dd1197bb2ea6b/numpy-2.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:6f2d6873e2940c860a309d21e25b1e69af6aaffdd80aa056b04c16380db1c4f2", size = 12419237, upload-time = "2026-06-21T20:56:36.24Z" }, + { url = "https://files.pythonhosted.org/packages/86/26/2e0882f4044d1b1a1b63e875151fb2393389032022a8b7f5657a7996d3b2/numpy-2.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:a55e1eb2bca2cfd17a16b213c99dfc8502d47b0d494224d2122277d0400935ca", size = 10339912, upload-time = "2026-06-21T20:56:38.733Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/07675aaad7f26ea013d5e884d9a0d784b79c6bd7566c333f5a52fa3c610b/numpy-2.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:520e6b8be0a4b65840ac8090d4f51cef4bed66e2b0894d5a520f099adc24a9b2", size = 16784890, upload-time = "2026-06-21T20:56:40.799Z" }, + { url = "https://files.pythonhosted.org/packages/85/4b/953118a730ee3b35e28645e0eb4cf9beec5bdbb954e1ac2f5fcefba6bbc3/numpy-2.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:146b81cdd3967fdb6beca8ba25f00c58741d8f3cbd797f55af0fbe0bfec3469c", size = 11754584, upload-time = "2026-06-21T20:56:43.094Z" }, + { url = "https://files.pythonhosted.org/packages/44/9b/56dd530c367c74ae17411027cea4135ca57e1e0583bf5594cee18bd83217/numpy-2.5.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:126b88d95e8ff9b00c9e717aa540469f21d6180162f84c0caec51b16215d49cd", size = 5313904, upload-time = "2026-06-21T20:56:45.503Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b0/bcd672edad27ecca7da1f7bb0ce72cd1706a4f2d79ae94990afc97c13e1c/numpy-2.5.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d4313cef1594c5ce46c31b6e54e918338f63f16ee9322304e8c9114d6d81c8bd", size = 6648504, upload-time = "2026-06-21T20:56:47.567Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/15cdfcbd30a1544a46c9e487a00df331c4672450216538705a9e51fa6710/numpy-2.5.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:750fb097caf26fa878746d9d119f6f9da12dedcbff1eea966c3e3447647c4a9e", size = 15150086, upload-time = "2026-06-21T20:56:49.352Z" }, + { url = "https://files.pythonhosted.org/packages/32/4e/8d7656ccaab3e81e97258b8a9bc5f0c8502513a92fb4ceb0a2cbfebc17bf/numpy-2.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3893adc2dc7c0412ba76777db55a049215d99c9aa3113003be8f49f4f1290ab9", size = 16647250, upload-time = "2026-06-21T20:56:51.542Z" }, + { url = "https://files.pythonhosted.org/packages/3c/81/97060281b602ed07f21b12f4ec409eac1f75a2f91fbc829ed8b2becf3ad4/numpy-2.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:835e454dd99b238cdc5a3f63bce2371296f5ebc53ca1e0f8e6ddbb6d92a29aab", size = 16512864, upload-time = "2026-06-21T20:56:55.401Z" }, + { url = "https://files.pythonhosted.org/packages/33/ab/4496208146911f8d8ddb54f68a972aafa6c8d44babcb2ea03b0e5cc87c9d/numpy-2.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f9836778081a0a3c02a6a21493f3e9f5b311f8d2541934f31f05583dc999ea4", size = 18408407, upload-time = "2026-06-21T20:56:57.75Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9f/a4df67c181e4ee8b467aa3332dc2db10fd5c515136831302f3ca48bc0a01/numpy-2.5.0-cp313-cp313-win32.whl", hash = "sha256:0b525be4744b60bb0557ac872d53ef07d085b5f39622bc579c98d3809d05b988", size = 6054431, upload-time = "2026-06-21T20:57:00.016Z" }, + { url = "https://files.pythonhosted.org/packages/30/53/491e1c47c55b62ccc6a63c1c5b8635c73fc2258dddeb9bda27cae4a0ae96/numpy-2.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:44353e2878930039db472b99dc353d749826e4010bd4d2a7f835e94a97a5c748", size = 12414420, upload-time = "2026-06-21T20:57:01.815Z" }, + { url = "https://files.pythonhosted.org/packages/eb/4a/25c2906f541e9d9f4c5769764db732e6627be91a13f4724fa10634d77db4/numpy-2.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:48f54b00711f83a5f796b70c518e8c2b3c5848dda03a54911f23eb68519b9b60", size = 10339533, upload-time = "2026-06-21T20:57:03.961Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/abc44aaceaf7b17ee1edde2bbb4458da591bc79574cffff50c4bb35f00d1/numpy-2.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f27582c55ba4c750b7c58c8faf021d2cd9324a662b466229db8a417b41368af9", size = 16783807, upload-time = "2026-06-21T20:57:06.253Z" }, + { url = "https://files.pythonhosted.org/packages/5d/39/b72e168daf9c00fb20c9fc996d00437ccecdef3102387775d29d7a62576d/numpy-2.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:28e7137057d551e4a83c4ae414e3451f50568409db7569aacc7f9811ee06a446", size = 11765215, upload-time = "2026-06-21T20:57:08.547Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a0/8400a9c0e3625182347593f5e1f57da9a617a534794805c8df5518154ddc/numpy-2.5.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e1da54b53e75cd9fcfc23efcc7edab2c6aecf97b6037566d8a0fe804af8ec57c", size = 5324493, upload-time = "2026-06-21T20:57:11.012Z" }, + { url = "https://files.pythonhosted.org/packages/f6/8c/0d104deaa0401c93395a629ec902891618a2eff76d19229139cb5a887bfc/numpy-2.5.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:694d8f74e156f7fd01179f1aa8faa2f648ab6ae0f70b6c3fe57a03249aea2303", size = 6645211, upload-time = "2026-06-21T20:57:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d9/4a4a628c812750363786afc3d33492709a5cd64b215469c16b0f6c7bb811/numpy-2.5.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a7569a7b53c77716f036bb28cb1c91f166a26ec7d9502cd1e4bdfe502fdec22", size = 15166004, upload-time = "2026-06-21T20:57:14.717Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5e/2a902317d7fc4aa93236e80c932662dadfc459b323d758329e01775125e1/numpy-2.5.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39a0433bd4086ebd462960cf375e19195bb07b53dc1d87dd5fcf47ad78576f03", size = 16650797, upload-time = "2026-06-21T20:57:16.906Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a0/a0090e6329f4ca5992c07847bb579c5259a19953dc57255bb08793142ffb/numpy-2.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:929f0c79ac38bcbd7154fe631dc907abfeddbcc5027a896bd1f7767323271e7a", size = 16524647, upload-time = "2026-06-21T20:57:19.165Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7d/6caf27734c42b65837e7461ed0dbbd6b6fc835060c9714ec59d673bb383a/numpy-2.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cc4f247a47bbf070bfd70be53ccdcf47b800af563535e7bbe172322197c30e21", size = 18411841, upload-time = "2026-06-21T20:57:21.638Z" }, + { url = "https://files.pythonhosted.org/packages/13/dc/26edadbd812536769a82c2e9e002234e33feb5da43061d47a044f6d309b7/numpy-2.5.0-cp314-cp314-win32.whl", hash = "sha256:5dc71423499fab3f46f7a7201155ade1669ea101f2f429d332df9e72f8161731", size = 6106361, upload-time = "2026-06-21T20:57:23.844Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9e/4dd1459282229a72d92dece2ae9138e5cac94a72263a7ceb48f37434c925/numpy-2.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:ebb81d9d5443e0309d6c54894c3fbed74ad7da0714352a67b6d773cd189eae73", size = 12551749, upload-time = "2026-06-21T20:57:25.945Z" }, + { url = "https://files.pythonhosted.org/packages/05/a7/6bc6384c080b86c7f6c85c5bc5b540b24f4f679cd144791d99574e90d462/numpy-2.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:3b94d0d0deceebfad3e67ae5c0e5eb87371e8f7a0581cd04a779928c2450cf1e", size = 10617072, upload-time = "2026-06-21T20:57:28.175Z" }, + { url = "https://files.pythonhosted.org/packages/86/6b/4a2b71d66ada5608ae02b63f150dfad520f6940721cb7f029ad270befc0e/numpy-2.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:22f3d43e362d650bc39db1f17851302874a148ca95ba6981c1dfb5fa6862f35b", size = 11881067, upload-time = "2026-06-21T20:57:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b2/d365eb40a20efb49d67e9feb90494ed8511282ee1f5fa16006675c65397d/numpy-2.5.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:243563efb4cd7528a264567e9fd206c87826457322521d06206a00bfa316c927", size = 5440290, upload-time = "2026-06-21T20:57:32.193Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5e/e9c03188de5f9b767e46a8fe988bcfd3efad066a4a3fda8b9cb11a93f895/numpy-2.5.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:84881d825ca75249b189bbee875fcfe3238aa5c479e6100893cda566e8e86826", size = 6748371, upload-time = "2026-06-21T20:57:33.933Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1d/68c186a38a5027bae2c4ddd5ea681fdaf8b4d30fb7301def6d8ad270390f/numpy-2.5.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cda12aa4779d42b8771180aba759c96f527d43446d8f380ab59e2b35e8489efd", size = 15214643, upload-time = "2026-06-21T20:57:35.677Z" }, + { url = "https://files.pythonhosted.org/packages/8c/67/73f67b7c7e20635baae9c4c3ead4ae7326a005900297a6110971abd62eb5/numpy-2.5.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c0121101093d2bd74981b10f8837d78e794a8ff57834eb27179f49e1ba11ac6", size = 16690128, upload-time = "2026-06-21T20:57:38.159Z" }, + { url = "https://files.pythonhosted.org/packages/eb/05/d4c1fb0c46d02a27d6b2b8b319a78c90937acec8631c1641874670b31e6f/numpy-2.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d371c92cfa09da00022f501ab67fafaea813d752eb30ac44336d45b1e5b0268a", size = 16577902, upload-time = "2026-06-21T20:57:40.447Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1d/771c797d50fa26e4888989cccf1d50ee51f530d4e455ad2692dcb64fa711/numpy-2.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9990713e9c38154c6861e7547f1e3fc7a87e75ff09bab24ef1cc81d81c2835e9", size = 18452814, upload-time = "2026-06-21T20:57:42.875Z" }, + { url = "https://files.pythonhosted.org/packages/e8/46/52fc0d2a68d7643f0f149eeea5a5d8ea2a3507056ac8afa83c9212606e8b/numpy-2.5.0-cp314-cp314t-win32.whl", hash = "sha256:edadfbd4794b1086c0d822f81863e8a68fc129d132fd0bb9e31e955d7fbbbdb7", size = 6253168, upload-time = "2026-06-21T20:57:45.101Z" }, + { url = "https://files.pythonhosted.org/packages/2a/be/6c8d1118b5f13b2881dc095d5b345de19c6638b8959c17409b6eff84c8aa/numpy-2.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f7e5fa4382967ae6548bd2f174219afb908e294b0d5f625af01166edd5f7d9aa", size = 12736286, upload-time = "2026-06-21T20:57:46.935Z" }, + { url = "https://files.pythonhosted.org/packages/fd/6a/d3a169aaf8536cf228d56a09e04bcb713a2fe4410d4e2105b9419b5a9c89/numpy-2.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:016623417bb330d719d579daf2d6b9a01ddc52e41a9ed61a47f39fde46dcd865", size = 10686451, upload-time = "2026-06-21T20:57:49.313Z" }, +] + [[package]] name = "nvidia-nccl-cu12" version = "2.28.9" @@ -1764,6 +2397,70 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4a/4e/44dbb46b3d1b0ec61afda8e84837870f2f9ace33c564317d59b70bc19d3e/nvidia_nccl_cu12-2.28.9-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:485776daa8447da5da39681af455aa3b2c2586ddcf4af8772495e7c532c7e5ab", size = 296782137, upload-time = "2025-11-18T05:49:34.248Z" }, ] +[[package]] +name = "omegaconf" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "antlr4-python3-runtime", marker = "python_full_version >= '3.12'" }, + { name = "pyyaml", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/3d/e4b57b8d9008c6ebe0d5eff901f91d5700cf7bdb8c8863df817463a7fd5e/omegaconf-2.3.1.tar.gz", hash = "sha256:e5e7de64aeebeddaf8e6d3f7a783b32ac2a01c0fbd9c878012caecb891a1f42a", size = 3298472, upload-time = "2026-06-11T05:05:12.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/0e/152509871bf30df6fc38569f52a2db9b55dd41aae957adae50a053ac7778/omegaconf-2.3.1-py3-none-any.whl", hash = "sha256:3d701d14e9a8828f1edd28bb70b725908b34277cdd72cf7d6a83f94dadc6b6a0", size = 79502, upload-time = "2026-06-11T05:05:09.954Z" }, +] + +[[package]] +name = "opt-einsum" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/b9/2ac072041e899a52f20cf9510850ff58295003aa75525e58343591b0cbfb/opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac", size = 63004, upload-time = "2024-09-26T14:33:24.483Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd", size = 71932, upload-time = "2024-09-26T14:33:23.039Z" }, +] + +[[package]] +name = "optax" +version = "0.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "absl-py", marker = "python_full_version >= '3.12'" }, + { name = "jax", marker = "python_full_version >= '3.12'" }, + { name = "jaxlib", marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/f9/e3d11ae6f298ee941a0690e353a323d158ba5dedc436e75621c310845c5c/optax-0.2.8.tar.gz", hash = "sha256:5b225b35066fc3eebaa4d798f1b4173b4d57d1a480610908981f8343b50af0b0", size = 301193, upload-time = "2026-03-20T23:30:05.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/69/6a93d8600c339d7687a05857c7907bd4dd8cf88691a5ea106d7a50af90a1/optax-0.2.8-py3-none-any.whl", hash = "sha256:e3ca2d36c99daab1800ae9dbc0545034382d6bc780b24d969e1b0df65fa31cb4", size = 402960, upload-time = "2026-03-20T23:30:03.886Z" }, +] + +[[package]] +name = "orbax-checkpoint" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "absl-py", marker = "python_full_version >= '3.12'" }, + { name = "aiofiles", marker = "python_full_version >= '3.12'" }, + { name = "etils", extra = ["epath", "epy"], marker = "python_full_version >= '3.12'" }, + { name = "humanize", marker = "python_full_version >= '3.12'" }, + { name = "jax", marker = "python_full_version >= '3.12'" }, + { name = "msgpack", marker = "python_full_version >= '3.12'" }, + { name = "nest-asyncio", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "prometheus-client", marker = "python_full_version >= '3.12'" }, + { name = "protobuf", marker = "python_full_version >= '3.12'" }, + { name = "psutil", marker = "python_full_version >= '3.12'" }, + { name = "pyyaml", marker = "python_full_version >= '3.12'" }, + { name = "simplejson", marker = "python_full_version >= '3.12'" }, + { name = "tensorstore", marker = "python_full_version >= '3.12'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, + { name = "uvloop", marker = "python_full_version >= '3.12' and sys_platform != 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/f5/bf5ce9e75b5fedfa89950af7aad39fd60f6194a514aa505ce6a4099a34e0/orbax_checkpoint-0.12.0.tar.gz", hash = "sha256:7233730f18514bdef9b0a813dd84f05dd6578aebfe54682a3759f7655b54a769", size = 661894, upload-time = "2026-06-02T20:46:22.497Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/d1/63b5014a6184210292c66944f051e9fc95c0272fe5464d1b1a2de5de0104/orbax_checkpoint-0.12.0-py3-none-any.whl", hash = "sha256:bae412bdfc97ab09ba7b887d50486904fc0d9b8d55a18f0e6e92c3aed4ad5e54", size = 1261319, upload-time = "2026-06-02T20:46:20.895Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -1777,13 +2474,18 @@ wheels = [ name = "pandas" version = "2.3.3" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version < '3.10'", +] dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "python-dateutil", marker = "python_full_version < '3.12'" }, + { name = "pytz", marker = "python_full_version < '3.12'" }, + { name = "tzdata", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } wheels = [ @@ -1843,6 +2545,77 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/af/7be05277859a7bc399da8ba68b88c96b27b48740b6cf49688899c6eb4176/pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa", size = 11359119, upload-time = "2025-09-29T23:34:46.339Z" }, ] +[[package]] +name = "pandas" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.12'" }, + { name = "tzdata", marker = "(python_full_version >= '3.12' and sys_platform == 'emscripten') or (python_full_version >= '3.12' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/16/b5c76b838fd9bf6ce84d3a53346b8874ec05c5f0040d75ef2c320100cd2a/pandas-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:455f6f8139d4282188f526868dbc3c828470e88a3d9d59a891bd46a455f21b98", size = 10338495, upload-time = "2026-05-11T18:52:11.558Z" }, + { url = "https://files.pythonhosted.org/packages/5a/b0/a4ffc4ae74d2d822200dcc46898987d8eb6032d1e2b219cae39da6f5cbcc/pandas-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e15135e2ee5df1063313e2425ceef8ac0f4ae775893815b0923651b806a5639", size = 9938250, upload-time = "2026-05-11T18:52:17.005Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b2/3323601a52caee42c019e370090ca4544b241437240ca04f786cce82b0cf/pandas-3.0.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f1f1752b8533ea03f7f39a9c15b1a058d067bb48f4748948e7a8691e0510f2", size = 10770558, upload-time = "2026-05-11T18:52:19.865Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/bbecd2f867b97abebe0f9b53d750f862251b40337e061b36676ded3d920f/pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1e45c80cceb3b4a21bc5939d52e8cbd8d9b7305309219d59e9754d9ce09e27", size = 11274611, upload-time = "2026-05-11T18:52:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/7f/4f/eafabf2d5fae5adf143b4d18d3706c5efdc368a7c4eb1ee8a3eddabbd0f6/pandas-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:14da8316da4d0c5a77618425996bfb1248ca87fc2c1486e6fde4652bd18b5824", size = 11784670, upload-time = "2026-05-11T18:52:25.4Z" }, + { url = "https://files.pythonhosted.org/packages/49/44/1eb20389301b57b19cc099a1c2f662501f72f08a65f912d05822613c1532/pandas-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a55066a0505dae0ba2b50a46637db34b46f9094c65c5d4800794ef6335010938", size = 12353708, upload-time = "2026-05-11T18:52:28.139Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/c321f13b5ba1819fc8dca456c7fce578da2dcfecff1abbf0eaddf8406c0f/pandas-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6674ab18ad8c57802867264b00e15e7bb904700cdd9046e3b2fa1fce237439ea", size = 9907609, upload-time = "2026-05-11T18:52:30.982Z" }, + { url = "https://files.pythonhosted.org/packages/53/85/1b7f563ebc6357c27233a02a96b589bcce1fa9c6eb89fb4f0e56421d277e/pandas-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:5cc09a68b3120e0f54870dede8287a7bb1fa463907e4fcec1ea77cab6179bf7a", size = 9165596, upload-time = "2026-05-11T18:52:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" }, + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, + { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" }, + { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" }, + { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" }, + { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" }, + { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" }, +] + [[package]] name = "pathspec" version = "0.12.1" @@ -1973,7 +2746,15 @@ name = "pillow" version = "12.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -2088,7 +2869,15 @@ name = "platformdirs" version = "4.5.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -2106,6 +2895,181 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prometheus-client" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, +] + +[[package]] +name = "protobuf" +version = "7.35.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/01/9ef0afd7999eb9badb3a768b4aedd78c86d4c65cfaf1958ab276199e76b4/protobuf-7.35.1.tar.gz", hash = "sha256:ce115a26fe0c39a2c29973d914d327e516a6455464489fe3cd1e51a1b354f81a", size = 458717, upload-time = "2026-06-11T21:55:40.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/03/8aeeb7458d22546bf64b5250ca1daeb5ff757d900e8e4a7476c6f0db843e/protobuf-7.35.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:24f857477359a85c0c235261b8ba905fd51b2562f4a64ca1df5473f29850cbf6", size = 433226, upload-time = "2026-06-11T21:55:31.719Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/dfb89eb0e652a1ff073c39a59fb5e3a83cfe9b57a2c83fa6d78270101767/protobuf-7.35.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799", size = 328847, upload-time = "2026-06-11T21:55:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/0f/58/dc12f2cd484951524af6e3382c785869b9b3fb5e52ee95ae23add53ee8f9/protobuf-7.35.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:b73f9489a4b8b1c9cb1f8ed951c736392592edb24b9d6819f36d2e10b171d5b4", size = 344030, upload-time = "2026-06-11T21:55:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/e4/be/5b3cfe508bfab6761414ff944e3366eb13be4fd71efcd69450f89ba39f43/protobuf-7.35.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:74758715c53d7158fb76caf4f0cfdacc5329a4b1bb994f865d6cf302d413a1c4", size = 327130, upload-time = "2026-06-11T21:55:35.921Z" }, + { url = "https://files.pythonhosted.org/packages/d8/bc/6d6c7ba8709c85f8f2c390b2b118d6fb08a783676a572271851bf45a7d22/protobuf-7.35.1-cp310-abi3-win32.whl", hash = "sha256:353652e4efd0bca5b5fc2656abf8307ef351f0cf938c9eba09f0e09c20a25c30", size = 428945, upload-time = "2026-06-11T21:55:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/0a/19/8d0cb6f20a1ef7b18f1c8986ad5783f22f84cce39c6ce9a6e645ea55192e/protobuf-7.35.1-cp310-abi3-win_amd64.whl", hash = "sha256:230a75ddfc2de4806e56696ce9640c1cdfdb6543b7cfce98d42a4c0a0e7bdb87", size = 439996, upload-time = "2026-06-11T21:55:38.123Z" }, + { url = "https://files.pythonhosted.org/packages/19/c7/5f7c636ec43e0c545e28d1f1db71990108306f7bdcb89f069ba97e428e7f/protobuf-7.35.1-py3-none-any.whl", hash = "sha256:4bc97768d8fe4ad6743c8a19403e314511ed9f6d13205b687e52421c023ac1b9", size = 171659, upload-time = "2026-06-11T21:55:39.155Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "pyarrow" +version = "21.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload-time = "2025-07-18T00:57:31.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/d9/110de31880016e2afc52d8580b397dbe47615defbf09ca8cf55f56c62165/pyarrow-21.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e563271e2c5ff4d4a4cbeb2c83d5cf0d4938b891518e676025f7268c6fe5fe26", size = 31196837, upload-time = "2025-07-18T00:54:34.755Z" }, + { url = "https://files.pythonhosted.org/packages/df/5f/c1c1997613abf24fceb087e79432d24c19bc6f7259cab57c2c8e5e545fab/pyarrow-21.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fee33b0ca46f4c85443d6c450357101e47d53e6c3f008d658c27a2d020d44c79", size = 32659470, upload-time = "2025-07-18T00:54:38.329Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ed/b1589a777816ee33ba123ba1e4f8f02243a844fed0deec97bde9fb21a5cf/pyarrow-21.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7be45519b830f7c24b21d630a31d48bcebfd5d4d7f9d3bdb49da9cdf6d764edb", size = 41055619, upload-time = "2025-07-18T00:54:42.172Z" }, + { url = "https://files.pythonhosted.org/packages/44/28/b6672962639e85dc0ac36f71ab3a8f5f38e01b51343d7aa372a6b56fa3f3/pyarrow-21.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:26bfd95f6bff443ceae63c65dc7e048670b7e98bc892210acba7e4995d3d4b51", size = 42733488, upload-time = "2025-07-18T00:54:47.132Z" }, + { url = "https://files.pythonhosted.org/packages/f8/cc/de02c3614874b9089c94eac093f90ca5dfa6d5afe45de3ba847fd950fdf1/pyarrow-21.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd04ec08f7f8bd113c55868bd3fc442a9db67c27af098c5f814a3091e71cc61a", size = 43329159, upload-time = "2025-07-18T00:54:51.686Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3e/99473332ac40278f196e105ce30b79ab8affab12f6194802f2593d6b0be2/pyarrow-21.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9b0b14b49ac10654332a805aedfc0147fb3469cbf8ea951b3d040dab12372594", size = 45050567, upload-time = "2025-07-18T00:54:56.679Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f5/c372ef60593d713e8bfbb7e0c743501605f0ad00719146dc075faf11172b/pyarrow-21.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:9d9f8bcb4c3be7738add259738abdeddc363de1b80e3310e04067aa1ca596634", size = 26217959, upload-time = "2025-07-18T00:55:00.482Z" }, + { url = "https://files.pythonhosted.org/packages/94/dc/80564a3071a57c20b7c32575e4a0120e8a330ef487c319b122942d665960/pyarrow-21.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c077f48aab61738c237802836fc3844f85409a46015635198761b0d6a688f87b", size = 31243234, upload-time = "2025-07-18T00:55:03.812Z" }, + { url = "https://files.pythonhosted.org/packages/ea/cc/3b51cb2db26fe535d14f74cab4c79b191ed9a8cd4cbba45e2379b5ca2746/pyarrow-21.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:689f448066781856237eca8d1975b98cace19b8dd2ab6145bf49475478bcaa10", size = 32714370, upload-time = "2025-07-18T00:55:07.495Z" }, + { url = "https://files.pythonhosted.org/packages/24/11/a4431f36d5ad7d83b87146f515c063e4d07ef0b7240876ddb885e6b44f2e/pyarrow-21.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:479ee41399fcddc46159a551705b89c05f11e8b8cb8e968f7fec64f62d91985e", size = 41135424, upload-time = "2025-07-18T00:55:11.461Z" }, + { url = "https://files.pythonhosted.org/packages/74/dc/035d54638fc5d2971cbf1e987ccd45f1091c83bcf747281cf6cc25e72c88/pyarrow-21.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:40ebfcb54a4f11bcde86bc586cbd0272bac0d516cfa539c799c2453768477569", size = 42823810, upload-time = "2025-07-18T00:55:16.301Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3b/89fced102448a9e3e0d4dded1f37fa3ce4700f02cdb8665457fcc8015f5b/pyarrow-21.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8d58d8497814274d3d20214fbb24abcad2f7e351474357d552a8d53bce70c70e", size = 43391538, upload-time = "2025-07-18T00:55:23.82Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bb/ea7f1bd08978d39debd3b23611c293f64a642557e8141c80635d501e6d53/pyarrow-21.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:585e7224f21124dd57836b1530ac8f2df2afc43c861d7bf3d58a4870c42ae36c", size = 45120056, upload-time = "2025-07-18T00:55:28.231Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0b/77ea0600009842b30ceebc3337639a7380cd946061b620ac1a2f3cb541e2/pyarrow-21.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:555ca6935b2cbca2c0e932bedd853e9bc523098c39636de9ad4693b5b1df86d6", size = 26220568, upload-time = "2025-07-18T00:55:32.122Z" }, + { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305, upload-time = "2025-07-18T00:55:35.373Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264, upload-time = "2025-07-18T00:55:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099, upload-time = "2025-07-18T00:55:42.889Z" }, + { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529, upload-time = "2025-07-18T00:55:47.069Z" }, + { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883, upload-time = "2025-07-18T00:55:53.069Z" }, + { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802, upload-time = "2025-07-18T00:55:57.714Z" }, + { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175, upload-time = "2025-07-18T00:56:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload-time = "2025-07-18T00:56:04.42Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload-time = "2025-07-18T00:56:07.505Z" }, + { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload-time = "2025-07-18T00:56:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload-time = "2025-07-18T00:56:15.569Z" }, + { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload-time = "2025-07-18T00:56:19.531Z" }, + { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload-time = "2025-07-18T00:56:23.347Z" }, + { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload-time = "2025-07-18T00:56:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload-time = "2025-07-18T00:56:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload-time = "2025-07-18T00:56:33.935Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload-time = "2025-07-18T00:56:37.528Z" }, + { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload-time = "2025-07-18T00:56:41.483Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload-time = "2025-07-18T00:56:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload-time = "2025-07-18T00:56:52.568Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload-time = "2025-07-18T00:56:56.379Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cc/ce4939f4b316457a083dc5718b3982801e8c33f921b3c98e7a93b7c7491f/pyarrow-21.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a7f6524e3747e35f80744537c78e7302cd41deee8baa668d56d55f77d9c464b3", size = 31211248, upload-time = "2025-07-18T00:56:59.7Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c2/7a860931420d73985e2f340f06516b21740c15b28d24a0e99a900bb27d2b/pyarrow-21.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:203003786c9fd253ebcafa44b03c06983c9c8d06c3145e37f1b76a1f317aeae1", size = 32676896, upload-time = "2025-07-18T00:57:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/197f989b9a75e59b4ca0db6a13c56f19a0ad8a298c68da9cc28145e0bb97/pyarrow-21.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b4d97e297741796fead24867a8dabf86c87e4584ccc03167e4a811f50fdf74d", size = 41067862, upload-time = "2025-07-18T00:57:07.587Z" }, + { url = "https://files.pythonhosted.org/packages/fa/82/6ecfa89487b35aa21accb014b64e0a6b814cc860d5e3170287bf5135c7d8/pyarrow-21.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:898afce396b80fdda05e3086b4256f8677c671f7b1d27a6976fa011d3fd0a86e", size = 42747508, upload-time = "2025-07-18T00:57:13.917Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b7/ba252f399bbf3addc731e8643c05532cf32e74cebb5e32f8f7409bc243cf/pyarrow-21.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:067c66ca29aaedae08218569a114e413b26e742171f526e828e1064fcdec13f4", size = 43345293, upload-time = "2025-07-18T00:57:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0a/a20819795bd702b9486f536a8eeb70a6aa64046fce32071c19ec8230dbaa/pyarrow-21.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0c4e75d13eb76295a49e0ea056eb18dbd87d81450bfeb8afa19a7e5a75ae2ad7", size = 45060670, upload-time = "2025-07-18T00:57:24.477Z" }, + { url = "https://files.pythonhosted.org/packages/10/15/6b30e77872012bbfe8265d42a01d5b3c17ef0ac0f2fae531ad91b6a6c02e/pyarrow-21.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdc4c17afda4dab2a9c0b79148a43a7f4e1094916b3e18d8975bfd6d6d52241f", size = 26227521, upload-time = "2025-07-18T00:57:29.119Z" }, +] + +[[package]] +name = "pyarrow" +version = "24.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", hash = "sha256:85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83", size = 1180261, upload-time = "2026-04-21T10:51:25.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/bf/a34fee1d624152124fa8355c42f34195ad5fe5233ce5bb87946432047d52/pyarrow-24.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7c2b98645d576a0b9616892ead22b64a83a5f043c5e2ca15ebcefcb5b70c80cb", size = 35076681, upload-time = "2026-04-21T08:51:46.845Z" }, + { url = "https://files.pythonhosted.org/packages/1d/41/64180033d7027afce12dc96d0fe1f504c6fa112190582b458acea2399530/pyarrow-24.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:644a246325b8c69c595ad1dd4b463eba4b0cdb731370e4a86137d433208d6147", size = 36684260, upload-time = "2026-04-21T08:51:53.642Z" }, + { url = "https://files.pythonhosted.org/packages/57/02/9b9320e673dd8a99411fac78690f3df92f6dd6f59754c750110bca66d64e/pyarrow-24.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3a577bd840ca83f646f0a625dbc571dba7044c43c2d1503afc378b570954345c", size = 45698566, upload-time = "2026-04-21T10:46:02.133Z" }, + { url = "https://files.pythonhosted.org/packages/67/33/f75e91b9a64c3f33c787e263c93b871ad91b8a4a68c1d5cebddd9840e835/pyarrow-24.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:e3268e43984d0b1a185c89b4cfff282a7ead12fc93f56cfd7088bdbcbe727041", size = 48835562, upload-time = "2026-04-21T10:46:10.278Z" }, + { url = "https://files.pythonhosted.org/packages/a5/63/097510448e47e4091faa41c43ba92f97cecaab8f4535b56a3d149578f634/pyarrow-24.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2392d954fcb920f42d230284b677605e4e2fbb11f2821e823e642abd67fbb491", size = 49394997, upload-time = "2026-04-21T10:46:18.08Z" }, + { url = "https://files.pythonhosted.org/packages/60/6b/c047d6222ab279024a062742d1807e2fbaf27bba88a98637299ff47b9236/pyarrow-24.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bec9373df11544592b0ba7ec2af0e35059e5f0e7647c6183a854dedd193298f1", size = 51911424, upload-time = "2026-04-21T10:46:25.347Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ba/464cc70761c2a525d97ebd84e21c31ebd47f3ef4bdcee117009f51c46f24/pyarrow-24.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:c42ab9439498270139cc63e18847a02afe5c8b3ed9c931266533cfe378bd3591", size = 27251730, upload-time = "2026-04-21T10:46:30.913Z" }, + { url = "https://files.pythonhosted.org/packages/62/c9/a47ab7ece0d86cbe6678418a0fbd1ac4bb493b9184a3891dfa0e7f287ae0/pyarrow-24.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b0e131f880cda8d04e076cee175a46fc0e8bc8b65c99c6c09dff6669335fde74", size = 35068898, upload-time = "2026-04-21T10:46:36.599Z" }, + { url = "https://files.pythonhosted.org/packages/d1/bc/8db86617a9a58008acf8913d6fed68ea2a46acb6de928db28d724c891a68/pyarrow-24.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:1b2fe7f9a5566401a0ef2571f197eb92358925c1f0c8dba305d6e43ea0871bb3", size = 36679915, upload-time = "2026-04-21T10:46:42.602Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8e/fb178720400ef69db251eb4a9c3ccf4af269bc1feb5055529b8fc87170d1/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:0b3537c00fb8d384f15ac1e79b6eb6db04a16514c8c1d22e59a9b95c8ba42868", size = 45697931, upload-time = "2026-04-21T10:46:48.403Z" }, + { url = "https://files.pythonhosted.org/packages/f3/27/99c42abe8e21b44f4917f62631f3aa31404882a2c41d8a4cd5c110e13d52/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:14e31a3c9e35f1ab6356c6378f6f72830e6d2d5f1791df3774a7b097d18a6a1e", size = 48837449, upload-time = "2026-04-21T10:46:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/36/b6/333749e2666e9032891125bf9c691146e92901bece62030ac1430e2e7c88/pyarrow-24.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7d9a514e73bc42711e6a35aaccf3587c520024fe0a25d830a1a8a27c15f4f57", size = 49395949, upload-time = "2026-04-21T10:47:01.869Z" }, + { url = "https://files.pythonhosted.org/packages/17/25/c5201706a2dd374e8ba6ee3fd7a8c89fb7ffc16eed5217a91fd2bd7f7626/pyarrow-24.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b196eb3f931862af3fa84c2a253514d859c08e0d8fe020e07be12e75a5a9780c", size = 51912986, upload-time = "2026-04-21T10:47:09.872Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d2/4d1bbba65320b21a49678d6fbdc6ff7c649251359fdcfc03568c4136231d/pyarrow-24.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:35405aecb474e683fb36af650618fd5340ee5471fc65a21b36076a18bbc6c981", size = 27255371, upload-time = "2026-04-21T10:47:15.943Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a9/9686d9f07837f91f775e8932659192e02c74f9d8920524b480b85212cc68/pyarrow-24.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6233c9ed9ab9d1db47de57d9753256d9dcffbf42db341576099f0fd9f6bf4810", size = 34981559, upload-time = "2026-04-21T10:47:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/80/b6/0ddf0e9b6ead3474ab087ae598c76b031fc45532bf6a63f3a553440fb258/pyarrow-24.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:f7616236ec1bc2b15bfdec22a71ab38851c86f8f05ff64f379e1278cf20c634a", size = 36663654, upload-time = "2026-04-21T10:47:28.315Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3b/926382efe8ce27ba729071d3566ade6dfb86bdf112f366000196b2f5780a/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:1617043b99bd33e5318ae18eb2919af09c71322ef1ca46566cdafc6e6712fb66", size = 45679394, upload-time = "2026-04-21T10:47:34.821Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7a/829f7d9dfd37c207206081d6dad474d81dde29952401f07f2ba507814818/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6165461f55ef6314f026de6638d661188e3455d3ec49834556a0ebbdbace18bb", size = 48863122, upload-time = "2026-04-21T10:47:42.056Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e8/f88ce625fe8babaae64e8db2d417c7653adb3019b08aae85c5ed787dc816/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b13dedfe76a0ad2d1d859b0811b53827a4e9d93a0bcb05cf59333ab4980cc7e", size = 49376032, upload-time = "2026-04-21T10:47:48.967Z" }, + { url = "https://files.pythonhosted.org/packages/36/7a/82c363caa145fff88fb475da50d3bf52bb024f61917be5424c3392eaf878/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:25ea65d868eb04015cd18e6df2fbe98f07e5bda2abefabcb88fce39a947716f6", size = 51929490, upload-time = "2026-04-21T10:47:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/66/1c/e3e72c8014ad2743ca64a701652c733cc5cbcee15c0463a32a8c55518d9e/pyarrow-24.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:295f0a7f2e242dabd513737cf076007dc5b2d59237e3eca37b05c0c6446f3826", size = 27355660, upload-time = "2026-04-21T10:48:01.718Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a1abf004482026ddc17f4503db227787fa3cfe41ec5091ff20e4fea55e57/pyarrow-24.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:02b001b3ed4723caa44f6cd1af2d5c86aa2cf9971dacc2ffa55b21237713dfba", size = 34976759, upload-time = "2026-04-21T10:48:07.258Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4a/34f0a36d28a2dd32225301b79daad44e243dc1a2bb77d43b60749be255c4/pyarrow-24.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:04920d6a71aabd08a0417709efce97d45ea8e6fb733d9ca9ecffb13c67839f68", size = 36658471, upload-time = "2026-04-21T10:48:13.347Z" }, + { url = "https://files.pythonhosted.org/packages/1f/78/543b94712ae8bb1a6023bcc1acf1a740fbff8286747c289cd9468fced2a5/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a964266397740257f16f7bb2e4f08a0c81454004beab8ff59dd531b73610e9f2", size = 45675981, upload-time = "2026-04-21T10:48:20.201Z" }, + { url = "https://files.pythonhosted.org/packages/84/9f/8fb7c222b100d314137fa40ec050de56cd8c6d957d1cfff685ce72f15b17/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f066b179d68c413374294bc1735f68475457c933258df594443bb9d88ddc2a0", size = 48859172, upload-time = "2026-04-21T10:48:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d3/1ea72538e6c8b3b475ed78d1049a2c518e655761ea50fe1171fc855fcab7/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1183baeb14c5f587b1ec52831e665718ce632caab84b7cd6b85fd44f96114495", size = 49385733, upload-time = "2026-04-21T10:48:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/c3/be/c3d8b06a1ba35f2260f8e1f771abbee7d5e345c0937aab90675706b1690a/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:806f24b4085453c197a5078218d1ee08783ebbba271badd153d1ae22a3ee804f", size = 51934335, upload-time = "2026-04-21T10:48:42.099Z" }, + { url = "https://files.pythonhosted.org/packages/9c/62/89e07a1e7329d2cde3e3c6994ba0839a24977a2beda8be6005ea3d860b99/pyarrow-24.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:e4505fc6583f7b05ab854934896bcac8253b04ac1171a77dfb73efef92076d91", size = 27271748, upload-time = "2026-04-21T10:49:42.532Z" }, + { url = "https://files.pythonhosted.org/packages/17/1a/cff3a59f80b5b1658549d46611b67163f65e0664431c076ad728bf9d5af4/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:1a4e45017efbf115032e4475ee876d525e0e36c742214fbe405332480ecd6275", size = 35238554, upload-time = "2026-04-21T10:48:48.526Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/cce0f42a327bfef2c420fb6078a3eb834826e5d6697bf3009fe11d2ad051/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:7986f1fa71cee060ad00758bcc79d3a93bab8559bf978fab9e53472a2e25a17b", size = 36782301, upload-time = "2026-04-21T10:48:55.181Z" }, + { url = "https://files.pythonhosted.org/packages/2a/66/8e560d5ff6793ca29aca213c53eec0dd482dd46cb93b2819e5aab52e4252/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:d3e0b61e8efb24ed38898e5cdc5fffa9124be480008d401a1f8071500494ae42", size = 45721929, upload-time = "2026-04-21T10:49:03.676Z" }, + { url = "https://files.pythonhosted.org/packages/27/0c/a26e25505d030716e078d9f16eb74973cbf0b33b672884e9f9da1c83b871/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:55a3bc1e3df3b5567b7d27ef551b2283f0c68a5e86f1cd56abc569da4f31335b", size = 48825365, upload-time = "2026-04-21T10:49:11.714Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/771f9ecb0c65e73fe9dccdd1717901b9594f08c4515d000c7c62df573811/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:641f795b361874ac9da5294f8f443dfdbee355cf2bd9e3b8d97aaac2306b9b37", size = 49451819, upload-time = "2026-04-21T10:49:21.474Z" }, + { url = "https://files.pythonhosted.org/packages/48/da/61ae89a88732f5a785646f3ec6125dbb640fa98a540eb2b9889caa561403/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8adc8e6ce5fccf5dc707046ae4914fd537def529709cc0d285d37a7f9cd442ca", size = 51909252, upload-time = "2026-04-21T10:49:31.164Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1a/8dd5cafab7b66573fa91c03d06d213356ad4edd71813aa75e08ce2b3a844/pyarrow-24.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:9b18371ad2f44044b81a8d23bc2d8a9b6a6226dca775e8e16cfee640473d6c5d", size = 27388127, upload-time = "2026-04-21T10:49:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/ad/80/d022a34ff05d2cbedd8ccf841fc1f532ecfa9eb5ed1711b56d0e0ea71fc9/pyarrow-24.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:1cc9057f0319e26333b357e17f3c2c022f1a83739b48a88b25bfd5fa2dc18838", size = 35007997, upload-time = "2026-04-21T10:49:48.796Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ff/f01485fda6f4e5d441afb8dd5e7681e4db18826c1e271852f5d3957d6a80/pyarrow-24.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e6f1278ee4785b6db21229374a1c9e54ec7c549de5d1efc9630b6207de7e170b", size = 36678720, upload-time = "2026-04-21T10:49:55.858Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c2/2d2d5fea814237923f71b36495211f20b43a1576f9a4d6da7e751a64ec6f/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:adbbedc55506cbdabb830890444fb856bfb0060c46c6f8026c6c2f2cf86ae795", size = 45741852, upload-time = "2026-04-21T10:50:04.624Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3a/28ba9c1c1ebdbb5f1b94dfebb46f207e52e6a554b7fe4132540fde29a3a0/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:ae8a1145af31d903fa9bb166824d7abe9b4681a000b0159c9fb99c11bc11ad26", size = 48889852, upload-time = "2026-04-21T10:50:12.293Z" }, + { url = "https://files.pythonhosted.org/packages/df/51/4a389acfd31dca009f8fb82d7f510bb4130f2b3a8e18cf00194d0687d8ac/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d7027eba1df3b2069e2e8d80f644fa0918b68c46432af3d088ddd390d063ecde", size = 49445207, upload-time = "2026-04-21T10:50:20.677Z" }, + { url = "https://files.pythonhosted.org/packages/19/4b/0bab2b23d2ae901b1b9a03c0efd4b2d070256f8ce3fc43f6e58c167b2081/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e56a1ffe9bf7b727432b89104cc0849c21582949dd7bdcb34f17b2001a351a76", size = 51954117, upload-time = "2026-04-21T10:50:29.14Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/f4e9145da0417b3d2c12035a8492b35ff4a3dbc653e614fcfb51d9dedb38/pyarrow-24.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:38be1808cdd068605b787e6ca9119b27eb275a0234e50212c3492331680c3b1e", size = 28001155, upload-time = "2026-04-21T10:51:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/79/4f/46a49a63f43526da895b1a45bbb51d5baf8e4d77159f8528fc3e5490007f/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:418e48ce50a45a6a6c73c454677203a9c75c966cb1e92ca3370959185f197a05", size = 35250387, upload-time = "2026-04-21T10:50:35.552Z" }, + { url = "https://files.pythonhosted.org/packages/a0/da/d5e0cd5ef00796922404806d5f00325cdadc3441ce2c13fe7115f2df9a64/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:2f16197705a230a78270cdd4ea8a1d57e86b2fdcbc34a1f6aebc72e65c986f9a", size = 36797102, upload-time = "2026-04-21T10:50:42.417Z" }, + { url = "https://files.pythonhosted.org/packages/34/c7/5904145b0a593a05236c882933d439b5720f0a145381179063722fbfc123/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:fb24ac194bfc5e86839d7dcd52092ee31e5fe6733fe11f5e3b06ef0812b20072", size = 45745118, upload-time = "2026-04-21T10:50:49.324Z" }, + { url = "https://files.pythonhosted.org/packages/13/d3/cca42fe166d1c6e4d5b80e530b7949104d10e17508a90ae202dac205ce2a/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9700ebd9a51f5895ce75ff4ac4b3c47a7d4b42bc618be8e713e5d56bacf5f931", size = 48844765, upload-time = "2026-04-21T10:50:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/942c3b79878ba928324d1e17c274ed84581db8c0a749b24bcf4cbdf15bd3/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d8ddd2768da81d3ee08cfea9b597f4abb4e8e1dc8ae7e204b608d23a0d3ab699", size = 49471890, upload-time = "2026-04-21T10:51:02.439Z" }, + { url = "https://files.pythonhosted.org/packages/76/97/ff71431000a75d84135a1ace5ca4ba11726a231a8007bbb320a4c54075d5/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:61a3d7eaa97a14768b542f3d284dc6400dd2470d9f080708b13cd46b6ae18136", size = 51932250, upload-time = "2026-04-21T10:51:10.576Z" }, + { url = "https://files.pythonhosted.org/packages/51/be/6f79d55816d5c22557cf27533543d5d70dfe692adfbee4b99f2760674f38/pyarrow-24.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c91d00057f23b8d353039520dc3a6c09d8608164c692e9f59a175a42b2ae0c19", size = 28131282, upload-time = "2026-04-21T10:51:16.815Z" }, +] + [[package]] name = "pycodestyle" version = "2.14.0" @@ -2168,7 +3132,15 @@ name = "pytest" version = "9.0.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] @@ -2232,6 +3204,79 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, + { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, +] + [[package]] name = "requests" version = "2.32.5" @@ -2247,6 +3292,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py", marker = "python_full_version >= '3.12'" }, + { name = "pygments", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + [[package]] name = "scikit-learn" version = "1.6.1" @@ -2298,14 +3356,23 @@ name = "scikit-learn" version = "1.7.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] dependencies = [ { name = "joblib", marker = "python_full_version >= '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "threadpoolctl", marker = "python_full_version >= '3.10'" }, @@ -2446,11 +3513,20 @@ name = "scipy" version = "1.16.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", ] dependencies = [ - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } wheels = [ @@ -2516,6 +3592,101 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, ] +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "simplejson" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/2a/54837395a3487c725669428d513293612a48d82b95a0642c936932e5d898/simplejson-4.1.1.tar.gz", hash = "sha256:c08eb9f7a90f77ae470e19a07472e9a79ebc0d1c2315d86a72767665bd5ba79f", size = 118860, upload-time = "2026-04-24T19:24:59.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/da/3ba5e87e917094961e7b51b541c88f735f1ca37d580ac78a9302b468f64e/simplejson-4.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f61eefab86235c800e7f4e37d977080ec424bb2bf0b74e95a2d17ecb48eac0a", size = 111675, upload-time = "2026-04-24T19:22:30.344Z" }, + { url = "https://files.pythonhosted.org/packages/fe/8a/d0c08f4b8934b64469a63d461a68a01d5cc32faf313400dda2bdc1075a29/simplejson-4.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4484960512db9c8124bfa91e0d8a9f9c302338f1c5454e74c21d7d022df10f46", size = 90544, upload-time = "2026-04-24T19:22:32.095Z" }, + { url = "https://files.pythonhosted.org/packages/c2/2d/7832ed91cf4900f86c783d589bfac53358abfccb278f1c8b55eec167b395/simplejson-4.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b75c7ef874dbb350f41827cdf3cee23f5257bdcb0df46d4c01b34badb62dcfe8", size = 90895, upload-time = "2026-04-24T19:22:34.412Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d6/a2a7a482fa43aaeaefc001491d381960f5e685ee4645343e0e037cebb57c/simplejson-4.1.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c7494c75b95171194f965ea609e97081837a26494d91dcc046ad27dd9c3503e2", size = 168660, upload-time = "2026-04-24T19:22:35.717Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/7a6482f336338dbdb6ca6d3099b2fdc1c74c47eea3c6511975751e9198df/simplejson-4.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1778e09a6e4bb4ef304627915dc4a838569d9e6b737c787925b4e98244bbbc16", size = 167264, upload-time = "2026-04-24T19:22:37.415Z" }, + { url = "https://files.pythonhosted.org/packages/c9/43/039982e956b06c6b019d48bdf9d4ec06f298adf6136552ad1979b94be0fd/simplejson-4.1.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:67e43e7c0555e10de6d83e1408035652fad28c983516e38c4e3a9a748c9af129", size = 176909, upload-time = "2026-04-24T19:22:38.872Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f5/e3ad592d089922abce2c2ea377548953ac55ffcbe061d600f01b9db2e6b6/simplejson-4.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93bf6653420258372444de90194dab8de8ff13d74b5d4263a5fefbbe8b8d2060", size = 165930, upload-time = "2026-04-24T19:22:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/f830b648ae04601e6813306535d8e0a4c178d6453cec539b85dafdac80ed/simplejson-4.1.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0662cfe0482c9796bd097213b27f006815bfdc9b671264c3c0b7fc0e72b71d00", size = 174710, upload-time = "2026-04-24T19:22:42.437Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3e/82c8997c4ef2ef6c832fbfc3bb2ed14a212616a284100af03b552ea7e072/simplejson-4.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a9ab55d2459f6d0fdf9984a7a0fb0280dae12979f4fcc3171f5096a4fcf5fafe", size = 167685, upload-time = "2026-04-24T19:22:44.023Z" }, + { url = "https://files.pythonhosted.org/packages/4d/03/80e67a6c63fe812094c681917a5c5d403e34904d200570416863fe2e8328/simplejson-4.1.1-cp310-cp310-win32.whl", hash = "sha256:dfb84ace97acbdf1916c5a675387493fc5a7f67c2e15d4a7687143f8c73024d4", size = 88317, upload-time = "2026-04-24T19:22:45.547Z" }, + { url = "https://files.pythonhosted.org/packages/f4/05/d4fa2c024d566bddff732a2aa437faa4cbee15ee277e2a855faf91a9d906/simplejson-4.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:8eb821ef27f688f59ed4a93b17a666a7ebacf8dd65fecaa2b3c531a3aea62eaf", size = 90461, upload-time = "2026-04-24T19:22:47.447Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/39013ffe279d90093ec1c848565b3683c586906c10fa55d9000ec29d046b/simplejson-4.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2867c64d92abd1992c15666fae198203093f593e43d6b81adf176bae530d493a", size = 111538, upload-time = "2026-04-24T19:22:49.051Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ae/2c272971c8a87e2539c54a98eb6ff037bee1e2e93943c3986cf7500a4f3a/simplejson-4.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c47c46e16c8ea9e4850061e6ed5aa2b9cd2074cb2274bfd9c138cba15ce7453", size = 90594, upload-time = "2026-04-24T19:22:50.408Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a2/6eebfb99dedc139f549200f61ade6d1890ac5707c5d427bdfa6fe39c9313/simplejson-4.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e294e33dbf316a9bbdd4030d46503c9b0f19470ae7ad6af5bae6c426bc2e869f", size = 90718, upload-time = "2026-04-24T19:22:51.694Z" }, + { url = "https://files.pythonhosted.org/packages/80/7e/c9e6c0c4ad8415e64dad0c47f619b556b02680a41631b4dbc281d55dc54d/simplejson-4.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7ce252b28fddbdd83db5bd7d93dad2a8a591d7ada098afec9c1b23d6b722a7a4", size = 180901, upload-time = "2026-04-24T19:22:53.025Z" }, + { url = "https://files.pythonhosted.org/packages/34/09/69e331e3994b1ed9be6ce9ace4ade704e7ed503edf869929ca7bb404eda8/simplejson-4.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c44ef6b02a4eb67ed17a72342341792149b3ff46f15426c26e970e49addf327", size = 178133, upload-time = "2026-04-24T19:22:54.574Z" }, + { url = "https://files.pythonhosted.org/packages/5d/40/ed806f24afef295c1032448f5ff6f6f2979392d5645ddb9f4fed7f38194d/simplejson-4.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82bfca2b85a34178c25829c703f0a9e9f113a5af7539285bd3efb583a0bf1ba3", size = 188155, upload-time = "2026-04-24T19:22:56.044Z" }, + { url = "https://files.pythonhosted.org/packages/38/94/8d6f515b827b0f7881a49c8c1ac6920b7ae9428939ef04238c973278b42a/simplejson-4.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e4b23f71dd781f8830f1663dc01a4944d3dbf87a1f93d78fba1cf64722d0ccf", size = 176225, upload-time = "2026-04-24T19:22:57.981Z" }, + { url = "https://files.pythonhosted.org/packages/c9/fd/6dffb4956563d48bbe46b91ff341adae34920e94008fd6b8d728072abfc7/simplejson-4.1.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:82fee635d7b73ad801030b05a75fbd34a098da0c2ecf600667a03636d09e1e42", size = 185535, upload-time = "2026-04-24T19:22:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/de/d2/a509ee37763e79aec75d68f8521db1440306edeba3b8b4064ab4ee8bf1d9/simplejson-4.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:68e62eda21192c5ea9bb92d571ca46a4477fef48762f50d433de2b4253051551", size = 179302, upload-time = "2026-04-24T19:23:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/d8/23/5b343bfd2a79d3b6818e4db3586c405a001a090d4c89d336e31273ce7177/simplejson-4.1.1-cp311-cp311-win32.whl", hash = "sha256:ffd3d82294b47f5ec64050021ace95fd62628a0c1cc8bbf4d06d2d1fb697e055", size = 88408, upload-time = "2026-04-24T19:23:02.808Z" }, + { url = "https://files.pythonhosted.org/packages/38/04/df9b37aedbd524dca20840d25ebe01d6ae486b89792aeff5d15b9c4114f7/simplejson-4.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:78a3fe0995be42bed62a26aa78e0e0b4d87c6545785346b9cc898f3389569a35", size = 90526, upload-time = "2026-04-24T19:23:04.408Z" }, + { url = "https://files.pythonhosted.org/packages/60/25/e90998fe8e480eb43b966c09e835379887d427567ebd496563d3b1e16b19/simplejson-4.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:19040a17154dc03d289bab68d73ce0a6a0be01de30c584bbdd93490bead14b22", size = 112414, upload-time = "2026-04-24T19:23:06.084Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a0/abd4785f36c3400f1fbb21f517be39295a750a714f04b7ee175adf6ef580/simplejson-4.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a94ebaecdbaa80d9551a3ec6bf0c9302fc8b53ab6c1b2bfd498a1df4cb28158d", size = 91120, upload-time = "2026-04-24T19:23:07.877Z" }, + { url = "https://files.pythonhosted.org/packages/b8/78/fc060d2e3b13c6ec59288574b8efac64075e316b2afba4396a56b2422f78/simplejson-4.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:67341c95c0a168ab4a6d1e807e50463f1c8da932c3286d81e201266c427061fa", size = 91055, upload-time = "2026-04-24T19:23:09.264Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b6/156a8de1e1b47694f0e7de6675866936608d45dc68388fd017d36f8693be/simplejson-4.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:45ec18e337fec538b7e902d489505c450b2454653d1290f3f50385e6fd8aa607", size = 190297, upload-time = "2026-04-24T19:23:11.226Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/e4d0eab695be3eb21d0f46bce820752031f03e7113f9c80a9b3c73ee7157/simplejson-4.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:820c69a4710400e9b248d5670647d60be58824369282d3925e516b3ff1a7cd82", size = 187002, upload-time = "2026-04-24T19:23:12.982Z" }, + { url = "https://files.pythonhosted.org/packages/76/0e/7f5a59d29426b062d5928fb88b403c3f797129d53be7102f955dbe51aa44/simplejson-4.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e708d373a10e4378ef2d59f8361850c7150fd907ed49efe49bc5492160476d1", size = 195146, upload-time = "2026-04-24T19:23:14.517Z" }, + { url = "https://files.pythonhosted.org/packages/78/18/9943db224dd4d5fa3c090c3e56a94c37b254338c83995ec5680285111c40/simplejson-4.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:980fc33353f81fd12d8c49d44f8c2760d1dc8192285e627c5180d141035b228a", size = 183931, upload-time = "2026-04-24T19:23:16.742Z" }, + { url = "https://files.pythonhosted.org/packages/c2/08/9a690da9a766161c06c627d805362cf159f1abe480969372b2897649b955/simplejson-4.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:de2ed102fff88dacf543699f53ee3a533cc11539a39baa176b7e09dd783069d6", size = 192228, upload-time = "2026-04-24T19:23:18.33Z" }, + { url = "https://files.pythonhosted.org/packages/05/88/bd8aad36b451ffb0e0a3f721d695a88befa6d1ac7d1e02ae788ca7ff4029/simplejson-4.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2785ff8edc0e28bf773a32543a6bbed46351453c997b3f6709c744e3c2f7eabb", size = 187808, upload-time = "2026-04-24T19:23:21.165Z" }, + { url = "https://files.pythonhosted.org/packages/04/ee/14f91db0d1f481533b651dafbf8cd0da088d9817f7af30c68f7f19f9c847/simplejson-4.1.1-cp312-cp312-win32.whl", hash = "sha256:2e0d5ead6d14610467ec356ec1f6b5d8a56aa216abaad8d41c8b873b16cf313f", size = 88512, upload-time = "2026-04-24T19:23:22.764Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c4/90de06b2d8737c68c05ff9274113f854dbf6a5f28b7a955212111672cb57/simplejson-4.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:63a5451f557d6be48a231bae932458655c620902b868170b2f1c8afed496f6b4", size = 90748, upload-time = "2026-04-24T19:23:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/37/a9/47b445eeb559c9593453a0648e0fd6d08e8adff64dd5e5ced66726da8a09/simplejson-4.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dff52fc7af272e84fc21cc5a06c927c823ca6ae00af14f3b0d7707b42775ed98", size = 113160, upload-time = "2026-04-24T19:23:26.033Z" }, + { url = "https://files.pythonhosted.org/packages/4c/65/cb72db31523c164dea5dc55b02dad065a40c478856bc7534b279d2b51906/simplejson-4.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:971aed0647ad6e840a3943bec812fcda5f2d26a5497a4981d1fb49aa4f9a396c", size = 91521, upload-time = "2026-04-24T19:23:27.572Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e5/54cb7c50ad5fdc1e0a86b7df4b135c2cbd5c4623605aa94466659098e8da/simplejson-4.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:249e2e220aa6d9b9d936bde84eb7bf79d5b6c5a8273c6e411f8b1635a9073f2d", size = 91407, upload-time = "2026-04-24T19:23:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/21a3ede87f0bf82d6c7bcb90480d50a6490eb974c6ab20881188e440957c/simplejson-4.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e5cdd6a5d52299f345c15ab5678cc4249e24f383f361d986afbc3c7072a6b6b", size = 192451, upload-time = "2026-04-24T19:23:30.56Z" }, + { url = "https://files.pythonhosted.org/packages/59/df/9903edd3102bf0b5984edfcb90c88612330996efa3b4fbf8a971d6e17839/simplejson-4.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:642cec364e0676e2d5a73fa4d31d0c7c55886997caa2fde24e8292ca44d32728", size = 189015, upload-time = "2026-04-24T19:23:32.647Z" }, + { url = "https://files.pythonhosted.org/packages/98/cd/33230927a780e1398b857e3944abb914556994d252b1d765ae40d112cb25/simplejson-4.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:76fe296ca1df23d290033f10aaacf534fd1b3e3007e7f9ff8aa68b21413aaa78", size = 196658, upload-time = "2026-04-24T19:23:34.563Z" }, + { url = "https://files.pythonhosted.org/packages/cd/84/2c5a7444eb53e9a86d3738299bffddd9f53aeed799ded2f45368221fdb19/simplejson-4.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f0ad25b7dc4e0fb23858355819f2e994f1a5badcdcde8737eac7921c2f1ed2a", size = 185967, upload-time = "2026-04-24T19:23:36.191Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/454378e06d059cd412a7ed5d87fb6d29fd5b60f13a4d89fc1f764ff434df/simplejson-4.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a59ebd0533f03fd06ff0c42ba0f02d93cbcdd7944922bf3b93911327a95b901f", size = 193940, upload-time = "2026-04-24T19:23:38.151Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d5/a15bf915f623a2c5a079d6e3be8256fdb8ef06f110669493a09b9d6933e0/simplejson-4.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bccbf4419676b517939852e5aeff2af6aee4dc046881c67a1581fa6f1cb01abd", size = 189795, upload-time = "2026-04-24T19:23:40.139Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c9/37212ae7dc4b607f0978c408e8633f05c810884e054c33113184c6c2c8a2/simplejson-4.1.1-cp313-cp313-win32.whl", hash = "sha256:6c845363eb5fd166fb7c72243da38f4fcfde666ede7fdf2cc6fd7762894626f7", size = 88773, upload-time = "2026-04-24T19:23:41.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a5/c7a0a47883a9015b54c9d8a4b62f2aba17bd4335b1787b9b8a0fc2fa6d52/simplejson-4.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:104d8324c34f25b4b90800bc5fa363780cbc3d8496aef061cba7ce1af9162270", size = 90888, upload-time = "2026-04-24T19:23:43.11Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/4a118a6a92eb33bb08c8e2fe7ec85cb96f0673491bb2b829930831ee4fbe/simplejson-4.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ed7473602b6625de793b6acba49aa949f144a475f538792067e4cf2fda2071f5", size = 110492, upload-time = "2026-04-24T19:23:44.957Z" }, + { url = "https://files.pythonhosted.org/packages/07/f4/84d160e9fa8cada1e0a9381cae4fa81eecd573577a5b34366d8ced59bdf7/simplejson-4.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:225c9caa324c5b554d009fb9cac22aee7711e71bd96f487938c659af467e828e", size = 90152, upload-time = "2026-04-24T19:23:46.355Z" }, + { url = "https://files.pythonhosted.org/packages/68/31/9a5432c433a7671107182cdc9a20ea78a70f99c4e5334aa54b6d4d0d79ed/simplejson-4.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:95407269340c7f22f09776ea7b717a52cf56cfcf119b5e45f66faa4a26445bea", size = 90115, upload-time = "2026-04-24T19:23:47.743Z" }, + { url = "https://files.pythonhosted.org/packages/78/91/3635cdb13318cb0a328abaa69e2b91251caad39d6779aa308098f341f6cb/simplejson-4.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3851658d642c1184d2023f0e6c9ce44a21eb1629e74e7c84ef956b128841fe12", size = 184036, upload-time = "2026-04-24T19:23:49.472Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/149b6ec5393f6849d98c59cadba888b710a8ef4b805ab91e11a566960d40/simplejson-4.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95a3bb0f78e85f4937f99092239f2011ce06f0f2d803df5c299cc05abbeae008", size = 180543, upload-time = "2026-04-24T19:23:51.023Z" }, + { url = "https://files.pythonhosted.org/packages/df/7c/a5d968d0b527a748b667e62bea94309ccbcb1e2b108e8f0cf8547efaa12b/simplejson-4.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bbfdaa7c0603f75b7b14b211b7f2be44696d4e26833ad2d91d5c87bf5fb9a920", size = 188725, upload-time = "2026-04-24T19:23:52.995Z" }, + { url = "https://files.pythonhosted.org/packages/db/e3/6a8d11181d587ef00e2db9112357e6832111e56dd56b01b5c11758a1965d/simplejson-4.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e3c584071dced8c21b4689f0254303521daeb9b5bc1f4289755d71fa3cb0d3", size = 177492, upload-time = "2026-04-24T19:23:54.581Z" }, + { url = "https://files.pythonhosted.org/packages/67/e3/8b0eb8b06e8198cfbd1270487da163d0093df05cc4f557350cd65e2f7e79/simplejson-4.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:036a27bd0469b9d79557cbddb392969f876cd7f278cfbd0fba81534927a06575", size = 185281, upload-time = "2026-04-24T19:23:56.13Z" }, + { url = "https://files.pythonhosted.org/packages/dc/5f/64990f07ec9e2cb1a814c674e2e21b5693207f74ac70eb72151b847ea4e6/simplejson-4.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b70bfd2f67f3351baba08aa3ae9233c83f21fd95ae5e6b3d0ecb8c647929112f", size = 181848, upload-time = "2026-04-24T19:23:57.92Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/bbc1bc0447f339f79f99ab8c37f7f037cb2f1f93af75d6a4d553096bb0c3/simplejson-4.1.1-cp314-cp314-win32.whl", hash = "sha256:37233c72ce88d06acb92747347742b3c07871eba6789f060c179c9302dde8efe", size = 88761, upload-time = "2026-04-24T19:23:59.397Z" }, + { url = "https://files.pythonhosted.org/packages/18/72/ec1b5cbdcb140c132e6c7bdf99bd73e4f675439e77126c88f472fcffa09c/simplejson-4.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:cc0442dea71cd9cbf30a0b8b9929ab5aa6c02c0443a3d977351e6ec5bada4388", size = 91018, upload-time = "2026-04-24T19:24:00.85Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/4fa437f68ff72219bac3bf3d050de9c6265691f3a170e16954bd69d7cddd/simplejson-4.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:c996a4d38290c515af347740659ce095b425449c164a5c9fa3977caa6eff5dbe", size = 113919, upload-time = "2026-04-24T19:24:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/c2/83/59de041d09eb4a9577f7015d7263c32095dfb7fde49717dff62145d89809/simplejson-4.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c65c763fb20d7ca113c1c14dce2fc04a0fc3a57aceff533d6fdac707c7bffb40", size = 91904, upload-time = "2026-04-24T19:24:03.812Z" }, + { url = "https://files.pythonhosted.org/packages/03/8e/46bb345d540f6eb31427d984a4e518cdb182d0621814fee4fee045e8815b/simplejson-4.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0da5c9f57206ee7ef280ff7f1d924937b0a64f9a271a5ef371a2ecdbebba7421", size = 91752, upload-time = "2026-04-24T19:24:05.622Z" }, + { url = "https://files.pythonhosted.org/packages/83/e2/1b2ce97f068835eb3d253c116a4df7a3f436b7bf2fb5ff1ba29287e8b0ec/simplejson-4.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ea3426e786425d10e9e82f8a6eda74a7d6eb10d99165ac3d0d3bbcb65c0ea343", size = 214021, upload-time = "2026-04-24T19:24:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/48/70/d93e556df6a0786298644a7c08304fcbeddc248325f23f38acbebeb21165/simplejson-4.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d75cea7a1025edd7e439b2966b3d977c45b5b899e2adaf422811b3ac702ed9fb", size = 213530, upload-time = "2026-04-24T19:24:09.289Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/c93bf305b9f00d7259e09e713d60e75bd0f7f53da970f716ab90491770e7/simplejson-4.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63c2ada8e58f266491f19eed2eeeb7c25c6141e52f8f9e820f6bb94156cf8dbc", size = 218282, upload-time = "2026-04-24T19:24:10.991Z" }, + { url = "https://files.pythonhosted.org/packages/0c/20/a9b5d2e27ec44b069ee251bd55544fc76929a067107b1050001566ba86f3/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d1fffb56305c5b475ee746cf9e04f97423ba5aaacd292dc1255bd75b1d3b124b", size = 209249, upload-time = "2026-04-24T19:24:12.662Z" }, + { url = "https://files.pythonhosted.org/packages/97/e4/e06ee682ed5df67592181f5ecb062e35878967e27f5b6e087237d4548d95/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a6525ec733f43d0541206cffa64fd2aad5a7ae3eb76566aff49cd4db6382209a", size = 213963, upload-time = "2026-04-24T19:24:14.302Z" }, + { url = "https://files.pythonhosted.org/packages/9c/9f/1e160e4cd8cdbf062bf6a454cdf814dc7a48eb47e566fdb8f80ccb202605/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:861e393260508efa64d8805a8e49c416c3484907e3f146ce966c69552b49b9a3", size = 210474, upload-time = "2026-04-24T19:24:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e6/cecd913df322df5bbe7ebb8ba39e0708e505a165553900da8a7761026d6f/simplejson-4.1.1-cp314-cp314t-win32.whl", hash = "sha256:d083b89d30948a751d3d97476c2ed91e4caaa24a1a1459bdbadb8876242c71fe", size = 91134, upload-time = "2026-04-24T19:24:17.635Z" }, + { url = "https://files.pythonhosted.org/packages/97/73/f540dde99cc1d393bd062ab3b5735b777561a5d8f8a5f2e241164444d77a/simplejson-4.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4cbb299d0528ec0447fe366d8c9641860e28f997a62730690fef905f1f41046e", size = 94467, upload-time = "2026-04-24T19:24:19.109Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b3/f390ceeeb908218febecbea41cb30460ae232177e0d0bb48d716fce08253/simplejson-4.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97a02325a00617c26cfc974f4ebb191c8de6e87cb96d33e51612091150637c3d", size = 111812, upload-time = "2026-04-24T19:24:39.447Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2f/1c4692fbe060950be98f90c8076ca4aad4249384f8eb1427e4546c34d900/simplejson-4.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bbc61cd7982ff77a68df06d103a3ba459eefd1d3cb6f4f4944cdf9f091d7bf7", size = 90587, upload-time = "2026-04-24T19:24:40.99Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e9/aec2b95963ba22e1c609c2743c22569ed0f0c48c607ab390a98b936fed0a/simplejson-4.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c7876ec2ef53ff5e6714a382b3f8f042a744b944728ae0baef99421740cc57a3", size = 90983, upload-time = "2026-04-24T19:24:42.587Z" }, + { url = "https://files.pythonhosted.org/packages/c0/06/019b4ed14e26b5c38e99b8af184bc350d0a3d294efc8adcffe1b34f52022/simplejson-4.1.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:42ee1aeaa295364bb2c079c42c5796bf1db4b0d5c4bf95f2fcdddba770618cb4", size = 168458, upload-time = "2026-04-24T19:24:44.49Z" }, + { url = "https://files.pythonhosted.org/packages/82/27/a0a6c931b8ae7e0caacbc895cb6fe625f5d05701be0de21ffef242a7e780/simplejson-4.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f42a7911f64ed8f738ba55480c20d5c685851781d411f9473cafa7a643e52fe4", size = 167260, upload-time = "2026-04-24T19:24:46.457Z" }, + { url = "https://files.pythonhosted.org/packages/b9/0c/14fd0287d71dfcc3c5717594da36411b73392ab66ad1959ea8fc7f658a36/simplejson-4.1.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b2da172a6ff43f74463522a1aa1d7a481ac2dba2de4b18ed51e989190352ba7", size = 176760, upload-time = "2026-04-24T19:24:48.069Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c1/d396318914d2becbcef272e95fca6eba58c598d587fb3136d1a5bf63851e/simplejson-4.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:677fbb192b2cbefb3dc21862eaf0bf560b4b370662503036c513f1e3eb32dfac", size = 165880, upload-time = "2026-04-24T19:24:49.755Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e6/1ab403ab9f6b02a7a8c56b203826892316ce81f6735d4f0bd493960cef33/simplejson-4.1.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10048ab9b9e0f7e95f1680829f0925a63b190fa8e8e9bb91369538fe382df827", size = 174597, upload-time = "2026-04-24T19:24:51.443Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2d/b40e61a7e71b866bd8b2570aa0493fd9ad3729508f62d93b182b88161c16/simplejson-4.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:82e42ff58ee856f4029c732d35673dbe62d589445a8e6c3c98ced8fd78096617", size = 167425, upload-time = "2026-04-24T19:24:52.957Z" }, + { url = "https://files.pythonhosted.org/packages/ea/36/18800a4689db287571ba40a767f867a226b337642812b1a3ec015382e696/simplejson-4.1.1-cp39-cp39-win32.whl", hash = "sha256:43fa9a1ccf477e415c025ba507ada54984f5ed927d28d304cf50e089818818b0", size = 88365, upload-time = "2026-04-24T19:24:54.584Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ae/a596dcd327b53da7ac336f3fbf54049033d492c79d7cce5027f7b2bea8da/simplejson-4.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4c1eecc2d6a186eaf5d111cf9b311fa9a9ecf68703db7b63ed5938049f3e74f5", size = 90478, upload-time = "2026-04-24T19:24:56.42Z" }, + { url = "https://files.pythonhosted.org/packages/ce/6a/8b74c52ffd33dbbde00fe7251fee6a0acdc8cea33f7a43805aed258fb79b/simplejson-4.1.1-py3-none-any.whl", hash = "sha256:2ce92b3748f02423e26d2bfb636fb9d7a8f67c8f5854dcae69d350d123b2eee2", size = 69195, upload-time = "2026-04-24T19:24:57.962Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -2525,6 +3696,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] +[[package]] +name = "tensorstore" +version = "0.1.84" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes", marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/18/c8e8b4faffab1a434b6c013d54cf7f5b754a6849429d9dbb718297705796/tensorstore-0.1.84.tar.gz", hash = "sha256:3cb091dfde68600e6d8f03a389ccc92ffa7c0798a0c600d1013c0138d7163e6b", size = 7208048, upload-time = "2026-05-16T06:17:58.448Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/2f/7630705a1db3a349f162552c7a34f4e74c06bf9800d73c233eb939305f6e/tensorstore-0.1.84-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6103311700359e9f552e8560d16eecf1548b87e2f8a6a766b9f6a65c8722f879", size = 16556656, upload-time = "2026-05-16T06:17:01.065Z" }, + { url = "https://files.pythonhosted.org/packages/09/2b/fbba516c549fc868d9b9c74e3e593157825b08db0103dcfcde1ae994d1f4/tensorstore-0.1.84-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:340fe971f1808d7060f2273b8eee352780bcb65e5035f78163fa9b8930aa795a", size = 14900174, upload-time = "2026-05-16T06:17:03.647Z" }, + { url = "https://files.pythonhosted.org/packages/55/6d/fe5013aa1b8e8e6a73213285f29a059bfcbefcfebafc937694823bdc5a00/tensorstore-0.1.84-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34352f8ba6e5efba5feb18917d68da1a92bbff80e64c3fd06d3d1af4b343821a", size = 19341729, upload-time = "2026-05-16T06:17:06.242Z" }, + { url = "https://files.pythonhosted.org/packages/11/c5/65e7dfc4108451f5317aca47a7c339954d0b7601ed4db4481a2f80ee2da1/tensorstore-0.1.84-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ae74451ab5cc8a0cd9e51926adf04f4dfdbd8ad5ac31ac71f1caa7bdfb2828d", size = 20952887, upload-time = "2026-05-16T06:17:08.653Z" }, + { url = "https://files.pythonhosted.org/packages/ca/dc/11a487107c5b73684aeaa4667693d5e73b96bc3ad7211db4a03f6049bf65/tensorstore-0.1.84-cp311-cp311-win_amd64.whl", hash = "sha256:4c9b084b0b44c36eaa9b9c51c3347474cd3c94fda12344fb507e6629357615bf", size = 13391569, upload-time = "2026-05-16T06:17:11.307Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/1b5231e965257c3ee7d4615cb49a0fac53a71a1c34b293bcf524bb7c6d13/tensorstore-0.1.84-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:915371fc2c27540e8b69c573b7a06217fb8d161ec231cedfa9f3d264615a326d", size = 16571584, upload-time = "2026-05-16T06:17:13.283Z" }, + { url = "https://files.pythonhosted.org/packages/88/5d/52e52aa00a5ae3ebe1116ca52ac9f47ef98e94f6c4e411649cd3d1bb79cc/tensorstore-0.1.84-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4477eabe26e2f5131f1b1a3444cd9167fe69fabc29579eab8259d218399b9e6b", size = 14905169, upload-time = "2026-05-16T06:17:15.638Z" }, + { url = "https://files.pythonhosted.org/packages/61/36/f88b4bf267902f12cd2ca33aff10fabd6839dd1ce7d51876ebefa98aaf2c/tensorstore-0.1.84-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ace00cf2e45dc5d64fe3a10c2cbef61343915683808a10a3e081233566a7231", size = 19345134, upload-time = "2026-05-16T06:17:17.984Z" }, + { url = "https://files.pythonhosted.org/packages/18/7c/b7b24e10e5cb0213c85204d53fcd60d0568d986ea0001a00a815e14e01e1/tensorstore-0.1.84-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64c8039558d5607b73903948fce058725731df410c5c196cf58b3fc6222395b5", size = 20968745, upload-time = "2026-05-16T06:17:20.569Z" }, + { url = "https://files.pythonhosted.org/packages/dd/36/33ad454a2b667a93b35e74595a351dbf9b8693440bd68665990663b79164/tensorstore-0.1.84-cp312-cp312-win_amd64.whl", hash = "sha256:08e7ec5b35db5d4c4b6a867be8500448f9bd4e0c9d5a52d7f0b460650622baf6", size = 13398458, upload-time = "2026-05-16T06:17:22.701Z" }, + { url = "https://files.pythonhosted.org/packages/e7/27/3c637c0f987866f6fb92cf96ee4d40eee4b5ab699135803ada851f2a56ad/tensorstore-0.1.84-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:9337d96693b4a0e555fbe63bb228e3e2e681a80e4d371f351fb67810f197f74e", size = 16571472, upload-time = "2026-05-16T06:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/41/83/4f3c6ef9bed01f384036c2030b3901cf075bbc8eff6e4529e502f0283ab5/tensorstore-0.1.84-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:028455cccdc05c31f194048cf459a26669b26d38f0516caf9213e7219b1ee79a", size = 14905288, upload-time = "2026-05-16T06:17:26.753Z" }, + { url = "https://files.pythonhosted.org/packages/4d/28/03e46405ba7c616e7a1ec5425a8f4a1b3f4d6ec2be359cb2f248199849e4/tensorstore-0.1.84-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50afb06c57a509091015af6a85da6f483a7f5ad0372284dd95d5513d877336e4", size = 19344890, upload-time = "2026-05-16T06:17:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c6/82669e70cef67c803852285ba6f59d7e3d102983c0ab4be8269c14756677/tensorstore-0.1.84-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ea53a851ea86aad3d99c14a790c85468d6324be14c7ac211f1f0265e8fab707", size = 20968230, upload-time = "2026-05-16T06:17:31.374Z" }, + { url = "https://files.pythonhosted.org/packages/a5/12/97d8ad183e3130e168f2feb860edd68f1b72e57f29268d980f3b70e34cd0/tensorstore-0.1.84-cp313-cp313-win_amd64.whl", hash = "sha256:fe9bf1c7fef69884a91222179550f9b5ba6c1454f9534429221824d9b15c00ec", size = 13398858, upload-time = "2026-05-16T06:17:33.658Z" }, + { url = "https://files.pythonhosted.org/packages/39/bd/fda828e7915ddb61704a6f4568b5b7ce9fe607c33b7535cf51b4fd900b38/tensorstore-0.1.84-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:97e767a64415297f019dd1e4b9af6a23d72e126e2a2d05cf41083253abe81428", size = 16576451, upload-time = "2026-05-16T06:17:35.993Z" }, + { url = "https://files.pythonhosted.org/packages/8a/99/2e72fcb19404de43f9412880c542a8ef8651bd30183c85454d6ca14ebe56/tensorstore-0.1.84-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7d01775985fcaa2b0f100349766a953c5086e92e746bf395e936151d4d8f9ac", size = 14907896, upload-time = "2026-05-16T06:17:38.458Z" }, + { url = "https://files.pythonhosted.org/packages/25/d4/9a3964cdfdc5a15df6d0485694de9684c13990a5b0f5d88bfa365e0a2936/tensorstore-0.1.84-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b2ff5d5536a8a9b1596c51b9075cc9d40b4c4ea4e6cc03c0480111dbe5d956d", size = 19347021, upload-time = "2026-05-16T06:17:41.316Z" }, + { url = "https://files.pythonhosted.org/packages/43/19/70532cb2bf2f6fc3bf252f850bfb528b26eeb9c30c3cafffb075cbb7c77a/tensorstore-0.1.84-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c9108ae6c29adc90b72ca267ba2b577386c5e410ea2f8e87eabce5ebdad327e", size = 20970345, upload-time = "2026-05-16T06:17:43.874Z" }, + { url = "https://files.pythonhosted.org/packages/4e/22/a523e7576c83a6c35bd1415e5f4530b0f1e448c099d7e22684f55792755c/tensorstore-0.1.84-cp314-cp314-win_amd64.whl", hash = "sha256:4096220f4b9a2411c3751597dd8ced2f671d7a217575613c915191e19d5ea150", size = 13787429, upload-time = "2026-05-16T06:17:46.135Z" }, + { url = "https://files.pythonhosted.org/packages/2b/23/40b0a0a91973431770ac09a8b69039bd7a051169f6707b63a1c51ad36782/tensorstore-0.1.84-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:70284a7225d94adad5989de7f9238638ec9fec2bdd8c0fdb86d567f16d59e615", size = 16652804, upload-time = "2026-05-16T06:17:49.226Z" }, + { url = "https://files.pythonhosted.org/packages/01/99/2ea3b37864adb2e9f6e724c6959ab2b7f56aa4dad01964d4b32adf211e68/tensorstore-0.1.84-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98e10cae5b3fc0828967b8ddf36242b3b26ac8bc79880bc3e36346063259212a", size = 14990904, upload-time = "2026-05-16T06:17:51.464Z" }, + { url = "https://files.pythonhosted.org/packages/ff/26/fe72887d7b91e832bef3033d244c4c548993d1b6fb19177dff3895659c12/tensorstore-0.1.84-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98edbc57d453ba8ebcf0d19bc28e4de6de95922bee2eca0805955b0833b8ce26", size = 19365698, upload-time = "2026-05-16T06:17:53.748Z" }, + { url = "https://files.pythonhosted.org/packages/37/74/35a1d41343f86f6e2ef135e81f6b8107b9f16c777a3e8be9e3fbce541d18/tensorstore-0.1.84-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bd20de85c1b83dd3ca94db24e7bd449bdb055590a1b162b05691f6b81fff00f", size = 20986107, upload-time = "2026-05-16T06:17:56.571Z" }, +] + [[package]] name = "threadpoolctl" version = "3.6.0" @@ -2583,6 +3790,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, ] +[[package]] +name = "tqdm" +version = "4.68.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/d7/0535a28b1f5f24f6612fb3ff1e89fb1a8d160fee0f976e0aa6803862134b/tqdm-4.68.3.tar.gz", hash = "sha256:00dfa48452b6b6cfae3dd9885636c23d3422d1ec97c66d96818cbd5e0821d482", size = 170596, upload-time = "2026-06-17T07:36:52.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/8e/bb97bb0c71802080bfc8952937d174e49cfc50de5c951dd47b2496f0dcdb/tqdm-4.68.3-py3-none-any.whl", hash = "sha256:39832cc2def2789a6f29df83f172db7416cea70052c0907a57801c5f2fdccb03", size = 78337, upload-time = "2026-06-17T07:36:50.132Z" }, +] + +[[package]] +name = "treescope" +version = "0.1.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/2a/d13d3c38862632742d2fe2f7ae307c431db06538fd05ca03020d207b5dcc/treescope-0.1.10.tar.gz", hash = "sha256:20f74656f34ab2d8716715013e8163a0da79bdc2554c16d5023172c50d27ea95", size = 138870, upload-time = "2025-08-08T05:43:48.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/2b/36e984399089c026a6499ac8f7401d38487cf0183839a4aa78140d373771/treescope-0.1.10-py3-none-any.whl", hash = "sha256:dde52f5314f4c29d22157a6fe4d3bd103f9cae02791c9e672eefa32c9aa1da51", size = 182255, upload-time = "2025-08-08T05:43:46.673Z" }, +] + +[[package]] +name = "typer" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc", marker = "python_full_version >= '3.12'" }, + { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "rich", marker = "python_full_version >= '3.12'" }, + { name = "shellingham", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", size = 58409, upload-time = "2026-04-30T19:32:18.271Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -2610,6 +3856,65 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/14/ecceb239b65adaaf7fde510aa8bd534075695d1e5f8dadfa32b5723d9cfb/uvloop-0.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c", size = 1343335, upload-time = "2025-10-16T22:16:11.43Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ae/6f6f9af7f590b319c94532b9567409ba11f4fa71af1148cab1bf48a07048/uvloop-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792", size = 742903, upload-time = "2025-10-16T22:16:12.979Z" }, + { url = "https://files.pythonhosted.org/packages/09/bd/3667151ad0702282a1f4d5d29288fce8a13c8b6858bf0978c219cd52b231/uvloop-0.22.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86", size = 3648499, upload-time = "2025-10-16T22:16:14.451Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f6/21657bb3beb5f8c57ce8be3b83f653dd7933c2fd00545ed1b092d464799a/uvloop-0.22.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:481c990a7abe2c6f4fc3d98781cc9426ebd7f03a9aaa7eb03d3bfc68ac2a46bd", size = 3700133, upload-time = "2025-10-16T22:16:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/09/e0/604f61d004ded805f24974c87ddd8374ef675644f476f01f1df90e4cdf72/uvloop-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2", size = 3512681, upload-time = "2025-10-16T22:16:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ce/8491fd370b0230deb5eac69c7aae35b3be527e25a911c0acdffb922dc1cd/uvloop-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec", size = 3615261, upload-time = "2025-10-16T22:16:19.596Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, + { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1b/6fbd611aeba01ef802c5876c94d7be603a9710db055beacbad39e75a31aa/uvloop-0.22.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b45649628d816c030dba3c80f8e2689bab1c89518ed10d426036cdc47874dfc4", size = 1345858, upload-time = "2025-10-16T22:17:11.106Z" }, + { url = "https://files.pythonhosted.org/packages/9e/91/2c84f00bdbe3c51023cc83b027bac1fe959ba4a552e970da5ef0237f7945/uvloop-0.22.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ea721dd3203b809039fcc2983f14608dae82b212288b346e0bfe46ec2fab0b7c", size = 743913, upload-time = "2025-10-16T22:17:12.165Z" }, + { url = "https://files.pythonhosted.org/packages/cc/10/76aec83886d41a88aca5681db6a2c0601622d0d2cb66cd0d200587f962ad/uvloop-0.22.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ae676de143db2b2f60a9696d7eca5bb9d0dd6cc3ac3dad59a8ae7e95f9e1b54", size = 3635818, upload-time = "2025-10-16T22:17:13.812Z" }, + { url = "https://files.pythonhosted.org/packages/d5/9a/733fcb815d345979fc54d3cdc3eb50bc75a47da3e4003ea7ada58e6daa65/uvloop-0.22.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17d4e97258b0172dfa107b89aa1eeba3016f4b1974ce85ca3ef6a66b35cbf659", size = 3685477, upload-time = "2025-10-16T22:17:15.307Z" }, + { url = "https://files.pythonhosted.org/packages/83/fb/bee1eb11cc92bd91f76d97869bb6a816e80d59fd73721b0a3044dc703d9c/uvloop-0.22.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:05e4b5f86e621cf3927631789999e697e58f0d2d32675b67d9ca9eb0bca55743", size = 3496128, upload-time = "2025-10-16T22:17:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/76/ee/3fdfeaa9776c0fd585d358c92b1dbca669720ffa476f0bbe64ed8f245bd7/uvloop-0.22.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:286322a90bea1f9422a470d5d2ad82d38080be0a29c4dd9b3e6384320a4d11e7", size = 3602565, upload-time = "2025-10-16T22:17:17.755Z" }, +] + +[[package]] +name = "wadler-lindig" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/67/cbae4bf7683a64755c2c1778c418fea96d00e34395bb91743f08bd951571/wadler_lindig-0.1.7.tar.gz", hash = "sha256:81d14d3fe77d441acf3ebd7f4aefac20c74128bf460e84b512806dccf7b2cd55", size = 15842, upload-time = "2025-06-18T07:00:42.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl", hash = "sha256:e3ec83835570fd0a9509f969162aeb9c65618f998b1f42918cfc8d45122fe953", size = 20516, upload-time = "2025-06-18T07:00:41.684Z" }, +] + [[package]] name = "xgboost" version = "2.1.4" @@ -2638,13 +3943,22 @@ name = "xgboost" version = "3.1.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "nvidia-nccl-cu12", marker = "python_full_version >= '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, From f9c1c53eac762b6a62e405a7b1f8b59acb0983f3 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Wed, 24 Jun 2026 09:29:57 +0100 Subject: [PATCH 06/30] update Py cli ver, README and reqs --- .github/workflows/tests.yml | 2 +- README.md | 2 +- pyproject.toml | 9 +- uv.lock | 1214 ++--------------------------------- 4 files changed, 57 insertions(+), 1170 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e851584..aa507e6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index cb70877..59087aa 100644 --- a/README.md +++ b/README.md @@ -229,7 +229,7 @@ EIR), the mosquito-density HBR pipeline, and the bednet calculation. ## CI and releases -The test suite runs on every push and pull request across Python 3.9 to 3.12, defined in +The test suite runs on every push and pull request across Python 3.10 to 3.14, defined in [`.github/workflows/tests.yml`](.github/workflows/tests.yml). Releases publish to PyPI from [`.github/workflows/publish.yml`](.github/workflows/publish.yml). diff --git a/pyproject.toml b/pyproject.toml index cf7d77e..d5cbeac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ version = "1.4.0" description = "EIR Estimation using Machine learning INTerventions - Python port" readme = "README.md" license = "MIT" -requires-python = ">=3.9" +requires-python = ">=3.10" authors = [ {name = "Cosmo Santoni", email = "cosmo.santoni@imperial.ac.uk"}, ] @@ -24,10 +24,11 @@ classifiers = [ "Intended Audience :: Science/Research", "Operating System :: OS Independent", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Scientific/Engineering :: Bio-Informatics", ] @@ -111,14 +112,14 @@ estimint = [ [tool.black] line-length = 100 -target-version = ["py39", "py310", "py311", "py312"] +target-version = ["py310", "py311", "py312", "py313"] [tool.isort] profile = "black" line_length = 100 [tool.mypy] -python_version = "3.9" +python_version = "3.10" warn_return_any = true warn_unused_configs = true ignore_missing_imports = true diff --git a/uv.lock b/uv.lock index e49baf6..1f4e035 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.9" +requires-python = ">=3.10" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", @@ -12,8 +12,7 @@ resolution-markers = [ "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", - "python_full_version < '3.10'", + "python_full_version < '3.11'", ] [[package]] @@ -76,14 +75,12 @@ name = "black" version = "25.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "mypy-extensions" }, { name = "packaging" }, { name = "pathspec" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "platformdirs", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "platformdirs" }, { name = "pytokens" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, @@ -110,10 +107,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", size = 1612902, upload-time = "2025-11-10T01:59:33.382Z" }, { url = "https://files.pythonhosted.org/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", size = 1680571, upload-time = "2025-11-10T01:57:04.239Z" }, { url = "https://files.pythonhosted.org/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", size = 1382599, upload-time = "2025-11-10T01:57:57.427Z" }, - { url = "https://files.pythonhosted.org/packages/d5/9a/5b2c0e3215fe748fcf515c2dd34658973a1210bf610e24de5ba887e4f1c8/black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", size = 1743063, upload-time = "2025-11-10T02:02:43.175Z" }, - { url = "https://files.pythonhosted.org/packages/a1/20/245164c6efc27333409c62ba54dcbfbe866c6d1957c9a6c0647786e950da/black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", size = 1596867, upload-time = "2025-11-10T02:00:17.157Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6f/1a3859a7da205f3d50cf3a8bec6bdc551a91c33ae77a045bb24c1f46ab54/black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", size = 1655678, upload-time = "2025-11-10T01:57:09.028Z" }, - { url = "https://files.pythonhosted.org/packages/56/1a/6dec1aeb7be90753d4fcc273e69bc18bfd34b353223ed191da33f7519410/black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", size = 1347452, upload-time = "2025-11-10T01:57:01.871Z" }, { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" }, ] @@ -212,50 +205,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, - { url = "https://files.pythonhosted.org/packages/46/7c/0c4760bccf082737ca7ab84a4c2034fcc06b1f21cf3032ea98bd6feb1725/charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", size = 209609, upload-time = "2025-10-14T04:42:10.922Z" }, - { url = "https://files.pythonhosted.org/packages/bb/a4/69719daef2f3d7f1819de60c9a6be981b8eeead7542d5ec4440f3c80e111/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", size = 149029, upload-time = "2025-10-14T04:42:12.38Z" }, - { url = "https://files.pythonhosted.org/packages/e6/21/8d4e1d6c1e6070d3672908b8e4533a71b5b53e71d16828cc24d0efec564c/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608", size = 144580, upload-time = "2025-10-14T04:42:13.549Z" }, - { url = "https://files.pythonhosted.org/packages/a7/0a/a616d001b3f25647a9068e0b9199f697ce507ec898cacb06a0d5a1617c99/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", size = 162340, upload-time = "2025-10-14T04:42:14.892Z" }, - { url = "https://files.pythonhosted.org/packages/85/93/060b52deb249a5450460e0585c88a904a83aec474ab8e7aba787f45e79f2/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", size = 159619, upload-time = "2025-10-14T04:42:16.676Z" }, - { url = "https://files.pythonhosted.org/packages/dd/21/0274deb1cc0632cd587a9a0ec6b4674d9108e461cb4cd40d457adaeb0564/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", size = 153980, upload-time = "2025-10-14T04:42:17.917Z" }, - { url = "https://files.pythonhosted.org/packages/28/2b/e3d7d982858dccc11b31906976323d790dded2017a0572f093ff982d692f/charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", size = 152174, upload-time = "2025-10-14T04:42:19.018Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ff/4a269f8e35f1e58b2df52c131a1fa019acb7ef3f8697b7d464b07e9b492d/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", size = 151666, upload-time = "2025-10-14T04:42:20.171Z" }, - { url = "https://files.pythonhosted.org/packages/da/c9/ec39870f0b330d58486001dd8e532c6b9a905f5765f58a6f8204926b4a93/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", size = 145550, upload-time = "2025-10-14T04:42:21.324Z" }, - { url = "https://files.pythonhosted.org/packages/75/8f/d186ab99e40e0ed9f82f033d6e49001701c81244d01905dd4a6924191a30/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", size = 163721, upload-time = "2025-10-14T04:42:22.46Z" }, - { url = "https://files.pythonhosted.org/packages/96/b1/6047663b9744df26a7e479ac1e77af7134b1fcf9026243bb48ee2d18810f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", size = 152127, upload-time = "2025-10-14T04:42:23.712Z" }, - { url = "https://files.pythonhosted.org/packages/59/78/e5a6eac9179f24f704d1be67d08704c3c6ab9f00963963524be27c18ed87/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", size = 161175, upload-time = "2025-10-14T04:42:24.87Z" }, - { url = "https://files.pythonhosted.org/packages/e5/43/0e626e42d54dd2f8dd6fc5e1c5ff00f05fbca17cb699bedead2cae69c62f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", size = 155375, upload-time = "2025-10-14T04:42:27.246Z" }, - { url = "https://files.pythonhosted.org/packages/e9/91/d9615bf2e06f35e4997616ff31248c3657ed649c5ab9d35ea12fce54e380/charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", size = 99692, upload-time = "2025-10-14T04:42:28.425Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a9/6c040053909d9d1ef4fcab45fddec083aedc9052c10078339b47c8573ea8/charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", size = 107192, upload-time = "2025-10-14T04:42:29.482Z" }, - { url = "https://files.pythonhosted.org/packages/f0/c6/4fa536b2c0cd3edfb7ccf8469fa0f363ea67b7213a842b90909ca33dd851/charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", size = 100220, upload-time = "2025-10-14T04:42:30.632Z" }, { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, -] - [[package]] name = "click" version = "8.3.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", + "python_full_version < '3.11'", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and python_full_version < '3.12' and sys_platform == 'win32'" }, + { name = "colorama", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ @@ -294,93 +256,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] -[[package]] -name = "contourpy" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/f6/31a8f28b4a2a4fa0e01085e542f3081ab0588eff8e589d39d775172c9792/contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4", size = 13464370, upload-time = "2024-08-27T21:00:03.328Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/e0/be8dcc796cfdd96708933e0e2da99ba4bb8f9b2caa9d560a50f3f09a65f3/contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7", size = 265366, upload-time = "2024-08-27T20:50:09.947Z" }, - { url = "https://files.pythonhosted.org/packages/50/d6/c953b400219443535d412fcbbc42e7a5e823291236bc0bb88936e3cc9317/contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42", size = 249226, upload-time = "2024-08-27T20:50:16.1Z" }, - { url = "https://files.pythonhosted.org/packages/6f/b4/6fffdf213ffccc28483c524b9dad46bb78332851133b36ad354b856ddc7c/contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7", size = 308460, upload-time = "2024-08-27T20:50:22.536Z" }, - { url = "https://files.pythonhosted.org/packages/cf/6c/118fc917b4050f0afe07179a6dcbe4f3f4ec69b94f36c9e128c4af480fb8/contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab", size = 347623, upload-time = "2024-08-27T20:50:28.806Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a4/30ff110a81bfe3abf7b9673284d21ddce8cc1278f6f77393c91199da4c90/contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589", size = 317761, upload-time = "2024-08-27T20:50:35.126Z" }, - { url = "https://files.pythonhosted.org/packages/99/e6/d11966962b1aa515f5586d3907ad019f4b812c04e4546cc19ebf62b5178e/contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41", size = 322015, upload-time = "2024-08-27T20:50:40.318Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e3/182383743751d22b7b59c3c753277b6aee3637049197624f333dac5b4c80/contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d", size = 1262672, upload-time = "2024-08-27T20:50:55.643Z" }, - { url = "https://files.pythonhosted.org/packages/78/53/974400c815b2e605f252c8fb9297e2204347d1755a5374354ee77b1ea259/contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223", size = 1321688, upload-time = "2024-08-27T20:51:11.293Z" }, - { url = "https://files.pythonhosted.org/packages/52/29/99f849faed5593b2926a68a31882af98afbeac39c7fdf7de491d9c85ec6a/contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f", size = 171145, upload-time = "2024-08-27T20:51:15.2Z" }, - { url = "https://files.pythonhosted.org/packages/a9/97/3f89bba79ff6ff2b07a3cbc40aa693c360d5efa90d66e914f0ff03b95ec7/contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b", size = 216019, upload-time = "2024-08-27T20:51:19.365Z" }, - { url = "https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad", size = 266356, upload-time = "2024-08-27T20:51:24.146Z" }, - { url = "https://files.pythonhosted.org/packages/05/46/9256dd162ea52790c127cb58cfc3b9e3413a6e3478917d1f811d420772ec/contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49", size = 250915, upload-time = "2024-08-27T20:51:28.683Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66", size = 310443, upload-time = "2024-08-27T20:51:33.675Z" }, - { url = "https://files.pythonhosted.org/packages/ca/c2/1a612e475492e07f11c8e267ea5ec1ce0d89971be496c195e27afa97e14a/contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081", size = 348548, upload-time = "2024-08-27T20:51:39.322Z" }, - { url = "https://files.pythonhosted.org/packages/45/cf/2c2fc6bb5874158277b4faf136847f0689e1b1a1f640a36d76d52e78907c/contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1", size = 319118, upload-time = "2024-08-27T20:51:44.717Z" }, - { url = "https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d", size = 323162, upload-time = "2024-08-27T20:51:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/42/80/e637326e85e4105a802e42959f56cff2cd39a6b5ef68d5d9aee3ea5f0e4c/contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c", size = 1265396, upload-time = "2024-08-27T20:52:04.926Z" }, - { url = "https://files.pythonhosted.org/packages/7c/3b/8cbd6416ca1bbc0202b50f9c13b2e0b922b64be888f9d9ee88e6cfabfb51/contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb", size = 1324297, upload-time = "2024-08-27T20:52:21.843Z" }, - { url = "https://files.pythonhosted.org/packages/4d/2c/021a7afaa52fe891f25535506cc861c30c3c4e5a1c1ce94215e04b293e72/contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c", size = 171808, upload-time = "2024-08-27T20:52:25.163Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2f/804f02ff30a7fae21f98198828d0857439ec4c91a96e20cf2d6c49372966/contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67", size = 217181, upload-time = "2024-08-27T20:52:29.13Z" }, - { url = "https://files.pythonhosted.org/packages/c9/92/8e0bbfe6b70c0e2d3d81272b58c98ac69ff1a4329f18c73bd64824d8b12e/contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f", size = 267838, upload-time = "2024-08-27T20:52:33.911Z" }, - { url = "https://files.pythonhosted.org/packages/e3/04/33351c5d5108460a8ce6d512307690b023f0cfcad5899499f5c83b9d63b1/contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6", size = 251549, upload-time = "2024-08-27T20:52:39.179Z" }, - { url = "https://files.pythonhosted.org/packages/51/3d/aa0fe6ae67e3ef9f178389e4caaaa68daf2f9024092aa3c6032e3d174670/contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639", size = 303177, upload-time = "2024-08-27T20:52:44.789Z" }, - { url = "https://files.pythonhosted.org/packages/56/c3/c85a7e3e0cab635575d3b657f9535443a6f5d20fac1a1911eaa4bbe1aceb/contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c", size = 341735, upload-time = "2024-08-27T20:52:51.05Z" }, - { url = "https://files.pythonhosted.org/packages/dd/8d/20f7a211a7be966a53f474bc90b1a8202e9844b3f1ef85f3ae45a77151ee/contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06", size = 314679, upload-time = "2024-08-27T20:52:58.473Z" }, - { url = "https://files.pythonhosted.org/packages/6e/be/524e377567defac0e21a46e2a529652d165fed130a0d8a863219303cee18/contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09", size = 320549, upload-time = "2024-08-27T20:53:06.593Z" }, - { url = "https://files.pythonhosted.org/packages/0f/96/fdb2552a172942d888915f3a6663812e9bc3d359d53dafd4289a0fb462f0/contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd", size = 1263068, upload-time = "2024-08-27T20:53:23.442Z" }, - { url = "https://files.pythonhosted.org/packages/2a/25/632eab595e3140adfa92f1322bf8915f68c932bac468e89eae9974cf1c00/contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35", size = 1322833, upload-time = "2024-08-27T20:53:39.243Z" }, - { url = "https://files.pythonhosted.org/packages/73/e3/69738782e315a1d26d29d71a550dbbe3eb6c653b028b150f70c1a5f4f229/contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb", size = 172681, upload-time = "2024-08-27T20:53:43.05Z" }, - { url = "https://files.pythonhosted.org/packages/0c/89/9830ba00d88e43d15e53d64931e66b8792b46eb25e2050a88fec4a0df3d5/contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b", size = 218283, upload-time = "2024-08-27T20:53:47.232Z" }, - { url = "https://files.pythonhosted.org/packages/53/a1/d20415febfb2267af2d7f06338e82171824d08614084714fb2c1dac9901f/contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3", size = 267879, upload-time = "2024-08-27T20:53:51.597Z" }, - { url = "https://files.pythonhosted.org/packages/aa/45/5a28a3570ff6218d8bdfc291a272a20d2648104815f01f0177d103d985e1/contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7", size = 251573, upload-time = "2024-08-27T20:53:55.659Z" }, - { url = "https://files.pythonhosted.org/packages/39/1c/d3f51540108e3affa84f095c8b04f0aa833bb797bc8baa218a952a98117d/contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84", size = 303184, upload-time = "2024-08-27T20:54:00.225Z" }, - { url = "https://files.pythonhosted.org/packages/00/56/1348a44fb6c3a558c1a3a0cd23d329d604c99d81bf5a4b58c6b71aab328f/contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0", size = 340262, upload-time = "2024-08-27T20:54:05.234Z" }, - { url = "https://files.pythonhosted.org/packages/2b/23/00d665ba67e1bb666152131da07e0f24c95c3632d7722caa97fb61470eca/contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b", size = 313806, upload-time = "2024-08-27T20:54:09.889Z" }, - { url = "https://files.pythonhosted.org/packages/5a/42/3cf40f7040bb8362aea19af9a5fb7b32ce420f645dd1590edcee2c657cd5/contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da", size = 319710, upload-time = "2024-08-27T20:54:14.536Z" }, - { url = "https://files.pythonhosted.org/packages/05/32/f3bfa3fc083b25e1a7ae09197f897476ee68e7386e10404bdf9aac7391f0/contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14", size = 1264107, upload-time = "2024-08-27T20:54:29.735Z" }, - { url = "https://files.pythonhosted.org/packages/1c/1e/1019d34473a736664f2439542b890b2dc4c6245f5c0d8cdfc0ccc2cab80c/contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8", size = 1322458, upload-time = "2024-08-27T20:54:45.507Z" }, - { url = "https://files.pythonhosted.org/packages/22/85/4f8bfd83972cf8909a4d36d16b177f7b8bdd942178ea4bf877d4a380a91c/contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294", size = 172643, upload-time = "2024-08-27T20:55:52.754Z" }, - { url = "https://files.pythonhosted.org/packages/cc/4a/fb3c83c1baba64ba90443626c228ca14f19a87c51975d3b1de308dd2cf08/contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087", size = 218301, upload-time = "2024-08-27T20:55:56.509Z" }, - { url = "https://files.pythonhosted.org/packages/76/65/702f4064f397821fea0cb493f7d3bc95a5d703e20954dce7d6d39bacf378/contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8", size = 278972, upload-time = "2024-08-27T20:54:50.347Z" }, - { url = "https://files.pythonhosted.org/packages/80/85/21f5bba56dba75c10a45ec00ad3b8190dbac7fd9a8a8c46c6116c933e9cf/contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b", size = 263375, upload-time = "2024-08-27T20:54:54.909Z" }, - { url = "https://files.pythonhosted.org/packages/0a/64/084c86ab71d43149f91ab3a4054ccf18565f0a8af36abfa92b1467813ed6/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973", size = 307188, upload-time = "2024-08-27T20:55:00.184Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ff/d61a4c288dc42da0084b8d9dc2aa219a850767165d7d9a9c364ff530b509/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18", size = 345644, upload-time = "2024-08-27T20:55:05.673Z" }, - { url = "https://files.pythonhosted.org/packages/ca/aa/00d2313d35ec03f188e8f0786c2fc61f589306e02fdc158233697546fd58/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8", size = 317141, upload-time = "2024-08-27T20:55:11.047Z" }, - { url = "https://files.pythonhosted.org/packages/8d/6a/b5242c8cb32d87f6abf4f5e3044ca397cb1a76712e3fa2424772e3ff495f/contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6", size = 323469, upload-time = "2024-08-27T20:55:15.914Z" }, - { url = "https://files.pythonhosted.org/packages/6f/a6/73e929d43028a9079aca4bde107494864d54f0d72d9db508a51ff0878593/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2", size = 1260894, upload-time = "2024-08-27T20:55:31.553Z" }, - { url = "https://files.pythonhosted.org/packages/2b/1e/1e726ba66eddf21c940821df8cf1a7d15cb165f0682d62161eaa5e93dae1/contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927", size = 1314829, upload-time = "2024-08-27T20:55:47.837Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e3/b9f72758adb6ef7397327ceb8b9c39c75711affb220e4f53c745ea1d5a9a/contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8", size = 265518, upload-time = "2024-08-27T20:56:01.333Z" }, - { url = "https://files.pythonhosted.org/packages/ec/22/19f5b948367ab5260fb41d842c7a78dae645603881ea6bc39738bcfcabf6/contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c", size = 249350, upload-time = "2024-08-27T20:56:05.432Z" }, - { url = "https://files.pythonhosted.org/packages/26/76/0c7d43263dd00ae21a91a24381b7e813d286a3294d95d179ef3a7b9fb1d7/contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca", size = 309167, upload-time = "2024-08-27T20:56:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/96/3b/cadff6773e89f2a5a492c1a8068e21d3fccaf1a1c1df7d65e7c8e3ef60ba/contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f", size = 348279, upload-time = "2024-08-27T20:56:15.41Z" }, - { url = "https://files.pythonhosted.org/packages/e1/86/158cc43aa549d2081a955ab11c6bdccc7a22caacc2af93186d26f5f48746/contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc", size = 318519, upload-time = "2024-08-27T20:56:21.813Z" }, - { url = "https://files.pythonhosted.org/packages/05/11/57335544a3027e9b96a05948c32e566328e3a2f84b7b99a325b7a06d2b06/contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2", size = 321922, upload-time = "2024-08-27T20:56:26.983Z" }, - { url = "https://files.pythonhosted.org/packages/0b/e3/02114f96543f4a1b694333b92a6dcd4f8eebbefcc3a5f3bbb1316634178f/contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e", size = 1258017, upload-time = "2024-08-27T20:56:42.246Z" }, - { url = "https://files.pythonhosted.org/packages/f3/3b/bfe4c81c6d5881c1c643dde6620be0b42bf8aab155976dd644595cfab95c/contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800", size = 1316773, upload-time = "2024-08-27T20:56:58.58Z" }, - { url = "https://files.pythonhosted.org/packages/f1/17/c52d2970784383cafb0bd918b6fb036d98d96bbf0bc1befb5d1e31a07a70/contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5", size = 171353, upload-time = "2024-08-27T20:57:02.718Z" }, - { url = "https://files.pythonhosted.org/packages/53/23/db9f69676308e094d3c45f20cc52e12d10d64f027541c995d89c11ad5c75/contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843", size = 211817, upload-time = "2024-08-27T20:57:06.328Z" }, - { url = "https://files.pythonhosted.org/packages/d1/09/60e486dc2b64c94ed33e58dcfb6f808192c03dfc5574c016218b9b7680dc/contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c", size = 261886, upload-time = "2024-08-27T20:57:10.863Z" }, - { url = "https://files.pythonhosted.org/packages/19/20/b57f9f7174fcd439a7789fb47d764974ab646fa34d1790551de386457a8e/contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779", size = 311008, upload-time = "2024-08-27T20:57:15.588Z" }, - { url = "https://files.pythonhosted.org/packages/74/fc/5040d42623a1845d4f17a418e590fd7a79ae8cb2bad2b2f83de63c3bdca4/contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4", size = 215690, upload-time = "2024-08-27T20:57:19.321Z" }, - { url = "https://files.pythonhosted.org/packages/2b/24/dc3dcd77ac7460ab7e9d2b01a618cb31406902e50e605a8d6091f0a8f7cc/contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0", size = 261894, upload-time = "2024-08-27T20:57:23.873Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/531642a01cfec39d1682e46b5457b07cf805e3c3c584ec27e2a6223f8f6c/contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102", size = 311099, upload-time = "2024-08-27T20:57:28.58Z" }, - { url = "https://files.pythonhosted.org/packages/38/1e/94bda024d629f254143a134eead69e21c836429a2a6ce82209a00ddcb79a/contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb", size = 215838, upload-time = "2024-08-27T20:57:32.913Z" }, -] - [[package]] name = "contourpy" version = "1.3.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } wheels = [ @@ -537,142 +421,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, ] -[[package]] -name = "coverage" -version = "7.10.7" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/6c/3a3f7a46888e69d18abe3ccc6fe4cb16cccb1e6a2f99698931dafca489e6/coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a", size = 217987, upload-time = "2025-09-21T20:00:57.218Z" }, - { url = "https://files.pythonhosted.org/packages/03/94/952d30f180b1a916c11a56f5c22d3535e943aa22430e9e3322447e520e1c/coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5", size = 218388, upload-time = "2025-09-21T20:01:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/50/2b/9e0cf8ded1e114bcd8b2fd42792b57f1c4e9e4ea1824cde2af93a67305be/coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17", size = 245148, upload-time = "2025-09-21T20:01:01.768Z" }, - { url = "https://files.pythonhosted.org/packages/19/20/d0384ac06a6f908783d9b6aa6135e41b093971499ec488e47279f5b846e6/coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b", size = 246958, upload-time = "2025-09-21T20:01:03.355Z" }, - { url = "https://files.pythonhosted.org/packages/60/83/5c283cff3d41285f8eab897651585db908a909c572bdc014bcfaf8a8b6ae/coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87", size = 248819, upload-time = "2025-09-21T20:01:04.968Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/02eb98fdc5ff79f423e990d877693e5310ae1eab6cb20ae0b0b9ac45b23b/coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e", size = 245754, upload-time = "2025-09-21T20:01:06.321Z" }, - { url = "https://files.pythonhosted.org/packages/b4/bc/25c83bcf3ad141b32cd7dc45485ef3c01a776ca3aa8ef0a93e77e8b5bc43/coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e", size = 246860, upload-time = "2025-09-21T20:01:07.605Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b7/95574702888b58c0928a6e982038c596f9c34d52c5e5107f1eef729399b5/coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df", size = 244877, upload-time = "2025-09-21T20:01:08.829Z" }, - { url = "https://files.pythonhosted.org/packages/47/b6/40095c185f235e085df0e0b158f6bd68cc6e1d80ba6c7721dc81d97ec318/coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0", size = 245108, upload-time = "2025-09-21T20:01:10.527Z" }, - { url = "https://files.pythonhosted.org/packages/c8/50/4aea0556da7a4b93ec9168420d170b55e2eb50ae21b25062513d020c6861/coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13", size = 245752, upload-time = "2025-09-21T20:01:11.857Z" }, - { url = "https://files.pythonhosted.org/packages/6a/28/ea1a84a60828177ae3b100cb6723838523369a44ec5742313ed7db3da160/coverage-7.10.7-cp310-cp310-win32.whl", hash = "sha256:b51dcd060f18c19290d9b8a9dd1e0181538df2ce0717f562fff6cf74d9fc0b5b", size = 220497, upload-time = "2025-09-21T20:01:13.459Z" }, - { url = "https://files.pythonhosted.org/packages/fc/1a/a81d46bbeb3c3fd97b9602ebaa411e076219a150489bcc2c025f151bd52d/coverage-7.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:3a622ac801b17198020f09af3eaf45666b344a0d69fc2a6ffe2ea83aeef1d807", size = 221392, upload-time = "2025-09-21T20:01:14.722Z" }, - { url = "https://files.pythonhosted.org/packages/d2/5d/c1a17867b0456f2e9ce2d8d4708a4c3a089947d0bec9c66cdf60c9e7739f/coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59", size = 218102, upload-time = "2025-09-21T20:01:16.089Z" }, - { url = "https://files.pythonhosted.org/packages/54/f0/514dcf4b4e3698b9a9077f084429681bf3aad2b4a72578f89d7f643eb506/coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a", size = 218505, upload-time = "2025-09-21T20:01:17.788Z" }, - { url = "https://files.pythonhosted.org/packages/20/f6/9626b81d17e2a4b25c63ac1b425ff307ecdeef03d67c9a147673ae40dc36/coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699", size = 248898, upload-time = "2025-09-21T20:01:19.488Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ef/bd8e719c2f7417ba03239052e099b76ea1130ac0cbb183ee1fcaa58aaff3/coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d", size = 250831, upload-time = "2025-09-21T20:01:20.817Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b6/bf054de41ec948b151ae2b79a55c107f5760979538f5fb80c195f2517718/coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e", size = 252937, upload-time = "2025-09-21T20:01:22.171Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e5/3860756aa6f9318227443c6ce4ed7bf9e70bb7f1447a0353f45ac5c7974b/coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23", size = 249021, upload-time = "2025-09-21T20:01:23.907Z" }, - { url = "https://files.pythonhosted.org/packages/26/0f/bd08bd042854f7fd07b45808927ebcce99a7ed0f2f412d11629883517ac2/coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab", size = 250626, upload-time = "2025-09-21T20:01:25.721Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a7/4777b14de4abcc2e80c6b1d430f5d51eb18ed1d75fca56cbce5f2db9b36e/coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82", size = 248682, upload-time = "2025-09-21T20:01:27.105Z" }, - { url = "https://files.pythonhosted.org/packages/34/72/17d082b00b53cd45679bad682fac058b87f011fd8b9fe31d77f5f8d3a4e4/coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2", size = 248402, upload-time = "2025-09-21T20:01:28.629Z" }, - { url = "https://files.pythonhosted.org/packages/81/7a/92367572eb5bdd6a84bfa278cc7e97db192f9f45b28c94a9ca1a921c3577/coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61", size = 249320, upload-time = "2025-09-21T20:01:30.004Z" }, - { url = "https://files.pythonhosted.org/packages/2f/88/a23cc185f6a805dfc4fdf14a94016835eeb85e22ac3a0e66d5e89acd6462/coverage-7.10.7-cp311-cp311-win32.whl", hash = "sha256:972b9e3a4094b053a4e46832b4bc829fc8a8d347160eb39d03f1690316a99c14", size = 220536, upload-time = "2025-09-21T20:01:32.184Z" }, - { url = "https://files.pythonhosted.org/packages/fe/ef/0b510a399dfca17cec7bc2f05ad8bd78cf55f15c8bc9a73ab20c5c913c2e/coverage-7.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:a7b55a944a7f43892e28ad4bc0561dfd5f0d73e605d1aa5c3c976b52aea121d2", size = 221425, upload-time = "2025-09-21T20:01:33.557Z" }, - { url = "https://files.pythonhosted.org/packages/51/7f/023657f301a276e4ba1850f82749bc136f5a7e8768060c2e5d9744a22951/coverage-7.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:736f227fb490f03c6488f9b6d45855f8e0fd749c007f9303ad30efab0e73c05a", size = 220103, upload-time = "2025-09-21T20:01:34.929Z" }, - { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, - { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, - { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, - { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, - { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, - { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, - { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, - { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload-time = "2025-09-21T20:01:51.941Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload-time = "2025-09-21T20:01:53.481Z" }, - { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload-time = "2025-09-21T20:01:55.2Z" }, - { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, - { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, - { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, - { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, - { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, - { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, - { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, - { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, - { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, - { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" }, - { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" }, - { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, - { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, - { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, - { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, - { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, - { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, - { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, - { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, - { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" }, - { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" }, - { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" }, - { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, - { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, - { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, - { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, - { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, - { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, - { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, - { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, - { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, - { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, - { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, - { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, - { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, - { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ad/d1c25053764b4c42eb294aae92ab617d2e4f803397f9c7c8295caa77a260/coverage-7.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3", size = 217978, upload-time = "2025-09-21T20:03:30.362Z" }, - { url = "https://files.pythonhosted.org/packages/52/2f/b9f9daa39b80ece0b9548bbb723381e29bc664822d9a12c2135f8922c22b/coverage-7.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc91b314cef27742da486d6839b677b3f2793dfe52b51bbbb7cf736d5c29281c", size = 218370, upload-time = "2025-09-21T20:03:32.147Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6e/30d006c3b469e58449650642383dddf1c8fb63d44fdf92994bfd46570695/coverage-7.10.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:567f5c155eda8df1d3d439d40a45a6a5f029b429b06648235f1e7e51b522b396", size = 244802, upload-time = "2025-09-21T20:03:33.919Z" }, - { url = "https://files.pythonhosted.org/packages/b0/49/8a070782ce7e6b94ff6a0b6d7c65ba6bc3091d92a92cef4cd4eb0767965c/coverage-7.10.7-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af88deffcc8a4d5974cf2d502251bc3b2db8461f0b66d80a449c33757aa9f40", size = 246625, upload-time = "2025-09-21T20:03:36.09Z" }, - { url = "https://files.pythonhosted.org/packages/6a/92/1c1c5a9e8677ce56d42b97bdaca337b2d4d9ebe703d8c174ede52dbabd5f/coverage-7.10.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7315339eae3b24c2d2fa1ed7d7a38654cba34a13ef19fbcb9425da46d3dc594", size = 248399, upload-time = "2025-09-21T20:03:38.342Z" }, - { url = "https://files.pythonhosted.org/packages/c0/54/b140edee7257e815de7426d5d9846b58505dffc29795fff2dfb7f8a1c5a0/coverage-7.10.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:912e6ebc7a6e4adfdbb1aec371ad04c68854cd3bf3608b3514e7ff9062931d8a", size = 245142, upload-time = "2025-09-21T20:03:40.591Z" }, - { url = "https://files.pythonhosted.org/packages/e4/9e/6d6b8295940b118e8b7083b29226c71f6154f7ff41e9ca431f03de2eac0d/coverage-7.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f49a05acd3dfe1ce9715b657e28d138578bc40126760efb962322c56e9ca344b", size = 246284, upload-time = "2025-09-21T20:03:42.355Z" }, - { url = "https://files.pythonhosted.org/packages/db/e5/5e957ca747d43dbe4d9714358375c7546cb3cb533007b6813fc20fce37ad/coverage-7.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cce2109b6219f22ece99db7644b9622f54a4e915dad65660ec435e89a3ea7cc3", size = 244353, upload-time = "2025-09-21T20:03:44.218Z" }, - { url = "https://files.pythonhosted.org/packages/9a/45/540fc5cc92536a1b783b7ef99450bd55a4b3af234aae35a18a339973ce30/coverage-7.10.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:f3c887f96407cea3916294046fc7dab611c2552beadbed4ea901cbc6a40cc7a0", size = 244430, upload-time = "2025-09-21T20:03:46.065Z" }, - { url = "https://files.pythonhosted.org/packages/75/0b/8287b2e5b38c8fe15d7e3398849bb58d382aedc0864ea0fa1820e8630491/coverage-7.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:635adb9a4507c9fd2ed65f39693fa31c9a3ee3a8e6dc64df033e8fdf52a7003f", size = 245311, upload-time = "2025-09-21T20:03:48.19Z" }, - { url = "https://files.pythonhosted.org/packages/0c/1d/29724999984740f0c86d03e6420b942439bf5bd7f54d4382cae386a9d1e9/coverage-7.10.7-cp39-cp39-win32.whl", hash = "sha256:5a02d5a850e2979b0a014c412573953995174743a3f7fa4ea5a6e9a3c5617431", size = 220500, upload-time = "2025-09-21T20:03:50.024Z" }, - { url = "https://files.pythonhosted.org/packages/43/11/4b1e6b129943f905ca54c339f343877b55b365ae2558806c1be4f7476ed5/coverage-7.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:c134869d5ffe34547d14e174c866fd8fe2254918cc0a95e99052903bc1543e07", size = 221408, upload-time = "2025-09-21T20:03:51.803Z" }, - { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, -] - -[package.optional-dependencies] -toml = [ - { name = "tomli", marker = "python_full_version < '3.10'" }, -] - [[package]] name = "coverage" version = "7.12.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/89/26/4a96807b193b011588099c3b5c89fbb05294e5b90e71018e065465f34eb6/coverage-7.12.0.tar.gz", hash = "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c", size = 819341, upload-time = "2025-11-18T13:34:20.766Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/26/4a/0dc3de1c172d35abe512332cfdcc43211b6ebce629e4cc42e6cd25ed8f4d/coverage-7.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b", size = 217409, upload-time = "2025-11-18T13:31:53.122Z" }, @@ -770,7 +522,7 @@ wheels = [ [package.optional-dependencies] toml = [ - { name = "tomli", marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, + { name = "tomli", marker = "python_full_version <= '3.11'" }, ] [[package]] @@ -818,12 +570,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/9a/63d26da9011890a5b893e0c21845c0c0b43c634bf263af3bbca64be0db76/duckdb-1.4.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e552451054534970dc999e69ca5ae5c606458548c43fb66d772117760485096", size = 18477886, upload-time = "2025-11-12T13:17:39.136Z" }, { url = "https://files.pythonhosted.org/packages/23/35/b1fae4c5245697837f6f63e407fa81e7ccc7948f6ef2b124cd38736f4d1d/duckdb-1.4.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:128c97dab574a438d7c8d020670b21c68792267d88e65a7773667b556541fa9b", size = 20483292, upload-time = "2025-11-12T13:17:41.501Z" }, { url = "https://files.pythonhosted.org/packages/25/5e/6f5ebaabc12c6db62f471f86b5c9c8debd57f11aa1b2acbbcc4c68683238/duckdb-1.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:dfcc56a83420c0dec0b83e97a6b33addac1b7554b8828894f9d203955591218c", size = 12830520, upload-time = "2025-11-12T13:17:43.93Z" }, - { url = "https://files.pythonhosted.org/packages/22/57/255ab8b273b750d789f3c9712bd9e9aac95ba27fcc071a95504ce3163a73/duckdb-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4d757dae8c63eeb001517ce4cfba768f87f90628c5d22f230773c1fe0b430c5c", size = 28999897, upload-time = "2025-11-12T13:17:47.747Z" }, - { url = "https://files.pythonhosted.org/packages/94/ca/0beb017533202dcb601d885cb8970cdebbdec0db5819f3340c299a4aa351/duckdb-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4af73198e56ba3bc1b2a05eaaf93d162615c225c031685f2a20ef6b2798ed33", size = 15395881, upload-time = "2025-11-12T13:17:50.711Z" }, - { url = "https://files.pythonhosted.org/packages/99/3d/50d30db649a54fcf9ec20ee2971f746b523d4f3f6857c5ad0a7367baa141/duckdb-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9106c7292cff824e9497233bb16867ab3bca82885a11f1b533e7ecabf8073b34", size = 13727244, upload-time = "2025-11-12T13:17:53.3Z" }, - { url = "https://files.pythonhosted.org/packages/c5/e8/1c67e967b8e8b8c065b7dd734884ebecd10ac9540b79c82264174116d426/duckdb-1.4.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:449fa37cdefa85bf925681e551157f3cb6434ee85c8329d2f72d52e432e8810f", size = 18440469, upload-time = "2025-11-12T13:17:55.551Z" }, - { url = "https://files.pythonhosted.org/packages/6b/0d/f85e90f2134a0147af7bb0c3e54cc8a841cc913a2d7744106cbe5b89b643/duckdb-1.4.2-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5feb658ed728cfc42d6fe5ff4e2035faf438a3f10c875f3cfa39ef9e2a2c004", size = 20436355, upload-time = "2025-11-12T13:17:58.078Z" }, - { url = "https://files.pythonhosted.org/packages/7c/58/193850c3a2b5f677b439afafbe1f671dfe6aebe4864698cbd8557bc748e3/duckdb-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:c6d41fea4f9038663e6b9c325075a843fd105eaff0ec3d5fe31dfa9014114c3e", size = 12319492, upload-time = "2025-11-12T13:18:01.152Z" }, ] [[package]] @@ -831,39 +577,31 @@ name = "estimint" version = "1.4.0" source = { editable = "." } dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "xgboost", version = "2.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "xgboost", version = "3.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "xgboost" }, ] [package.optional-dependencies] all = [ { name = "appdirs" }, { name = "duckdb" }, - { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pyarrow", version = "21.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pyarrow", version = "24.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "matplotlib" }, + { name = "pyarrow" }, { name = "requests" }, - { name = "scikit-learn", version = "1.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "scikit-learn" }, ] dev = [ { name = "black" }, { name = "flake8" }, - { name = "isort", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "isort", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "isort" }, { name = "mypy" }, - { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pytest", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest" }, { name = "pytest-cov" }, ] download = [ @@ -875,14 +613,11 @@ scenarios = [ ] train = [ { name = "duckdb" }, - { name = "pyarrow", version = "21.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pyarrow", version = "24.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "scikit-learn", version = "1.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pyarrow" }, + { name = "scikit-learn" }, ] viz = [ - { name = "matplotlib", version = "3.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "matplotlib", version = "3.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "matplotlib" }, ] [package.metadata] @@ -988,91 +723,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/65/4bd2abfd4cb6e917b2626de5cbfc034dfc94b74dd95b8272d93f2ad66bed/flax-0.12.7-py3-none-any.whl", hash = "sha256:79d590793fa3a282ac36b4464f2ea9d1e69fe1d026c4618451b01731e8086e32", size = 525130, upload-time = "2026-04-22T06:07:10.254Z" }, ] -[[package]] -name = "fonttools" -version = "4.60.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/4b/42/97a13e47a1e51a5a7142475bbcf5107fe3a68fc34aef331c897d5fb98ad0/fonttools-4.60.1.tar.gz", hash = "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9", size = 3559823, upload-time = "2025-09-29T21:13:27.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/70/03e9d89a053caff6ae46053890eba8e4a5665a7c5638279ed4492e6d4b8b/fonttools-4.60.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28", size = 2810747, upload-time = "2025-09-29T21:10:59.653Z" }, - { url = "https://files.pythonhosted.org/packages/6f/41/449ad5aff9670ab0df0f61ee593906b67a36d7e0b4d0cd7fa41ac0325bf5/fonttools-4.60.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15", size = 2346909, upload-time = "2025-09-29T21:11:02.882Z" }, - { url = "https://files.pythonhosted.org/packages/9a/18/e5970aa96c8fad1cb19a9479cc3b7602c0c98d250fcdc06a5da994309c50/fonttools-4.60.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c", size = 4864572, upload-time = "2025-09-29T21:11:05.096Z" }, - { url = "https://files.pythonhosted.org/packages/ce/20/9b2b4051b6ec6689480787d506b5003f72648f50972a92d04527a456192c/fonttools-4.60.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea", size = 4794635, upload-time = "2025-09-29T21:11:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/10/52/c791f57347c1be98f8345e3dca4ac483eb97666dd7c47f3059aeffab8b59/fonttools-4.60.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652", size = 4843878, upload-time = "2025-09-29T21:11:10.893Z" }, - { url = "https://files.pythonhosted.org/packages/69/e9/35c24a8d01644cee8c090a22fad34d5b61d1e0a8ecbc9945ad785ebf2e9e/fonttools-4.60.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a", size = 4954555, upload-time = "2025-09-29T21:11:13.24Z" }, - { url = "https://files.pythonhosted.org/packages/f7/86/fb1e994971be4bdfe3a307de6373ef69a9df83fb66e3faa9c8114893d4cc/fonttools-4.60.1-cp310-cp310-win32.whl", hash = "sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce", size = 2232019, upload-time = "2025-09-29T21:11:15.73Z" }, - { url = "https://files.pythonhosted.org/packages/40/84/62a19e2bd56f0e9fb347486a5b26376bade4bf6bbba64dda2c103bd08c94/fonttools-4.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038", size = 2276803, upload-time = "2025-09-29T21:11:18.152Z" }, - { url = "https://files.pythonhosted.org/packages/ea/85/639aa9bface1537e0fb0f643690672dde0695a5bbbc90736bc571b0b1941/fonttools-4.60.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f", size = 2831872, upload-time = "2025-09-29T21:11:20.329Z" }, - { url = "https://files.pythonhosted.org/packages/6b/47/3c63158459c95093be9618794acb1067b3f4d30dcc5c3e8114b70e67a092/fonttools-4.60.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2", size = 2356990, upload-time = "2025-09-29T21:11:22.754Z" }, - { url = "https://files.pythonhosted.org/packages/94/dd/1934b537c86fcf99f9761823f1fc37a98fbd54568e8e613f29a90fed95a9/fonttools-4.60.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914", size = 5042189, upload-time = "2025-09-29T21:11:25.061Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d2/9f4e4c4374dd1daa8367784e1bd910f18ba886db1d6b825b12edf6db3edc/fonttools-4.60.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1", size = 4978683, upload-time = "2025-09-29T21:11:27.693Z" }, - { url = "https://files.pythonhosted.org/packages/cc/c4/0fb2dfd1ecbe9a07954cc13414713ed1eab17b1c0214ef07fc93df234a47/fonttools-4.60.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d", size = 5021372, upload-time = "2025-09-29T21:11:30.257Z" }, - { url = "https://files.pythonhosted.org/packages/0c/d5/495fc7ae2fab20223cc87179a8f50f40f9a6f821f271ba8301ae12bb580f/fonttools-4.60.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa", size = 5132562, upload-time = "2025-09-29T21:11:32.737Z" }, - { url = "https://files.pythonhosted.org/packages/bc/fa/021dab618526323c744e0206b3f5c8596a2e7ae9aa38db5948a131123e83/fonttools-4.60.1-cp311-cp311-win32.whl", hash = "sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258", size = 2230288, upload-time = "2025-09-29T21:11:35.015Z" }, - { url = "https://files.pythonhosted.org/packages/bb/78/0e1a6d22b427579ea5c8273e1c07def2f325b977faaf60bb7ddc01456cb1/fonttools-4.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf", size = 2278184, upload-time = "2025-09-29T21:11:37.434Z" }, - { url = "https://files.pythonhosted.org/packages/e3/f7/a10b101b7a6f8836a5adb47f2791f2075d044a6ca123f35985c42edc82d8/fonttools-4.60.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc", size = 2832953, upload-time = "2025-09-29T21:11:39.616Z" }, - { url = "https://files.pythonhosted.org/packages/ed/fe/7bd094b59c926acf2304d2151354ddbeb74b94812f3dc943c231db09cb41/fonttools-4.60.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877", size = 2352706, upload-time = "2025-09-29T21:11:41.826Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ca/4bb48a26ed95a1e7eba175535fe5805887682140ee0a0d10a88e1de84208/fonttools-4.60.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c", size = 4923716, upload-time = "2025-09-29T21:11:43.893Z" }, - { url = "https://files.pythonhosted.org/packages/b8/9f/2cb82999f686c1d1ddf06f6ae1a9117a880adbec113611cc9d22b2fdd465/fonttools-4.60.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401", size = 4968175, upload-time = "2025-09-29T21:11:46.439Z" }, - { url = "https://files.pythonhosted.org/packages/18/79/be569699e37d166b78e6218f2cde8c550204f2505038cdd83b42edc469b9/fonttools-4.60.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903", size = 4911031, upload-time = "2025-09-29T21:11:48.977Z" }, - { url = "https://files.pythonhosted.org/packages/cc/9f/89411cc116effaec5260ad519162f64f9c150e5522a27cbb05eb62d0c05b/fonttools-4.60.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed", size = 5062966, upload-time = "2025-09-29T21:11:54.344Z" }, - { url = "https://files.pythonhosted.org/packages/62/a1/f888221934b5731d46cb9991c7a71f30cb1f97c0ef5fcf37f8da8fce6c8e/fonttools-4.60.1-cp312-cp312-win32.whl", hash = "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6", size = 2218750, upload-time = "2025-09-29T21:11:56.601Z" }, - { url = "https://files.pythonhosted.org/packages/88/8f/a55b5550cd33cd1028601df41acd057d4be20efa5c958f417b0c0613924d/fonttools-4.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383", size = 2267026, upload-time = "2025-09-29T21:11:58.852Z" }, - { url = "https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb", size = 2825777, upload-time = "2025-09-29T21:12:01.22Z" }, - { url = "https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4", size = 2348080, upload-time = "2025-09-29T21:12:03.785Z" }, - { url = "https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c", size = 4903082, upload-time = "2025-09-29T21:12:06.382Z" }, - { url = "https://files.pythonhosted.org/packages/04/05/06b1455e4bc653fcb2117ac3ef5fa3a8a14919b93c60742d04440605d058/fonttools-4.60.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77", size = 4960125, upload-time = "2025-09-29T21:12:09.314Z" }, - { url = "https://files.pythonhosted.org/packages/8e/37/f3b840fcb2666f6cb97038793606bdd83488dca2d0b0fc542ccc20afa668/fonttools-4.60.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199", size = 4901454, upload-time = "2025-09-29T21:12:11.931Z" }, - { url = "https://files.pythonhosted.org/packages/fd/9e/eb76f77e82f8d4a46420aadff12cec6237751b0fb9ef1de373186dcffb5f/fonttools-4.60.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c", size = 5044495, upload-time = "2025-09-29T21:12:15.241Z" }, - { url = "https://files.pythonhosted.org/packages/f8/b3/cede8f8235d42ff7ae891bae8d619d02c8ac9fd0cfc450c5927a6200c70d/fonttools-4.60.1-cp313-cp313-win32.whl", hash = "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272", size = 2217028, upload-time = "2025-09-29T21:12:17.96Z" }, - { url = "https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl", hash = "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac", size = 2266200, upload-time = "2025-09-29T21:12:20.14Z" }, - { url = "https://files.pythonhosted.org/packages/9a/83/752ca11c1aa9a899b793a130f2e466b79ea0cf7279c8d79c178fc954a07b/fonttools-4.60.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3", size = 2822830, upload-time = "2025-09-29T21:12:24.406Z" }, - { url = "https://files.pythonhosted.org/packages/57/17/bbeab391100331950a96ce55cfbbff27d781c1b85ebafb4167eae50d9fe3/fonttools-4.60.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85", size = 2345524, upload-time = "2025-09-29T21:12:26.819Z" }, - { url = "https://files.pythonhosted.org/packages/3d/2e/d4831caa96d85a84dd0da1d9f90d81cec081f551e0ea216df684092c6c97/fonttools-4.60.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537", size = 4843490, upload-time = "2025-09-29T21:12:29.123Z" }, - { url = "https://files.pythonhosted.org/packages/49/13/5e2ea7c7a101b6fc3941be65307ef8df92cbbfa6ec4804032baf1893b434/fonttools-4.60.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003", size = 4944184, upload-time = "2025-09-29T21:12:31.414Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2b/cf9603551c525b73fc47c52ee0b82a891579a93d9651ed694e4e2cd08bb8/fonttools-4.60.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08", size = 4890218, upload-time = "2025-09-29T21:12:33.936Z" }, - { url = "https://files.pythonhosted.org/packages/fd/2f/933d2352422e25f2376aae74f79eaa882a50fb3bfef3c0d4f50501267101/fonttools-4.60.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99", size = 4999324, upload-time = "2025-09-29T21:12:36.637Z" }, - { url = "https://files.pythonhosted.org/packages/38/99/234594c0391221f66216bc2c886923513b3399a148defaccf81dc3be6560/fonttools-4.60.1-cp314-cp314-win32.whl", hash = "sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6", size = 2220861, upload-time = "2025-09-29T21:12:39.108Z" }, - { url = "https://files.pythonhosted.org/packages/3e/1d/edb5b23726dde50fc4068e1493e4fc7658eeefcaf75d4c5ffce067d07ae5/fonttools-4.60.1-cp314-cp314-win_amd64.whl", hash = "sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987", size = 2270934, upload-time = "2025-09-29T21:12:41.339Z" }, - { url = "https://files.pythonhosted.org/packages/fb/da/1392aaa2170adc7071fe7f9cfd181a5684a7afcde605aebddf1fb4d76df5/fonttools-4.60.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299", size = 2894340, upload-time = "2025-09-29T21:12:43.774Z" }, - { url = "https://files.pythonhosted.org/packages/bf/a7/3b9f16e010d536ce567058b931a20b590d8f3177b2eda09edd92e392375d/fonttools-4.60.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01", size = 2375073, upload-time = "2025-09-29T21:12:46.437Z" }, - { url = "https://files.pythonhosted.org/packages/9b/b5/e9bcf51980f98e59bb5bb7c382a63c6f6cac0eec5f67de6d8f2322382065/fonttools-4.60.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801", size = 4849758, upload-time = "2025-09-29T21:12:48.694Z" }, - { url = "https://files.pythonhosted.org/packages/e3/dc/1d2cf7d1cba82264b2f8385db3f5960e3d8ce756b4dc65b700d2c496f7e9/fonttools-4.60.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc", size = 5085598, upload-time = "2025-09-29T21:12:51.081Z" }, - { url = "https://files.pythonhosted.org/packages/5d/4d/279e28ba87fb20e0c69baf72b60bbf1c4d873af1476806a7b5f2b7fac1ff/fonttools-4.60.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc", size = 4957603, upload-time = "2025-09-29T21:12:53.423Z" }, - { url = "https://files.pythonhosted.org/packages/78/d4/ff19976305e0c05aa3340c805475abb00224c954d3c65e82c0a69633d55d/fonttools-4.60.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed", size = 4974184, upload-time = "2025-09-29T21:12:55.962Z" }, - { url = "https://files.pythonhosted.org/packages/63/22/8553ff6166f5cd21cfaa115aaacaa0dc73b91c079a8cfd54a482cbc0f4f5/fonttools-4.60.1-cp314-cp314t-win32.whl", hash = "sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259", size = 2282241, upload-time = "2025-09-29T21:12:58.179Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cb/fa7b4d148e11d5a72761a22e595344133e83a9507a4c231df972e657579b/fonttools-4.60.1-cp314-cp314t-win_amd64.whl", hash = "sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c", size = 2345760, upload-time = "2025-09-29T21:13:00.375Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7f/1c9a6cc6e7374ab59bbe91cb3b8a65ce0907c59f8f35368bb3bf941bd458/fonttools-4.60.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:122e1a8ada290423c493491d002f622b1992b1ab0b488c68e31c413390dc7eb2", size = 2816178, upload-time = "2025-09-29T21:13:02.915Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ac/acb4dcf1932566c0b57b5261f93a8b97cb3ebae08d07aff1288e7c9d7faa/fonttools-4.60.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a140761c4ff63d0cb9256ac752f230460ee225ccef4ad8f68affc723c88e2036", size = 2349175, upload-time = "2025-09-29T21:13:05.432Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ac/0b2f8d62c857adfe96551d56abbbc3d2eda2e4715a2e91c5eb7815bb38e1/fonttools-4.60.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eae96373e4b7c9e45d099d7a523444e3554360927225c1cdae221a58a45b856", size = 4840452, upload-time = "2025-09-29T21:13:08.679Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e1/b2e2ae805f263507e050f1ebfc2fb3654124161f3bea466a1b2a4485c705/fonttools-4.60.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:596ecaca36367027d525b3b426d8a8208169d09edcf8c7506aceb3a38bfb55c7", size = 4774040, upload-time = "2025-09-29T21:13:11.424Z" }, - { url = "https://files.pythonhosted.org/packages/9d/91/05949ba6f757014f343632b142543576eb100aeb261c036b86e7d1fc50f0/fonttools-4.60.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ee06fc57512144d8b0445194c2da9f190f61ad51e230f14836286470c99f854", size = 4823746, upload-time = "2025-09-29T21:13:14.08Z" }, - { url = "https://files.pythonhosted.org/packages/1b/cf/db9a1bd8d835dc17f09104f83b9d8c078d7bebbaaa9bd41378bf10f025de/fonttools-4.60.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b42d86938e8dda1cd9a1a87a6d82f1818eaf933348429653559a458d027446da", size = 4934001, upload-time = "2025-09-29T21:13:16.435Z" }, - { url = "https://files.pythonhosted.org/packages/87/4a/c58503524f7e6c73eb33b944f27535460e1050a58c99bd5b441242fcca86/fonttools-4.60.1-cp39-cp39-win32.whl", hash = "sha256:8b4eb332f9501cb1cd3d4d099374a1e1306783ff95489a1026bde9eb02ccc34a", size = 1499091, upload-time = "2025-09-29T21:13:19.072Z" }, - { url = "https://files.pythonhosted.org/packages/69/8f/3394936411aec5f26a1fdf8d7fdc1da7c276e0c627cd71b7b266b2431681/fonttools-4.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:7473a8ed9ed09aeaa191301244a5a9dbe46fe0bf54f9d6cd21d83044c3321217", size = 1543835, upload-time = "2025-09-29T21:13:21.606Z" }, - { url = "https://files.pythonhosted.org/packages/c7/93/0dd45cd283c32dea1545151d8c3637b4b8c53cdb3a625aeb2885b184d74d/fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb", size = 1143175, upload-time = "2025-09-29T21:13:24.134Z" }, -] - [[package]] name = "fonttools" version = "4.61.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/29/f3/91bba2721fb173fc68e09d15b6ccf3ad4f83d127fbff579be7e5984888a6/fonttools-4.61.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dc25a4a9c1225653e4431a9413d0381b1c62317b0f543bdcec24e1991f612f33", size = 2850151, upload-time = "2025-11-28T17:04:14.214Z" }, @@ -1243,96 +897,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, ] -[[package]] -name = "importlib-metadata" -version = "8.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, -] - -[[package]] -name = "importlib-resources" -version = "6.5.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, -] - -[[package]] -name = "iniconfig" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, -] - [[package]] name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] -[[package]] -name = "isort" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1e/82/fa43935523efdfcce6abbae9da7f372b627b27142c3419fcf13bf5b0c397/isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481", size = 824325, upload-time = "2025-10-01T16:26:45.027Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/cc/9b681a170efab4868a032631dea1e8446d8ec718a7f657b94d49d1a12643/isort-6.1.0-py3-none-any.whl", hash = "sha256:58d8927ecce74e5087aef019f778d4081a3b6c98f15a80ba35782ca8a2097784", size = 94329, upload-time = "2025-10-01T16:26:43.291Z" }, -] - [[package]] name = "isort" version = "7.0.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/63/53/4f3c058e3bace40282876f9b553343376ee687f3c35a525dc79dbd450f88/isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187", size = 805049, upload-time = "2025-10-11T13:30:59.107Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1", size = 94672, upload-time = "2025-10-11T13:30:57.665Z" }, @@ -1409,126 +986,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, ] -[[package]] -name = "kiwisolver" -version = "1.4.7" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/85/4d/2255e1c76304cbd60b48cee302b66d1dde4468dc5b1160e4b7cb43778f2a/kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60", size = 97286, upload-time = "2024-09-04T09:39:44.302Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/14/fc943dd65268a96347472b4fbe5dcc2f6f55034516f80576cd0dd3a8930f/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6", size = 122440, upload-time = "2024-09-04T09:03:44.9Z" }, - { url = "https://files.pythonhosted.org/packages/1e/46/e68fed66236b69dd02fcdb506218c05ac0e39745d696d22709498896875d/kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17", size = 65758, upload-time = "2024-09-04T09:03:46.582Z" }, - { url = "https://files.pythonhosted.org/packages/ef/fa/65de49c85838681fc9cb05de2a68067a683717321e01ddafb5b8024286f0/kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9", size = 64311, upload-time = "2024-09-04T09:03:47.973Z" }, - { url = "https://files.pythonhosted.org/packages/42/9c/cc8d90f6ef550f65443bad5872ffa68f3dee36de4974768628bea7c14979/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9", size = 1637109, upload-time = "2024-09-04T09:03:49.281Z" }, - { url = "https://files.pythonhosted.org/packages/55/91/0a57ce324caf2ff5403edab71c508dd8f648094b18cfbb4c8cc0fde4a6ac/kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c", size = 1617814, upload-time = "2024-09-04T09:03:51.444Z" }, - { url = "https://files.pythonhosted.org/packages/12/5d/c36140313f2510e20207708adf36ae4919416d697ee0236b0ddfb6fd1050/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599", size = 1400881, upload-time = "2024-09-04T09:03:53.357Z" }, - { url = "https://files.pythonhosted.org/packages/56/d0/786e524f9ed648324a466ca8df86298780ef2b29c25313d9a4f16992d3cf/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05", size = 1512972, upload-time = "2024-09-04T09:03:55.082Z" }, - { url = "https://files.pythonhosted.org/packages/67/5a/77851f2f201e6141d63c10a0708e996a1363efaf9e1609ad0441b343763b/kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407", size = 1444787, upload-time = "2024-09-04T09:03:56.588Z" }, - { url = "https://files.pythonhosted.org/packages/06/5f/1f5eaab84355885e224a6fc8d73089e8713dc7e91c121f00b9a1c58a2195/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278", size = 2199212, upload-time = "2024-09-04T09:03:58.557Z" }, - { url = "https://files.pythonhosted.org/packages/b5/28/9152a3bfe976a0ae21d445415defc9d1cd8614b2910b7614b30b27a47270/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5", size = 2346399, upload-time = "2024-09-04T09:04:00.178Z" }, - { url = "https://files.pythonhosted.org/packages/26/f6/453d1904c52ac3b400f4d5e240ac5fec25263716723e44be65f4d7149d13/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad", size = 2308688, upload-time = "2024-09-04T09:04:02.216Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9a/d4968499441b9ae187e81745e3277a8b4d7c60840a52dc9d535a7909fac3/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895", size = 2445493, upload-time = "2024-09-04T09:04:04.571Z" }, - { url = "https://files.pythonhosted.org/packages/07/c9/032267192e7828520dacb64dfdb1d74f292765f179e467c1cba97687f17d/kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3", size = 2262191, upload-time = "2024-09-04T09:04:05.969Z" }, - { url = "https://files.pythonhosted.org/packages/6c/ad/db0aedb638a58b2951da46ddaeecf204be8b4f5454df020d850c7fa8dca8/kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc", size = 46644, upload-time = "2024-09-04T09:04:07.408Z" }, - { url = "https://files.pythonhosted.org/packages/12/ca/d0f7b7ffbb0be1e7c2258b53554efec1fd652921f10d7d85045aff93ab61/kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c", size = 55877, upload-time = "2024-09-04T09:04:08.869Z" }, - { url = "https://files.pythonhosted.org/packages/97/6c/cfcc128672f47a3e3c0d918ecb67830600078b025bfc32d858f2e2d5c6a4/kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a", size = 48347, upload-time = "2024-09-04T09:04:10.106Z" }, - { url = "https://files.pythonhosted.org/packages/e9/44/77429fa0a58f941d6e1c58da9efe08597d2e86bf2b2cce6626834f49d07b/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54", size = 122442, upload-time = "2024-09-04T09:04:11.432Z" }, - { url = "https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95", size = 65762, upload-time = "2024-09-04T09:04:12.468Z" }, - { url = "https://files.pythonhosted.org/packages/f4/98/fe010f15dc7230f45bc4cf367b012d651367fd203caaa992fd1f5963560e/kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935", size = 64319, upload-time = "2024-09-04T09:04:13.635Z" }, - { url = "https://files.pythonhosted.org/packages/8b/1b/b5d618f4e58c0675654c1e5051bcf42c776703edb21c02b8c74135541f60/kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb", size = 1334260, upload-time = "2024-09-04T09:04:14.878Z" }, - { url = "https://files.pythonhosted.org/packages/b8/01/946852b13057a162a8c32c4c8d2e9ed79f0bb5d86569a40c0b5fb103e373/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02", size = 1426589, upload-time = "2024-09-04T09:04:16.514Z" }, - { url = "https://files.pythonhosted.org/packages/70/d1/c9f96df26b459e15cf8a965304e6e6f4eb291e0f7a9460b4ad97b047561e/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51", size = 1541080, upload-time = "2024-09-04T09:04:18.322Z" }, - { url = "https://files.pythonhosted.org/packages/d3/73/2686990eb8b02d05f3de759d6a23a4ee7d491e659007dd4c075fede4b5d0/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052", size = 1470049, upload-time = "2024-09-04T09:04:20.266Z" }, - { url = "https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18", size = 1426376, upload-time = "2024-09-04T09:04:22.419Z" }, - { url = "https://files.pythonhosted.org/packages/05/83/2857317d04ea46dc5d115f0df7e676997bbd968ced8e2bd6f7f19cfc8d7f/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545", size = 2222231, upload-time = "2024-09-04T09:04:24.526Z" }, - { url = "https://files.pythonhosted.org/packages/0d/b5/866f86f5897cd4ab6d25d22e403404766a123f138bd6a02ecb2cdde52c18/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b", size = 2368634, upload-time = "2024-09-04T09:04:25.899Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ee/73de8385403faba55f782a41260210528fe3273d0cddcf6d51648202d6d0/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36", size = 2329024, upload-time = "2024-09-04T09:04:28.523Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e7/cd101d8cd2cdfaa42dc06c433df17c8303d31129c9fdd16c0ea37672af91/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3", size = 2468484, upload-time = "2024-09-04T09:04:30.547Z" }, - { url = "https://files.pythonhosted.org/packages/e1/72/84f09d45a10bc57a40bb58b81b99d8f22b58b2040c912b7eb97ebf625bf2/kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523", size = 2284078, upload-time = "2024-09-04T09:04:33.218Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d4/71828f32b956612dc36efd7be1788980cb1e66bfb3706e6dec9acad9b4f9/kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d", size = 46645, upload-time = "2024-09-04T09:04:34.371Z" }, - { url = "https://files.pythonhosted.org/packages/a1/65/d43e9a20aabcf2e798ad1aff6c143ae3a42cf506754bcb6a7ed8259c8425/kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b", size = 56022, upload-time = "2024-09-04T09:04:35.786Z" }, - { url = "https://files.pythonhosted.org/packages/35/b3/9f75a2e06f1b4ca00b2b192bc2b739334127d27f1d0625627ff8479302ba/kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376", size = 48536, upload-time = "2024-09-04T09:04:37.525Z" }, - { url = "https://files.pythonhosted.org/packages/97/9c/0a11c714cf8b6ef91001c8212c4ef207f772dd84540104952c45c1f0a249/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2", size = 121808, upload-time = "2024-09-04T09:04:38.637Z" }, - { url = "https://files.pythonhosted.org/packages/f2/d8/0fe8c5f5d35878ddd135f44f2af0e4e1d379e1c7b0716f97cdcb88d4fd27/kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a", size = 65531, upload-time = "2024-09-04T09:04:39.694Z" }, - { url = "https://files.pythonhosted.org/packages/80/c5/57fa58276dfdfa612241d640a64ca2f76adc6ffcebdbd135b4ef60095098/kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee", size = 63894, upload-time = "2024-09-04T09:04:41.6Z" }, - { url = "https://files.pythonhosted.org/packages/8b/e9/26d3edd4c4ad1c5b891d8747a4f81b1b0aba9fb9721de6600a4adc09773b/kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640", size = 1369296, upload-time = "2024-09-04T09:04:42.886Z" }, - { url = "https://files.pythonhosted.org/packages/b6/67/3f4850b5e6cffb75ec40577ddf54f7b82b15269cc5097ff2e968ee32ea7d/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f", size = 1461450, upload-time = "2024-09-04T09:04:46.284Z" }, - { url = "https://files.pythonhosted.org/packages/52/be/86cbb9c9a315e98a8dc6b1d23c43cffd91d97d49318854f9c37b0e41cd68/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483", size = 1579168, upload-time = "2024-09-04T09:04:47.91Z" }, - { url = "https://files.pythonhosted.org/packages/0f/00/65061acf64bd5fd34c1f4ae53f20b43b0a017a541f242a60b135b9d1e301/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258", size = 1507308, upload-time = "2024-09-04T09:04:49.465Z" }, - { url = "https://files.pythonhosted.org/packages/21/e4/c0b6746fd2eb62fe702118b3ca0cb384ce95e1261cfada58ff693aeec08a/kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e", size = 1464186, upload-time = "2024-09-04T09:04:50.949Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0f/529d0a9fffb4d514f2782c829b0b4b371f7f441d61aa55f1de1c614c4ef3/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107", size = 2247877, upload-time = "2024-09-04T09:04:52.388Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e1/66603ad779258843036d45adcbe1af0d1a889a07af4635f8b4ec7dccda35/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948", size = 2404204, upload-time = "2024-09-04T09:04:54.385Z" }, - { url = "https://files.pythonhosted.org/packages/8d/61/de5fb1ca7ad1f9ab7970e340a5b833d735df24689047de6ae71ab9d8d0e7/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038", size = 2352461, upload-time = "2024-09-04T09:04:56.307Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d2/0edc00a852e369827f7e05fd008275f550353f1f9bcd55db9363d779fc63/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383", size = 2501358, upload-time = "2024-09-04T09:04:57.922Z" }, - { url = "https://files.pythonhosted.org/packages/84/15/adc15a483506aec6986c01fb7f237c3aec4d9ed4ac10b756e98a76835933/kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520", size = 2314119, upload-time = "2024-09-04T09:04:59.332Z" }, - { url = "https://files.pythonhosted.org/packages/36/08/3a5bb2c53c89660863a5aa1ee236912269f2af8762af04a2e11df851d7b2/kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b", size = 46367, upload-time = "2024-09-04T09:05:00.804Z" }, - { url = "https://files.pythonhosted.org/packages/19/93/c05f0a6d825c643779fc3c70876bff1ac221f0e31e6f701f0e9578690d70/kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb", size = 55884, upload-time = "2024-09-04T09:05:01.924Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f9/3828d8f21b6de4279f0667fb50a9f5215e6fe57d5ec0d61905914f5b6099/kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a", size = 48528, upload-time = "2024-09-04T09:05:02.983Z" }, - { url = "https://files.pythonhosted.org/packages/c4/06/7da99b04259b0f18b557a4effd1b9c901a747f7fdd84cf834ccf520cb0b2/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e", size = 121913, upload-time = "2024-09-04T09:05:04.072Z" }, - { url = "https://files.pythonhosted.org/packages/97/f5/b8a370d1aa593c17882af0a6f6755aaecd643640c0ed72dcfd2eafc388b9/kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6", size = 65627, upload-time = "2024-09-04T09:05:05.119Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fc/6c0374f7503522539e2d4d1b497f5ebad3f8ed07ab51aed2af988dd0fb65/kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750", size = 63888, upload-time = "2024-09-04T09:05:06.191Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3e/0b7172793d0f41cae5c923492da89a2ffcd1adf764c16159ca047463ebd3/kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d", size = 1369145, upload-time = "2024-09-04T09:05:07.919Z" }, - { url = "https://files.pythonhosted.org/packages/77/92/47d050d6f6aced2d634258123f2688fbfef8ded3c5baf2c79d94d91f1f58/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379", size = 1461448, upload-time = "2024-09-04T09:05:10.01Z" }, - { url = "https://files.pythonhosted.org/packages/9c/1b/8f80b18e20b3b294546a1adb41701e79ae21915f4175f311a90d042301cf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c", size = 1578750, upload-time = "2024-09-04T09:05:11.598Z" }, - { url = "https://files.pythonhosted.org/packages/a4/fe/fe8e72f3be0a844f257cadd72689c0848c6d5c51bc1d60429e2d14ad776e/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34", size = 1507175, upload-time = "2024-09-04T09:05:13.22Z" }, - { url = "https://files.pythonhosted.org/packages/39/fa/cdc0b6105d90eadc3bee525fecc9179e2b41e1ce0293caaf49cb631a6aaf/kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1", size = 1463963, upload-time = "2024-09-04T09:05:15.925Z" }, - { url = "https://files.pythonhosted.org/packages/6e/5c/0c03c4e542720c6177d4f408e56d1c8315899db72d46261a4e15b8b33a41/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f", size = 2248220, upload-time = "2024-09-04T09:05:17.434Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ee/55ef86d5a574f4e767df7da3a3a7ff4954c996e12d4fbe9c408170cd7dcc/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b", size = 2404463, upload-time = "2024-09-04T09:05:18.997Z" }, - { url = "https://files.pythonhosted.org/packages/0f/6d/73ad36170b4bff4825dc588acf4f3e6319cb97cd1fb3eb04d9faa6b6f212/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27", size = 2352842, upload-time = "2024-09-04T09:05:21.299Z" }, - { url = "https://files.pythonhosted.org/packages/0b/16/fa531ff9199d3b6473bb4d0f47416cdb08d556c03b8bc1cccf04e756b56d/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a", size = 2501635, upload-time = "2024-09-04T09:05:23.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/7e/aa9422e78419db0cbe75fb86d8e72b433818f2e62e2e394992d23d23a583/kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee", size = 2314556, upload-time = "2024-09-04T09:05:25.907Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b2/15f7f556df0a6e5b3772a1e076a9d9f6c538ce5f05bd590eca8106508e06/kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07", size = 46364, upload-time = "2024-09-04T09:05:27.184Z" }, - { url = "https://files.pythonhosted.org/packages/0b/db/32e897e43a330eee8e4770bfd2737a9584b23e33587a0812b8e20aac38f7/kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76", size = 55887, upload-time = "2024-09-04T09:05:28.372Z" }, - { url = "https://files.pythonhosted.org/packages/c8/a4/df2bdca5270ca85fd25253049eb6708d4127be2ed0e5c2650217450b59e9/kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650", size = 48530, upload-time = "2024-09-04T09:05:30.225Z" }, - { url = "https://files.pythonhosted.org/packages/11/88/37ea0ea64512997b13d69772db8dcdc3bfca5442cda3a5e4bb943652ee3e/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd", size = 122449, upload-time = "2024-09-04T09:05:55.311Z" }, - { url = "https://files.pythonhosted.org/packages/4e/45/5a5c46078362cb3882dcacad687c503089263c017ca1241e0483857791eb/kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583", size = 65757, upload-time = "2024-09-04T09:05:56.906Z" }, - { url = "https://files.pythonhosted.org/packages/8a/be/a6ae58978772f685d48dd2e84460937761c53c4bbd84e42b0336473d9775/kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417", size = 64312, upload-time = "2024-09-04T09:05:58.384Z" }, - { url = "https://files.pythonhosted.org/packages/f4/04/18ef6f452d311e1e1eb180c9bf5589187fa1f042db877e6fe443ef10099c/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904", size = 1626966, upload-time = "2024-09-04T09:05:59.855Z" }, - { url = "https://files.pythonhosted.org/packages/21/b1/40655f6c3fa11ce740e8a964fa8e4c0479c87d6a7944b95af799c7a55dfe/kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a", size = 1607044, upload-time = "2024-09-04T09:06:02.16Z" }, - { url = "https://files.pythonhosted.org/packages/fd/93/af67dbcfb9b3323bbd2c2db1385a7139d8f77630e4a37bb945b57188eb2d/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8", size = 1391879, upload-time = "2024-09-04T09:06:03.908Z" }, - { url = "https://files.pythonhosted.org/packages/40/6f/d60770ef98e77b365d96061d090c0cd9e23418121c55fff188fa4bdf0b54/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2", size = 1504751, upload-time = "2024-09-04T09:06:05.58Z" }, - { url = "https://files.pythonhosted.org/packages/fa/3a/5f38667d313e983c432f3fcd86932177519ed8790c724e07d77d1de0188a/kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88", size = 1436990, upload-time = "2024-09-04T09:06:08.126Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/1520301a47326e6a6043b502647e42892be33b3f051e9791cc8bb43f1a32/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde", size = 2191122, upload-time = "2024-09-04T09:06:10.345Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c4/eb52da300c166239a2233f1f9c4a1b767dfab98fae27681bfb7ea4873cb6/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c", size = 2338126, upload-time = "2024-09-04T09:06:12.321Z" }, - { url = "https://files.pythonhosted.org/packages/1a/cb/42b92fd5eadd708dd9107c089e817945500685f3437ce1fd387efebc6d6e/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2", size = 2298313, upload-time = "2024-09-04T09:06:14.562Z" }, - { url = "https://files.pythonhosted.org/packages/4f/eb/be25aa791fe5fc75a8b1e0c965e00f942496bc04635c9aae8035f6b76dcd/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb", size = 2437784, upload-time = "2024-09-04T09:06:16.767Z" }, - { url = "https://files.pythonhosted.org/packages/c5/22/30a66be7f3368d76ff95689e1c2e28d382383952964ab15330a15d8bfd03/kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327", size = 2253988, upload-time = "2024-09-04T09:06:18.705Z" }, - { url = "https://files.pythonhosted.org/packages/35/d3/5f2ecb94b5211c8a04f218a76133cc8d6d153b0f9cd0b45fad79907f0689/kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644", size = 46980, upload-time = "2024-09-04T09:06:20.106Z" }, - { url = "https://files.pythonhosted.org/packages/ef/17/cd10d020578764ea91740204edc6b3236ed8106228a46f568d716b11feb2/kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4", size = 55847, upload-time = "2024-09-04T09:06:21.407Z" }, - { url = "https://files.pythonhosted.org/packages/91/84/32232502020bd78d1d12be7afde15811c64a95ed1f606c10456db4e4c3ac/kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f", size = 48494, upload-time = "2024-09-04T09:06:22.648Z" }, - { url = "https://files.pythonhosted.org/packages/ac/59/741b79775d67ab67ced9bb38552da688c0305c16e7ee24bba7a2be253fb7/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643", size = 59491, upload-time = "2024-09-04T09:06:24.188Z" }, - { url = "https://files.pythonhosted.org/packages/58/cc/fb239294c29a5656e99e3527f7369b174dd9cc7c3ef2dea7cb3c54a8737b/kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706", size = 57648, upload-time = "2024-09-04T09:06:25.559Z" }, - { url = "https://files.pythonhosted.org/packages/3b/ef/2f009ac1f7aab9f81efb2d837301d255279d618d27b6015780115ac64bdd/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6", size = 84257, upload-time = "2024-09-04T09:06:27.038Z" }, - { url = "https://files.pythonhosted.org/packages/81/e1/c64f50987f85b68b1c52b464bb5bf73e71570c0f7782d626d1eb283ad620/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2", size = 80906, upload-time = "2024-09-04T09:06:28.48Z" }, - { url = "https://files.pythonhosted.org/packages/fd/71/1687c5c0a0be2cee39a5c9c389e546f9c6e215e46b691d00d9f646892083/kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4", size = 79951, upload-time = "2024-09-04T09:06:29.966Z" }, - { url = "https://files.pythonhosted.org/packages/ea/8b/d7497df4a1cae9367adf21665dd1f896c2a7aeb8769ad77b662c5e2bcce7/kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a", size = 55715, upload-time = "2024-09-04T09:06:31.489Z" }, - { url = "https://files.pythonhosted.org/packages/d5/df/ce37d9b26f07ab90880923c94d12a6ff4d27447096b4c849bfc4339ccfdf/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39", size = 58666, upload-time = "2024-09-04T09:06:43.756Z" }, - { url = "https://files.pythonhosted.org/packages/b0/d3/e4b04f43bc629ac8e186b77b2b1a251cdfa5b7610fa189dc0db622672ce6/kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e", size = 57088, upload-time = "2024-09-04T09:06:45.406Z" }, - { url = "https://files.pythonhosted.org/packages/30/1c/752df58e2d339e670a535514d2db4fe8c842ce459776b8080fbe08ebb98e/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608", size = 84321, upload-time = "2024-09-04T09:06:47.557Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f8/fe6484e847bc6e238ec9f9828089fb2c0bb53f2f5f3a79351fde5b565e4f/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674", size = 80776, upload-time = "2024-09-04T09:06:49.235Z" }, - { url = "https://files.pythonhosted.org/packages/9b/57/d7163c0379f250ef763aba85330a19feefb5ce6cb541ade853aaba881524/kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225", size = 79984, upload-time = "2024-09-04T09:06:51.336Z" }, - { url = "https://files.pythonhosted.org/packages/8c/95/4a103776c265d13b3d2cd24fb0494d4e04ea435a8ef97e1b2c026d43250b/kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0", size = 55811, upload-time = "2024-09-04T09:06:53.078Z" }, -] - [[package]] name = "kiwisolver" version = "1.4.9" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, @@ -1704,16 +1165,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/82/a8/4aaead9a06c795a318282aebf7d3e3e578fa889ff396e1b640c3be4c7806/librt-0.6.3-cp314-cp314t-win32.whl", hash = "sha256:f33462b19503ba68d80dac8a1354402675849259fb3ebf53b67de86421735a3a", size = 19465, upload-time = "2025-11-29T14:01:41.77Z" }, { url = "https://files.pythonhosted.org/packages/3a/61/b7e6a02746c1731670c19ba07d86da90b1ae45d29e405c0b5615abf97cde/librt-0.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:04f8ce401d4f6380cfc42af0f4e67342bf34c820dae01343f58f472dbac75dcf", size = 21042, upload-time = "2025-11-29T14:01:42.865Z" }, { url = "https://files.pythonhosted.org/packages/0e/3d/72cc9ec90bb80b5b1a65f0bb74a0f540195837baaf3b98c7fa4a7aa9718e/librt-0.6.3-cp314-cp314t-win_arm64.whl", hash = "sha256:afb39550205cc5e5c935762c6bf6a2bb34f7d21a68eadb25e2db7bf3593fecc0", size = 20246, upload-time = "2025-11-29T14:01:44.13Z" }, - { url = "https://files.pythonhosted.org/packages/d0/85/63b34f02f56b86574bb6d1ed29415346332a1edea2cd12b29fb0863456cb/librt-0.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09262cb2445b6f15d09141af20b95bb7030c6f13b00e876ad8fdd1a9045d6aa5", size = 27438, upload-time = "2025-11-29T14:01:45.101Z" }, - { url = "https://files.pythonhosted.org/packages/57/cc/d2952a97b5e19c0a88f04b161d1c4b8336ad093a8fecd49801258b3cc816/librt-0.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57705e8eec76c5b77130d729c0f70190a9773366c555c5457c51eace80afd873", size = 27783, upload-time = "2025-11-29T14:01:46.398Z" }, - { url = "https://files.pythonhosted.org/packages/09/38/007124092f9345a273b27b070e894afa66a737b576f1f7c37354dd4ffe24/librt-0.6.3-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3ac2a7835434b31def8ed5355dd9b895bbf41642d61967522646d1d8b9681106", size = 81403, upload-time = "2025-11-29T14:01:47.659Z" }, - { url = "https://files.pythonhosted.org/packages/89/ca/079722b2b518bc6c38e3ba7ab07f2f0e5c6d4905d7f34ee138f862a69853/librt-0.6.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71f0a5918aebbea1e7db2179a8fe87e8a8732340d9e8b8107401fb407eda446e", size = 85678, upload-time = "2025-11-29T14:01:48.638Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7a/dcba5bd2f71d3815ea3886929f218c259665b9f2f7115163eed2ccb50599/librt-0.6.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa346e202e6e1ebc01fe1c69509cffe486425884b96cb9ce155c99da1ecbe0e9", size = 85655, upload-time = "2025-11-29T14:01:49.894Z" }, - { url = "https://files.pythonhosted.org/packages/7a/47/5bfa3816b58e6105d1ea1a165af73ae6560b4acb80ce3304793ac9a36ec1/librt-0.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:92267f865c7bbd12327a0d394666948b9bf4b51308b52947c0cc453bfa812f5d", size = 88093, upload-time = "2025-11-29T14:01:50.902Z" }, - { url = "https://files.pythonhosted.org/packages/76/33/ac5c01cfc68b208423a00451640fad6744f974a9c9e8a62d89e9a5e47159/librt-0.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:86605d5bac340beb030cbc35859325982a79047ebdfba1e553719c7126a2389d", size = 86386, upload-time = "2025-11-29T14:01:51.933Z" }, - { url = "https://files.pythonhosted.org/packages/c7/4d/9460e0b6d53cabeb78016e7e4e7d70dcd11fe90ef37c704856bd8a2ff533/librt-0.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:98e4bbecbef8d2a60ecf731d735602feee5ac0b32117dbbc765e28b054bac912", size = 89064, upload-time = "2025-11-29T14:01:53.249Z" }, - { url = "https://files.pythonhosted.org/packages/20/f3/cb8410cbd34718fe7e11b006bacc8093d3f758c7d771c95613caebe7a9fc/librt-0.6.3-cp39-cp39-win32.whl", hash = "sha256:3caa0634c02d5ff0b2ae4a28052e0d8c5f20d497623dc13f629bd4a9e2a6efad", size = 19867, upload-time = "2025-11-29T14:01:54.201Z" }, - { url = "https://files.pythonhosted.org/packages/14/7e/521c046b3bc9316c408d159bc4f2c4be607280b3646416b953bdd4efda6f/librt-0.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:b47395091e7e0ece1e6ebac9b98bf0c9084d1e3d3b2739aa566be7e56e3f7bf2", size = 21408, upload-time = "2025-11-29T14:01:55.126Z" }, ] [[package]] @@ -1743,99 +1194,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, ] -[[package]] -name = "matplotlib" -version = "3.9.4" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "contourpy", version = "1.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "cycler", marker = "python_full_version < '3.10'" }, - { name = "fonttools", version = "4.60.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "importlib-resources", marker = "python_full_version < '3.10'" }, - { name = "kiwisolver", version = "1.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pyparsing", marker = "python_full_version < '3.10'" }, - { name = "python-dateutil", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/17/1747b4154034befd0ed33b52538f5eb7752d05bb51c5e2a31470c3bc7d52/matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3", size = 36106529, upload-time = "2024-12-13T05:56:34.184Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/94/27d2e2c30d54b56c7b764acc1874a909e34d1965a427fc7092bb6a588b63/matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50", size = 7885089, upload-time = "2024-12-13T05:54:24.224Z" }, - { url = "https://files.pythonhosted.org/packages/c6/25/828273307e40a68eb8e9df832b6b2aaad075864fdc1de4b1b81e40b09e48/matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff", size = 7770600, upload-time = "2024-12-13T05:54:27.214Z" }, - { url = "https://files.pythonhosted.org/packages/f2/65/f841a422ec994da5123368d76b126acf4fc02ea7459b6e37c4891b555b83/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26", size = 8200138, upload-time = "2024-12-13T05:54:29.497Z" }, - { url = "https://files.pythonhosted.org/packages/07/06/272aca07a38804d93b6050813de41ca7ab0e29ba7a9dd098e12037c919a9/matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50", size = 8312711, upload-time = "2024-12-13T05:54:34.396Z" }, - { url = "https://files.pythonhosted.org/packages/98/37/f13e23b233c526b7e27ad61be0a771894a079e0f7494a10d8d81557e0e9a/matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5", size = 9090622, upload-time = "2024-12-13T05:54:36.808Z" }, - { url = "https://files.pythonhosted.org/packages/4f/8c/b1f5bd2bd70e60f93b1b54c4d5ba7a992312021d0ddddf572f9a1a6d9348/matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d", size = 7828211, upload-time = "2024-12-13T05:54:40.596Z" }, - { url = "https://files.pythonhosted.org/packages/74/4b/65be7959a8fa118a3929b49a842de5b78bb55475236fcf64f3e308ff74a0/matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c", size = 7894430, upload-time = "2024-12-13T05:54:44.049Z" }, - { url = "https://files.pythonhosted.org/packages/e9/18/80f70d91896e0a517b4a051c3fd540daa131630fd75e02e250365353b253/matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099", size = 7780045, upload-time = "2024-12-13T05:54:46.414Z" }, - { url = "https://files.pythonhosted.org/packages/a2/73/ccb381026e3238c5c25c3609ba4157b2d1a617ec98d65a8b4ee4e1e74d02/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249", size = 8209906, upload-time = "2024-12-13T05:54:49.459Z" }, - { url = "https://files.pythonhosted.org/packages/ab/33/1648da77b74741c89f5ea95cbf42a291b4b364f2660b316318811404ed97/matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423", size = 8322873, upload-time = "2024-12-13T05:54:53.066Z" }, - { url = "https://files.pythonhosted.org/packages/57/d3/8447ba78bc6593c9044c372d1609f8ea10fb1e071e7a9e0747bea74fc16c/matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e", size = 9099566, upload-time = "2024-12-13T05:54:55.522Z" }, - { url = "https://files.pythonhosted.org/packages/23/e1/4f0e237bf349c02ff9d1b6e7109f1a17f745263809b9714a8576dc17752b/matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3", size = 7838065, upload-time = "2024-12-13T05:54:58.337Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2b/c918bf6c19d6445d1cefe3d2e42cb740fb997e14ab19d4daeb6a7ab8a157/matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70", size = 7891131, upload-time = "2024-12-13T05:55:02.837Z" }, - { url = "https://files.pythonhosted.org/packages/c1/e5/b4e8fc601ca302afeeabf45f30e706a445c7979a180e3a978b78b2b681a4/matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483", size = 7776365, upload-time = "2024-12-13T05:55:05.158Z" }, - { url = "https://files.pythonhosted.org/packages/99/06/b991886c506506476e5d83625c5970c656a491b9f80161458fed94597808/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f", size = 8200707, upload-time = "2024-12-13T05:55:09.48Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e2/556b627498cb27e61026f2d1ba86a78ad1b836fef0996bef5440e8bc9559/matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00", size = 8313761, upload-time = "2024-12-13T05:55:12.95Z" }, - { url = "https://files.pythonhosted.org/packages/58/ff/165af33ec766ff818306ea88e91f9f60d2a6ed543be1eb122a98acbf3b0d/matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0", size = 9095284, upload-time = "2024-12-13T05:55:16.199Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8b/3d0c7a002db3b1ed702731c2a9a06d78d035f1f2fb0fb936a8e43cc1e9f4/matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b", size = 7841160, upload-time = "2024-12-13T05:55:19.991Z" }, - { url = "https://files.pythonhosted.org/packages/49/b1/999f89a7556d101b23a2f0b54f1b6e140d73f56804da1398f2f0bc0924bc/matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6", size = 7891499, upload-time = "2024-12-13T05:55:22.142Z" }, - { url = "https://files.pythonhosted.org/packages/87/7b/06a32b13a684977653396a1bfcd34d4e7539c5d55c8cbfaa8ae04d47e4a9/matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45", size = 7776802, upload-time = "2024-12-13T05:55:25.947Z" }, - { url = "https://files.pythonhosted.org/packages/65/87/ac498451aff739e515891bbb92e566f3c7ef31891aaa878402a71f9b0910/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858", size = 8200802, upload-time = "2024-12-13T05:55:28.461Z" }, - { url = "https://files.pythonhosted.org/packages/f8/6b/9eb761c00e1cb838f6c92e5f25dcda3f56a87a52f6cb8fdfa561e6cf6a13/matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64", size = 8313880, upload-time = "2024-12-13T05:55:30.965Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a2/c8eaa600e2085eec7e38cbbcc58a30fc78f8224939d31d3152bdafc01fd1/matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df", size = 9094637, upload-time = "2024-12-13T05:55:33.701Z" }, - { url = "https://files.pythonhosted.org/packages/71/1f/c6e1daea55b7bfeb3d84c6cb1abc449f6a02b181e7e2a5e4db34c3afb793/matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799", size = 7841311, upload-time = "2024-12-13T05:55:36.737Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3a/2757d3f7d388b14dd48f5a83bea65b6d69f000e86b8f28f74d86e0d375bd/matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb", size = 7919989, upload-time = "2024-12-13T05:55:39.024Z" }, - { url = "https://files.pythonhosted.org/packages/24/28/f5077c79a4f521589a37fe1062d6a6ea3534e068213f7357e7cfffc2e17a/matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a", size = 7809417, upload-time = "2024-12-13T05:55:42.412Z" }, - { url = "https://files.pythonhosted.org/packages/36/c8/c523fd2963156692916a8eb7d4069084cf729359f7955cf09075deddfeaf/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c", size = 8226258, upload-time = "2024-12-13T05:55:47.259Z" }, - { url = "https://files.pythonhosted.org/packages/f6/88/499bf4b8fa9349b6f5c0cf4cead0ebe5da9d67769129f1b5651e5ac51fbc/matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764", size = 8335849, upload-time = "2024-12-13T05:55:49.763Z" }, - { url = "https://files.pythonhosted.org/packages/b8/9f/20a4156b9726188646a030774ee337d5ff695a965be45ce4dbcb9312c170/matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041", size = 9102152, upload-time = "2024-12-13T05:55:51.997Z" }, - { url = "https://files.pythonhosted.org/packages/10/11/237f9c3a4e8d810b1759b67ff2da7c32c04f9c80aa475e7beb36ed43a8fb/matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965", size = 7896987, upload-time = "2024-12-13T05:55:55.941Z" }, - { url = "https://files.pythonhosted.org/packages/56/eb/501b465c9fef28f158e414ea3a417913dc2ac748564c7ed41535f23445b4/matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c", size = 7885919, upload-time = "2024-12-13T05:55:59.66Z" }, - { url = "https://files.pythonhosted.org/packages/da/36/236fbd868b6c91309a5206bd90c3f881f4f44b2d997cd1d6239ef652f878/matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7", size = 7771486, upload-time = "2024-12-13T05:56:04.264Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4b/105caf2d54d5ed11d9f4335398f5103001a03515f2126c936a752ccf1461/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e", size = 8201838, upload-time = "2024-12-13T05:56:06.792Z" }, - { url = "https://files.pythonhosted.org/packages/5d/a7/bb01188fb4013d34d274caf44a2f8091255b0497438e8b6c0a7c1710c692/matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c", size = 8314492, upload-time = "2024-12-13T05:56:09.964Z" }, - { url = "https://files.pythonhosted.org/packages/33/19/02e1a37f7141fc605b193e927d0a9cdf9dc124a20b9e68793f4ffea19695/matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb", size = 9092500, upload-time = "2024-12-13T05:56:13.55Z" }, - { url = "https://files.pythonhosted.org/packages/57/68/c2feb4667adbf882ffa4b3e0ac9967f848980d9f8b5bebd86644aa67ce6a/matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac", size = 7822962, upload-time = "2024-12-13T05:56:16.358Z" }, - { url = "https://files.pythonhosted.org/packages/0c/22/2ef6a364cd3f565442b0b055e0599744f1e4314ec7326cdaaa48a4d864d7/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c", size = 7877995, upload-time = "2024-12-13T05:56:18.805Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/2737456e566e9f4d94ae76b8aa0d953d9acb847714f9a7ad80184474f5be/matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca", size = 7769300, upload-time = "2024-12-13T05:56:21.315Z" }, - { url = "https://files.pythonhosted.org/packages/b2/1f/e709c6ec7b5321e6568769baa288c7178e60a93a9da9e682b39450da0e29/matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db", size = 8313423, upload-time = "2024-12-13T05:56:26.719Z" }, - { url = "https://files.pythonhosted.org/packages/5e/b6/5a1f868782cd13f053a679984e222007ecff654a9bfbac6b27a65f4eeb05/matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865", size = 7854624, upload-time = "2024-12-13T05:56:29.359Z" }, -] - [[package]] name = "matplotlib" version = "3.10.7" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] dependencies = [ - { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "cycler", marker = "python_full_version >= '3.10'" }, - { name = "fonttools", version = "4.61.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "kiwisolver", version = "1.4.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pillow", version = "12.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pyparsing", marker = "python_full_version >= '3.10'" }, - { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" } wheels = [ @@ -1973,10 +1348,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/2b/a826ba18d2179a56e144aef69e57fb2ab7c464ef0b2111940ee8a3a223a2/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d2ffd05a2575b1519dc928c0b93c06339eb67173ff53acb00724502cda231cf", size = 5366332, upload-time = "2025-11-17T22:32:21.193Z" }, { url = "https://files.pythonhosted.org/packages/84/44/f4d18446eacb20ea11e82f133ea8f86e2bf2891785b67d9da8d0ab0ef525/ml_dtypes-0.5.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4381fe2f2452a2d7589689693d3162e876b3ddb0a832cde7a414f8e1adf7eab1", size = 236612, upload-time = "2025-11-17T22:32:22.579Z" }, { url = "https://files.pythonhosted.org/packages/ad/3f/3d42e9a78fe5edf792a83c074b13b9b770092a4fbf3462872f4303135f09/ml_dtypes-0.5.4-cp314-cp314t-win_arm64.whl", hash = "sha256:11942cbf2cf92157db91e5022633c0d9474d4dfd813a909383bd23ce828a4b7d", size = 168825, upload-time = "2025-11-17T22:32:23.766Z" }, - { url = "https://files.pythonhosted.org/packages/af/a1/4f20f56ba9c21c7ee78505dc9f782017ffc9ae9ff261179e28da710e3900/ml_dtypes-0.5.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d81fdb088defa30eb37bf390bb7dde35d3a83ec112ac8e33d75ab28cc29dd8b0", size = 676875, upload-time = "2025-11-17T22:32:24.954Z" }, - { url = "https://files.pythonhosted.org/packages/71/85/846992d38a1f3ca561ac5d05f7bd8654695f2a3c202fcdc4f9e53951f211/ml_dtypes-0.5.4-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88c982aac7cb1cbe8cbb4e7f253072b1df872701fcaf48d84ffbb433b6568f24", size = 5046025, upload-time = "2025-11-17T22:32:26.767Z" }, - { url = "https://files.pythonhosted.org/packages/22/08/f9aaafa02f46b1d81bf3b7a158b1b9df24df6e4b8ec0082a26eaf16ce229/ml_dtypes-0.5.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9b61c19040397970d18d7737375cffd83b1f36a11dd4ad19f83a016f736c3ef", size = 5018614, upload-time = "2025-11-17T22:32:28.231Z" }, - { url = "https://files.pythonhosted.org/packages/63/8a/bc7f9c8c358214dba25f70077dbc85aac85f92d255a6f20dd3ae64026a43/ml_dtypes-0.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:3d277bf3637f2a62176f4575512e9ff9ef51d00e39626d9fe4a161992f355af2", size = 210704, upload-time = "2025-11-17T22:32:29.696Z" }, ] [[package]] @@ -2095,12 +1466,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/9f/c39e89a3e319c1d9c734dedec1183b2cc3aefbab066ec611619002abb932/mypy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f", size = 13592639, upload-time = "2025-11-28T15:48:08.55Z" }, { url = "https://files.pythonhosted.org/packages/97/6d/ffaf5f01f5e284d9033de1267e6c1b8f3783f2cf784465378a86122e884b/mypy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835", size = 13799132, upload-time = "2025-11-28T15:47:06.032Z" }, { url = "https://files.pythonhosted.org/packages/fe/b0/c33921e73aaa0106224e5a34822411bea38046188eb781637f5a5b07e269/mypy-1.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1", size = 10269832, upload-time = "2025-11-28T15:47:29.392Z" }, - { url = "https://files.pythonhosted.org/packages/b4/59/a7748ef43446163a93159d82bb270c6c4f3d94c1fcbdd2a29a7e439e74d7/mypy-1.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495", size = 13094255, upload-time = "2025-11-28T15:47:14.282Z" }, - { url = "https://files.pythonhosted.org/packages/f5/0b/92ebf5abc83f559a35dcba3bd9227726b04b04178f1e521f38e647b930eb/mypy-1.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299", size = 12161414, upload-time = "2025-11-28T15:45:03.302Z" }, - { url = "https://files.pythonhosted.org/packages/aa/03/19412f0a786722055a52c01b4c5d71e5b5443a89f6bbcdd445408240e217/mypy-1.19.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c", size = 12756782, upload-time = "2025-11-28T15:46:49.522Z" }, - { url = "https://files.pythonhosted.org/packages/cb/85/395d53c9098b251414b0448cdadcd3277523ff36f5abda6d26ff945dbdb3/mypy-1.19.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5", size = 13503492, upload-time = "2025-11-28T15:48:57.339Z" }, - { url = "https://files.pythonhosted.org/packages/dd/33/1ab1113e3778617ae7aba66b4b537f90512bd279ff65b6c984fb91fbb2d3/mypy-1.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c", size = 13787703, upload-time = "2025-11-28T15:48:41.286Z" }, - { url = "https://files.pythonhosted.org/packages/4f/2d/8b0821b3e0d538de1ad96c86502256c7326274d5cb74e0b373efaada273f/mypy-1.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6", size = 10049225, upload-time = "2025-11-28T15:45:55.089Z" }, { url = "https://files.pythonhosted.org/packages/09/0e/fe228ed5aeab470c6f4eb82481837fadb642a5aa95cc8215fd2214822c10/mypy-1.19.0-py3-none-any.whl", hash = "sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9", size = 2469714, upload-time = "2025-11-28T15:45:33.22Z" }, ] @@ -2122,67 +1487,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] -[[package]] -name = "numpy" -version = "2.0.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015, upload-time = "2024-08-26T20:19:40.945Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245, upload-time = "2024-08-26T20:04:14.625Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540, upload-time = "2024-08-26T20:04:36.784Z" }, - { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623, upload-time = "2024-08-26T20:04:46.491Z" }, - { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774, upload-time = "2024-08-26T20:04:58.173Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081, upload-time = "2024-08-26T20:05:19.098Z" }, - { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451, upload-time = "2024-08-26T20:05:47.479Z" }, - { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572, upload-time = "2024-08-26T20:06:17.137Z" }, - { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722, upload-time = "2024-08-26T20:06:39.16Z" }, - { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170, upload-time = "2024-08-26T20:06:50.361Z" }, - { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558, upload-time = "2024-08-26T20:07:13.881Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137, upload-time = "2024-08-26T20:07:45.345Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552, upload-time = "2024-08-26T20:08:06.666Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957, upload-time = "2024-08-26T20:08:15.83Z" }, - { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573, upload-time = "2024-08-26T20:08:27.185Z" }, - { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330, upload-time = "2024-08-26T20:08:48.058Z" }, - { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895, upload-time = "2024-08-26T20:09:16.536Z" }, - { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253, upload-time = "2024-08-26T20:09:46.263Z" }, - { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074, upload-time = "2024-08-26T20:10:08.483Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640, upload-time = "2024-08-26T20:10:19.732Z" }, - { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230, upload-time = "2024-08-26T20:10:43.413Z" }, - { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803, upload-time = "2024-08-26T20:11:13.916Z" }, - { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835, upload-time = "2024-08-26T20:11:34.779Z" }, - { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499, upload-time = "2024-08-26T20:11:43.902Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497, upload-time = "2024-08-26T20:11:55.09Z" }, - { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158, upload-time = "2024-08-26T20:12:14.95Z" }, - { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173, upload-time = "2024-08-26T20:12:44.049Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174, upload-time = "2024-08-26T20:13:13.634Z" }, - { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701, upload-time = "2024-08-26T20:13:34.851Z" }, - { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313, upload-time = "2024-08-26T20:13:45.653Z" }, - { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179, upload-time = "2024-08-26T20:14:08.786Z" }, - { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942, upload-time = "2024-08-26T20:14:40.108Z" }, - { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512, upload-time = "2024-08-26T20:15:00.985Z" }, - { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976, upload-time = "2024-08-26T20:15:10.876Z" }, - { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494, upload-time = "2024-08-26T20:15:22.055Z" }, - { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596, upload-time = "2024-08-26T20:15:42.452Z" }, - { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099, upload-time = "2024-08-26T20:16:11.048Z" }, - { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823, upload-time = "2024-08-26T20:16:40.171Z" }, - { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424, upload-time = "2024-08-26T20:17:02.604Z" }, - { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809, upload-time = "2024-08-26T20:17:13.553Z" }, - { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314, upload-time = "2024-08-26T20:17:36.72Z" }, - { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288, upload-time = "2024-08-26T20:18:07.732Z" }, - { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793, upload-time = "2024-08-26T20:18:19.125Z" }, - { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885, upload-time = "2024-08-26T20:18:47.237Z" }, - { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784, upload-time = "2024-08-26T20:19:11.19Z" }, -] - [[package]] name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version < '3.11'", ] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ @@ -2476,12 +1786,10 @@ version = "2.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", - "python_full_version < '3.10'", + "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, { name = "python-dateutil", marker = "python_full_version < '3.12'" }, { name = "pytz", marker = "python_full_version < '3.12'" }, @@ -2536,13 +1844,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, - { url = "https://files.pythonhosted.org/packages/56/b4/52eeb530a99e2a4c55ffcd352772b599ed4473a0f892d127f4147cf0f88e/pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2", size = 11567720, upload-time = "2025-09-29T23:33:06.209Z" }, - { url = "https://files.pythonhosted.org/packages/48/4a/2d8b67632a021bced649ba940455ed441ca854e57d6e7658a6024587b083/pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8", size = 10810302, upload-time = "2025-09-29T23:33:35.846Z" }, - { url = "https://files.pythonhosted.org/packages/13/e6/d2465010ee0569a245c975dc6967b801887068bc893e908239b1f4b6c1ac/pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff", size = 12154874, upload-time = "2025-09-29T23:33:49.939Z" }, - { url = "https://files.pythonhosted.org/packages/1f/18/aae8c0aa69a386a3255940e9317f793808ea79d0a525a97a903366bb2569/pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29", size = 12790141, upload-time = "2025-09-29T23:34:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/f7/26/617f98de789de00c2a444fbe6301bb19e66556ac78cff933d2c98f62f2b4/pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73", size = 13208697, upload-time = "2025-09-29T23:34:21.835Z" }, - { url = "https://files.pythonhosted.org/packages/b9/fb/25709afa4552042bd0e15717c75e9b4a2294c3dc4f7e6ea50f03c5136600/pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9", size = 13879233, upload-time = "2025-09-29T23:34:35.079Z" }, - { url = "https://files.pythonhosted.org/packages/98/af/7be05277859a7bc399da8ba68b88c96b27b48740b6cf49688899c6eb4176/pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa", size = 11359119, upload-time = "2025-09-29T23:34:46.339Z" }, ] [[package]] @@ -2625,139 +1926,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] -[[package]] -name = "pillow" -version = "11.3.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, - { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, - { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, - { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, - { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, - { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090, upload-time = "2025-07-01T09:13:53.915Z" }, - { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988, upload-time = "2025-07-01T09:13:55.699Z" }, - { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899, upload-time = "2025-07-01T09:13:57.497Z" }, - { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, - { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, - { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, - { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, - { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, - { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, - { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, - { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, - { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8e/9c089f01677d1264ab8648352dcb7773f37da6ad002542760c80107da816/pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", size = 5316478, upload-time = "2025-07-01T09:15:52.209Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a9/5749930caf674695867eb56a581e78eb5f524b7583ff10b01b6e5048acb3/pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", size = 4686522, upload-time = "2025-07-01T09:15:54.162Z" }, - { url = "https://files.pythonhosted.org/packages/43/46/0b85b763eb292b691030795f9f6bb6fcaf8948c39413c81696a01c3577f7/pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", size = 5853376, upload-time = "2025-07-03T13:11:01.066Z" }, - { url = "https://files.pythonhosted.org/packages/5e/c6/1a230ec0067243cbd60bc2dad5dc3ab46a8a41e21c15f5c9b52b26873069/pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", size = 7626020, upload-time = "2025-07-03T13:11:06.479Z" }, - { url = "https://files.pythonhosted.org/packages/63/dd/f296c27ffba447bfad76c6a0c44c1ea97a90cb9472b9304c94a732e8dbfb/pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", size = 5956732, upload-time = "2025-07-01T09:15:56.111Z" }, - { url = "https://files.pythonhosted.org/packages/a5/a0/98a3630f0b57f77bae67716562513d3032ae70414fcaf02750279c389a9e/pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", size = 6624404, upload-time = "2025-07-01T09:15:58.245Z" }, - { url = "https://files.pythonhosted.org/packages/de/e6/83dfba5646a290edd9a21964da07674409e410579c341fc5b8f7abd81620/pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", size = 6067760, upload-time = "2025-07-01T09:16:00.003Z" }, - { url = "https://files.pythonhosted.org/packages/bc/41/15ab268fe6ee9a2bc7391e2bbb20a98d3974304ab1a406a992dcb297a370/pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", size = 6700534, upload-time = "2025-07-01T09:16:02.29Z" }, - { url = "https://files.pythonhosted.org/packages/64/79/6d4f638b288300bed727ff29f2a3cb63db054b33518a95f27724915e3fbc/pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", size = 6277091, upload-time = "2025-07-01T09:16:04.4Z" }, - { url = "https://files.pythonhosted.org/packages/46/05/4106422f45a05716fd34ed21763f8ec182e8ea00af6e9cb05b93a247361a/pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", size = 6986091, upload-time = "2025-07-01T09:16:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/63/c6/287fd55c2c12761d0591549d48885187579b7c257bef0c6660755b0b59ae/pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", size = 2422632, upload-time = "2025-07-01T09:16:08.142Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, - { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, - { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, - { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596, upload-time = "2025-07-01T09:16:18.07Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, - { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, - { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, - { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, - { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, -] - [[package]] name = "pillow" version = "12.0.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b", size = 5289809, upload-time = "2025-10-15T18:21:27.791Z" }, @@ -2852,35 +2024,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, ] -[[package]] -name = "platformdirs" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, -] - [[package]] name = "platformdirs" version = "4.5.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, @@ -2947,76 +2094,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, ] -[[package]] -name = "pyarrow" -version = "21.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload-time = "2025-07-18T00:57:31.761Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/d9/110de31880016e2afc52d8580b397dbe47615defbf09ca8cf55f56c62165/pyarrow-21.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e563271e2c5ff4d4a4cbeb2c83d5cf0d4938b891518e676025f7268c6fe5fe26", size = 31196837, upload-time = "2025-07-18T00:54:34.755Z" }, - { url = "https://files.pythonhosted.org/packages/df/5f/c1c1997613abf24fceb087e79432d24c19bc6f7259cab57c2c8e5e545fab/pyarrow-21.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fee33b0ca46f4c85443d6c450357101e47d53e6c3f008d658c27a2d020d44c79", size = 32659470, upload-time = "2025-07-18T00:54:38.329Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ed/b1589a777816ee33ba123ba1e4f8f02243a844fed0deec97bde9fb21a5cf/pyarrow-21.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7be45519b830f7c24b21d630a31d48bcebfd5d4d7f9d3bdb49da9cdf6d764edb", size = 41055619, upload-time = "2025-07-18T00:54:42.172Z" }, - { url = "https://files.pythonhosted.org/packages/44/28/b6672962639e85dc0ac36f71ab3a8f5f38e01b51343d7aa372a6b56fa3f3/pyarrow-21.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:26bfd95f6bff443ceae63c65dc7e048670b7e98bc892210acba7e4995d3d4b51", size = 42733488, upload-time = "2025-07-18T00:54:47.132Z" }, - { url = "https://files.pythonhosted.org/packages/f8/cc/de02c3614874b9089c94eac093f90ca5dfa6d5afe45de3ba847fd950fdf1/pyarrow-21.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd04ec08f7f8bd113c55868bd3fc442a9db67c27af098c5f814a3091e71cc61a", size = 43329159, upload-time = "2025-07-18T00:54:51.686Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3e/99473332ac40278f196e105ce30b79ab8affab12f6194802f2593d6b0be2/pyarrow-21.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9b0b14b49ac10654332a805aedfc0147fb3469cbf8ea951b3d040dab12372594", size = 45050567, upload-time = "2025-07-18T00:54:56.679Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f5/c372ef60593d713e8bfbb7e0c743501605f0ad00719146dc075faf11172b/pyarrow-21.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:9d9f8bcb4c3be7738add259738abdeddc363de1b80e3310e04067aa1ca596634", size = 26217959, upload-time = "2025-07-18T00:55:00.482Z" }, - { url = "https://files.pythonhosted.org/packages/94/dc/80564a3071a57c20b7c32575e4a0120e8a330ef487c319b122942d665960/pyarrow-21.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c077f48aab61738c237802836fc3844f85409a46015635198761b0d6a688f87b", size = 31243234, upload-time = "2025-07-18T00:55:03.812Z" }, - { url = "https://files.pythonhosted.org/packages/ea/cc/3b51cb2db26fe535d14f74cab4c79b191ed9a8cd4cbba45e2379b5ca2746/pyarrow-21.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:689f448066781856237eca8d1975b98cace19b8dd2ab6145bf49475478bcaa10", size = 32714370, upload-time = "2025-07-18T00:55:07.495Z" }, - { url = "https://files.pythonhosted.org/packages/24/11/a4431f36d5ad7d83b87146f515c063e4d07ef0b7240876ddb885e6b44f2e/pyarrow-21.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:479ee41399fcddc46159a551705b89c05f11e8b8cb8e968f7fec64f62d91985e", size = 41135424, upload-time = "2025-07-18T00:55:11.461Z" }, - { url = "https://files.pythonhosted.org/packages/74/dc/035d54638fc5d2971cbf1e987ccd45f1091c83bcf747281cf6cc25e72c88/pyarrow-21.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:40ebfcb54a4f11bcde86bc586cbd0272bac0d516cfa539c799c2453768477569", size = 42823810, upload-time = "2025-07-18T00:55:16.301Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/89fced102448a9e3e0d4dded1f37fa3ce4700f02cdb8665457fcc8015f5b/pyarrow-21.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8d58d8497814274d3d20214fbb24abcad2f7e351474357d552a8d53bce70c70e", size = 43391538, upload-time = "2025-07-18T00:55:23.82Z" }, - { url = "https://files.pythonhosted.org/packages/fb/bb/ea7f1bd08978d39debd3b23611c293f64a642557e8141c80635d501e6d53/pyarrow-21.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:585e7224f21124dd57836b1530ac8f2df2afc43c861d7bf3d58a4870c42ae36c", size = 45120056, upload-time = "2025-07-18T00:55:28.231Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0b/77ea0600009842b30ceebc3337639a7380cd946061b620ac1a2f3cb541e2/pyarrow-21.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:555ca6935b2cbca2c0e932bedd853e9bc523098c39636de9ad4693b5b1df86d6", size = 26220568, upload-time = "2025-07-18T00:55:32.122Z" }, - { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305, upload-time = "2025-07-18T00:55:35.373Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264, upload-time = "2025-07-18T00:55:39.303Z" }, - { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099, upload-time = "2025-07-18T00:55:42.889Z" }, - { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529, upload-time = "2025-07-18T00:55:47.069Z" }, - { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883, upload-time = "2025-07-18T00:55:53.069Z" }, - { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802, upload-time = "2025-07-18T00:55:57.714Z" }, - { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175, upload-time = "2025-07-18T00:56:01.364Z" }, - { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload-time = "2025-07-18T00:56:04.42Z" }, - { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload-time = "2025-07-18T00:56:07.505Z" }, - { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload-time = "2025-07-18T00:56:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload-time = "2025-07-18T00:56:15.569Z" }, - { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload-time = "2025-07-18T00:56:19.531Z" }, - { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload-time = "2025-07-18T00:56:23.347Z" }, - { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload-time = "2025-07-18T00:56:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload-time = "2025-07-18T00:56:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload-time = "2025-07-18T00:56:33.935Z" }, - { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload-time = "2025-07-18T00:56:37.528Z" }, - { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload-time = "2025-07-18T00:56:41.483Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload-time = "2025-07-18T00:56:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload-time = "2025-07-18T00:56:52.568Z" }, - { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload-time = "2025-07-18T00:56:56.379Z" }, - { url = "https://files.pythonhosted.org/packages/3e/cc/ce4939f4b316457a083dc5718b3982801e8c33f921b3c98e7a93b7c7491f/pyarrow-21.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a7f6524e3747e35f80744537c78e7302cd41deee8baa668d56d55f77d9c464b3", size = 31211248, upload-time = "2025-07-18T00:56:59.7Z" }, - { url = "https://files.pythonhosted.org/packages/1f/c2/7a860931420d73985e2f340f06516b21740c15b28d24a0e99a900bb27d2b/pyarrow-21.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:203003786c9fd253ebcafa44b03c06983c9c8d06c3145e37f1b76a1f317aeae1", size = 32676896, upload-time = "2025-07-18T00:57:03.884Z" }, - { url = "https://files.pythonhosted.org/packages/68/a8/197f989b9a75e59b4ca0db6a13c56f19a0ad8a298c68da9cc28145e0bb97/pyarrow-21.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b4d97e297741796fead24867a8dabf86c87e4584ccc03167e4a811f50fdf74d", size = 41067862, upload-time = "2025-07-18T00:57:07.587Z" }, - { url = "https://files.pythonhosted.org/packages/fa/82/6ecfa89487b35aa21accb014b64e0a6b814cc860d5e3170287bf5135c7d8/pyarrow-21.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:898afce396b80fdda05e3086b4256f8677c671f7b1d27a6976fa011d3fd0a86e", size = 42747508, upload-time = "2025-07-18T00:57:13.917Z" }, - { url = "https://files.pythonhosted.org/packages/3b/b7/ba252f399bbf3addc731e8643c05532cf32e74cebb5e32f8f7409bc243cf/pyarrow-21.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:067c66ca29aaedae08218569a114e413b26e742171f526e828e1064fcdec13f4", size = 43345293, upload-time = "2025-07-18T00:57:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0a/a20819795bd702b9486f536a8eeb70a6aa64046fce32071c19ec8230dbaa/pyarrow-21.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0c4e75d13eb76295a49e0ea056eb18dbd87d81450bfeb8afa19a7e5a75ae2ad7", size = 45060670, upload-time = "2025-07-18T00:57:24.477Z" }, - { url = "https://files.pythonhosted.org/packages/10/15/6b30e77872012bbfe8265d42a01d5b3c17ef0ac0f2fae531ad91b6a6c02e/pyarrow-21.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdc4c17afda4dab2a9c0b79148a43a7f4e1094916b3e18d8975bfd6d6d52241f", size = 26227521, upload-time = "2025-07-18T00:57:29.119Z" }, -] - [[package]] name = "pyarrow" version = "24.0.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", hash = "sha256:85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83", size = 1180261, upload-time = "2026-04-21T10:51:25.837Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a5/bf/a34fee1d624152124fa8355c42f34195ad5fe5233ce5bb87946432047d52/pyarrow-24.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7c2b98645d576a0b9616892ead22b64a83a5f043c5e2ca15ebcefcb5b70c80cb", size = 35076681, upload-time = "2026-04-21T08:51:46.845Z" }, @@ -3106,52 +2187,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, ] -[[package]] -name = "pytest" -version = "8.4.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.10'" }, - { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "pluggy", marker = "python_full_version < '3.10'" }, - { name = "pygments", marker = "python_full_version < '3.10'" }, - { name = "tomli", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, -] - [[package]] name = "pytest" version = "9.0.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, - { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pluggy", marker = "python_full_version >= '3.10'" }, - { name = "pygments", marker = "python_full_version >= '3.10'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", size = 1564125, upload-time = "2025-11-12T13:05:09.333Z" } wheels = [ @@ -3163,11 +2210,9 @@ name = "pytest-cov" version = "7.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.10'" }, - { name = "coverage", version = "7.12.0", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.10'" }, + { name = "coverage", extra = ["toml"] }, { name = "pluggy" }, - { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pytest", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } wheels = [ @@ -3266,15 +2311,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, - { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, - { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, - { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, - { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, - { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, - { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, - { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, - { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, ] [[package]] @@ -3305,77 +2341,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, ] -[[package]] -name = "scikit-learn" -version = "1.6.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "joblib", marker = "python_full_version < '3.10'" }, - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "threadpoolctl", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/a5/4ae3b3a0755f7b35a280ac90b28817d1f380318973cff14075ab41ef50d9/scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e", size = 7068312, upload-time = "2025-01-10T08:07:55.348Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/3a/f4597eb41049110b21ebcbb0bcb43e4035017545daa5eedcfeb45c08b9c5/scikit_learn-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e", size = 12067702, upload-time = "2025-01-10T08:05:56.515Z" }, - { url = "https://files.pythonhosted.org/packages/37/19/0423e5e1fd1c6ec5be2352ba05a537a473c1677f8188b9306097d684b327/scikit_learn-1.6.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0c8d036eb937dbb568c6242fa598d551d88fb4399c0344d95c001980ec1c7d36", size = 11112765, upload-time = "2025-01-10T08:06:00.272Z" }, - { url = "https://files.pythonhosted.org/packages/70/95/d5cb2297a835b0f5fc9a77042b0a2d029866379091ab8b3f52cc62277808/scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8634c4bd21a2a813e0a7e3900464e6d593162a29dd35d25bdf0103b3fce60ed5", size = 12643991, upload-time = "2025-01-10T08:06:04.813Z" }, - { url = "https://files.pythonhosted.org/packages/b7/91/ab3c697188f224d658969f678be86b0968ccc52774c8ab4a86a07be13c25/scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:775da975a471c4f6f467725dff0ced5c7ac7bda5e9316b260225b48475279a1b", size = 13497182, upload-time = "2025-01-10T08:06:08.42Z" }, - { url = "https://files.pythonhosted.org/packages/17/04/d5d556b6c88886c092cc989433b2bab62488e0f0dafe616a1d5c9cb0efb1/scikit_learn-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:8a600c31592bd7dab31e1c61b9bbd6dea1b3433e67d264d17ce1017dbdce8002", size = 11125517, upload-time = "2025-01-10T08:06:12.783Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2a/e291c29670795406a824567d1dfc91db7b699799a002fdaa452bceea8f6e/scikit_learn-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72abc587c75234935e97d09aa4913a82f7b03ee0b74111dcc2881cba3c5a7b33", size = 12102620, upload-time = "2025-01-10T08:06:16.675Z" }, - { url = "https://files.pythonhosted.org/packages/25/92/ee1d7a00bb6b8c55755d4984fd82608603a3cc59959245068ce32e7fb808/scikit_learn-1.6.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b3b00cdc8f1317b5f33191df1386c0befd16625f49d979fe77a8d44cae82410d", size = 11116234, upload-time = "2025-01-10T08:06:21.83Z" }, - { url = "https://files.pythonhosted.org/packages/30/cd/ed4399485ef364bb25f388ab438e3724e60dc218c547a407b6e90ccccaef/scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc4765af3386811c3ca21638f63b9cf5ecf66261cc4815c1db3f1e7dc7b79db2", size = 12592155, upload-time = "2025-01-10T08:06:27.309Z" }, - { url = "https://files.pythonhosted.org/packages/a8/f3/62fc9a5a659bb58a03cdd7e258956a5824bdc9b4bb3c5d932f55880be569/scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25fc636bdaf1cc2f4a124a116312d837148b5e10872147bdaf4887926b8c03d8", size = 13497069, upload-time = "2025-01-10T08:06:32.515Z" }, - { url = "https://files.pythonhosted.org/packages/a1/a6/c5b78606743a1f28eae8f11973de6613a5ee87366796583fb74c67d54939/scikit_learn-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:fa909b1a36e000a03c382aade0bd2063fd5680ff8b8e501660c0f59f021a6415", size = 11139809, upload-time = "2025-01-10T08:06:35.514Z" }, - { url = "https://files.pythonhosted.org/packages/0a/18/c797c9b8c10380d05616db3bfb48e2a3358c767affd0857d56c2eb501caa/scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b", size = 12104516, upload-time = "2025-01-10T08:06:40.009Z" }, - { url = "https://files.pythonhosted.org/packages/c4/b7/2e35f8e289ab70108f8cbb2e7a2208f0575dc704749721286519dcf35f6f/scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2", size = 11167837, upload-time = "2025-01-10T08:06:43.305Z" }, - { url = "https://files.pythonhosted.org/packages/a4/f6/ff7beaeb644bcad72bcfd5a03ff36d32ee4e53a8b29a639f11bcb65d06cd/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f", size = 12253728, upload-time = "2025-01-10T08:06:47.618Z" }, - { url = "https://files.pythonhosted.org/packages/29/7a/8bce8968883e9465de20be15542f4c7e221952441727c4dad24d534c6d99/scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86", size = 13147700, upload-time = "2025-01-10T08:06:50.888Z" }, - { url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52", size = 11110613, upload-time = "2025-01-10T08:06:54.115Z" }, - { url = "https://files.pythonhosted.org/packages/2e/59/8eb1872ca87009bdcdb7f3cdc679ad557b992c12f4b61f9250659e592c63/scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322", size = 12010001, upload-time = "2025-01-10T08:06:58.613Z" }, - { url = "https://files.pythonhosted.org/packages/9d/05/f2fc4effc5b32e525408524c982c468c29d22f828834f0625c5ef3d601be/scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1", size = 11096360, upload-time = "2025-01-10T08:07:01.556Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e4/4195d52cf4f113573fb8ebc44ed5a81bd511a92c0228889125fac2f4c3d1/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348", size = 12209004, upload-time = "2025-01-10T08:07:06.931Z" }, - { url = "https://files.pythonhosted.org/packages/94/be/47e16cdd1e7fcf97d95b3cb08bde1abb13e627861af427a3651fcb80b517/scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97", size = 13171776, upload-time = "2025-01-10T08:07:11.715Z" }, - { url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb", size = 11071865, upload-time = "2025-01-10T08:07:16.088Z" }, - { url = "https://files.pythonhosted.org/packages/12/ae/993b0fb24a356e71e9a894e42b8a9eec528d4c70217353a1cd7a48bc25d4/scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236", size = 11955804, upload-time = "2025-01-10T08:07:20.385Z" }, - { url = "https://files.pythonhosted.org/packages/d6/54/32fa2ee591af44507eac86406fa6bba968d1eb22831494470d0a2e4a1eb1/scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35", size = 11100530, upload-time = "2025-01-10T08:07:23.675Z" }, - { url = "https://files.pythonhosted.org/packages/3f/58/55856da1adec655bdce77b502e94a267bf40a8c0b89f8622837f89503b5a/scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691", size = 12433852, upload-time = "2025-01-10T08:07:26.817Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4f/c83853af13901a574f8f13b645467285a48940f185b690936bb700a50863/scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f", size = 11337256, upload-time = "2025-01-10T08:07:31.084Z" }, - { url = "https://files.pythonhosted.org/packages/d2/37/b305b759cc65829fe1b8853ff3e308b12cdd9d8884aa27840835560f2b42/scikit_learn-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6849dd3234e87f55dce1db34c89a810b489ead832aaf4d4550b7ea85628be6c1", size = 12101868, upload-time = "2025-01-10T08:07:34.189Z" }, - { url = "https://files.pythonhosted.org/packages/83/74/f64379a4ed5879d9db744fe37cfe1978c07c66684d2439c3060d19a536d8/scikit_learn-1.6.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e7be3fa5d2eb9be7d77c3734ff1d599151bb523674be9b834e8da6abe132f44e", size = 11144062, upload-time = "2025-01-10T08:07:37.67Z" }, - { url = "https://files.pythonhosted.org/packages/fd/dc/d5457e03dc9c971ce2b0d750e33148dd060fefb8b7dc71acd6054e4bb51b/scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44a17798172df1d3c1065e8fcf9019183f06c87609b49a124ebdf57ae6cb0107", size = 12693173, upload-time = "2025-01-10T08:07:42.713Z" }, - { url = "https://files.pythonhosted.org/packages/79/35/b1d2188967c3204c78fa79c9263668cf1b98060e8e58d1a730fe5b2317bb/scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b7a3b86e411e4bce21186e1c180d792f3d99223dcfa3b4f597ecc92fa1a422", size = 13518605, upload-time = "2025-01-10T08:07:46.551Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d8/8d603bdd26601f4b07e2363032b8565ab82eb857f93d86d0f7956fcf4523/scikit_learn-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7a73d457070e3318e32bdb3aa79a8d990474f19035464dfd8bede2883ab5dc3b", size = 11155078, upload-time = "2025-01-10T08:07:51.376Z" }, -] - [[package]] name = "scikit-learn" version = "1.7.2" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] dependencies = [ - { name = "joblib", marker = "python_full_version >= '3.10'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "joblib" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "threadpoolctl", marker = "python_full_version >= '3.10'" }, + { name = "threadpoolctl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } wheels = [ @@ -3411,53 +2388,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload-time = "2025-09-09T08:21:26.713Z" }, ] -[[package]] -name = "scipy" -version = "1.13.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ae/00/48c2f661e2816ccf2ecd77982f6605b2950afe60f60a52b4cbbc2504aa8f/scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", size = 57210720, upload-time = "2024-05-23T03:29:26.079Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/59/41b2529908c002ade869623b87eecff3e11e3ce62e996d0bdcb536984187/scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", size = 39328076, upload-time = "2024-05-23T03:19:01.687Z" }, - { url = "https://files.pythonhosted.org/packages/d5/33/f1307601f492f764062ce7dd471a14750f3360e33cd0f8c614dae208492c/scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", size = 30306232, upload-time = "2024-05-23T03:19:09.089Z" }, - { url = "https://files.pythonhosted.org/packages/c0/66/9cd4f501dd5ea03e4a4572ecd874936d0da296bd04d1c45ae1a4a75d9c3a/scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", size = 33743202, upload-time = "2024-05-23T03:19:15.138Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ba/7255e5dc82a65adbe83771c72f384d99c43063648456796436c9a5585ec3/scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f", size = 38577335, upload-time = "2024-05-23T03:19:21.984Z" }, - { url = "https://files.pythonhosted.org/packages/49/a5/bb9ded8326e9f0cdfdc412eeda1054b914dfea952bda2097d174f8832cc0/scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", size = 38820728, upload-time = "2024-05-23T03:19:28.225Z" }, - { url = "https://files.pythonhosted.org/packages/12/30/df7a8fcc08f9b4a83f5f27cfaaa7d43f9a2d2ad0b6562cced433e5b04e31/scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", size = 46210588, upload-time = "2024-05-23T03:19:35.661Z" }, - { url = "https://files.pythonhosted.org/packages/b4/15/4a4bb1b15bbd2cd2786c4f46e76b871b28799b67891f23f455323a0cdcfb/scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", size = 39333805, upload-time = "2024-05-23T03:19:43.081Z" }, - { url = "https://files.pythonhosted.org/packages/ba/92/42476de1af309c27710004f5cdebc27bec62c204db42e05b23a302cb0c9a/scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", size = 30317687, upload-time = "2024-05-23T03:19:48.799Z" }, - { url = "https://files.pythonhosted.org/packages/80/ba/8be64fe225360a4beb6840f3cbee494c107c0887f33350d0a47d55400b01/scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", size = 33694638, upload-time = "2024-05-23T03:19:55.104Z" }, - { url = "https://files.pythonhosted.org/packages/36/07/035d22ff9795129c5a847c64cb43c1fa9188826b59344fee28a3ab02e283/scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", size = 38569931, upload-time = "2024-05-23T03:20:01.82Z" }, - { url = "https://files.pythonhosted.org/packages/d9/10/f9b43de37e5ed91facc0cfff31d45ed0104f359e4f9a68416cbf4e790241/scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", size = 38838145, upload-time = "2024-05-23T03:20:09.173Z" }, - { url = "https://files.pythonhosted.org/packages/4a/48/4513a1a5623a23e95f94abd675ed91cfb19989c58e9f6f7d03990f6caf3d/scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", size = 46196227, upload-time = "2024-05-23T03:20:16.433Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7b/fb6b46fbee30fc7051913068758414f2721003a89dd9a707ad49174e3843/scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", size = 39357301, upload-time = "2024-05-23T03:20:23.538Z" }, - { url = "https://files.pythonhosted.org/packages/dc/5a/2043a3bde1443d94014aaa41e0b50c39d046dda8360abd3b2a1d3f79907d/scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", size = 30363348, upload-time = "2024-05-23T03:20:29.885Z" }, - { url = "https://files.pythonhosted.org/packages/e7/cb/26e4a47364bbfdb3b7fb3363be6d8a1c543bcd70a7753ab397350f5f189a/scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", size = 33406062, upload-time = "2024-05-23T03:20:36.012Z" }, - { url = "https://files.pythonhosted.org/packages/88/ab/6ecdc526d509d33814835447bbbeedbebdec7cca46ef495a61b00a35b4bf/scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", size = 38218311, upload-time = "2024-05-23T03:20:42.086Z" }, - { url = "https://files.pythonhosted.org/packages/0b/00/9f54554f0f8318100a71515122d8f4f503b1a2c4b4cfab3b4b68c0eb08fa/scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", size = 38442493, upload-time = "2024-05-23T03:20:48.292Z" }, - { url = "https://files.pythonhosted.org/packages/3e/df/963384e90733e08eac978cd103c34df181d1fec424de383cdc443f418dd4/scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", size = 45910955, upload-time = "2024-05-23T03:20:55.091Z" }, - { url = "https://files.pythonhosted.org/packages/7f/29/c2ea58c9731b9ecb30b6738113a95d147e83922986b34c685b8f6eefde21/scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", size = 39352927, upload-time = "2024-05-23T03:21:01.95Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c0/e71b94b20ccf9effb38d7147c0064c08c622309fd487b1b677771a97d18c/scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", size = 30324538, upload-time = "2024-05-23T03:21:07.634Z" }, - { url = "https://files.pythonhosted.org/packages/6d/0f/aaa55b06d474817cea311e7b10aab2ea1fd5d43bc6a2861ccc9caec9f418/scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", size = 33732190, upload-time = "2024-05-23T03:21:14.41Z" }, - { url = "https://files.pythonhosted.org/packages/35/f5/d0ad1a96f80962ba65e2ce1de6a1e59edecd1f0a7b55990ed208848012e0/scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", size = 38612244, upload-time = "2024-05-23T03:21:21.827Z" }, - { url = "https://files.pythonhosted.org/packages/8d/02/1165905f14962174e6569076bcc3315809ae1291ed14de6448cc151eedfd/scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", size = 38845637, upload-time = "2024-05-23T03:21:28.729Z" }, - { url = "https://files.pythonhosted.org/packages/3e/77/dab54fe647a08ee4253963bcd8f9cf17509c8ca64d6335141422fe2e2114/scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", size = 46227440, upload-time = "2024-05-23T03:21:35.888Z" }, -] - [[package]] name = "scipy" version = "1.15.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } wheels = [ @@ -3673,17 +2612,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/9f/1e160e4cd8cdbf062bf6a454cdf814dc7a48eb47e566fdb8f80ccb202605/simplejson-4.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:861e393260508efa64d8805a8e49c416c3484907e3f146ce966c69552b49b9a3", size = 210474, upload-time = "2026-04-24T19:24:15.917Z" }, { url = "https://files.pythonhosted.org/packages/7a/e6/cecd913df322df5bbe7ebb8ba39e0708e505a165553900da8a7761026d6f/simplejson-4.1.1-cp314-cp314t-win32.whl", hash = "sha256:d083b89d30948a751d3d97476c2ed91e4caaa24a1a1459bdbadb8876242c71fe", size = 91134, upload-time = "2026-04-24T19:24:17.635Z" }, { url = "https://files.pythonhosted.org/packages/97/73/f540dde99cc1d393bd062ab3b5735b777561a5d8f8a5f2e241164444d77a/simplejson-4.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4cbb299d0528ec0447fe366d8c9641860e28f997a62730690fef905f1f41046e", size = 94467, upload-time = "2026-04-24T19:24:19.109Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b3/f390ceeeb908218febecbea41cb30460ae232177e0d0bb48d716fce08253/simplejson-4.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97a02325a00617c26cfc974f4ebb191c8de6e87cb96d33e51612091150637c3d", size = 111812, upload-time = "2026-04-24T19:24:39.447Z" }, - { url = "https://files.pythonhosted.org/packages/7d/2f/1c4692fbe060950be98f90c8076ca4aad4249384f8eb1427e4546c34d900/simplejson-4.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bbc61cd7982ff77a68df06d103a3ba459eefd1d3cb6f4f4944cdf9f091d7bf7", size = 90587, upload-time = "2026-04-24T19:24:40.99Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e9/aec2b95963ba22e1c609c2743c22569ed0f0c48c607ab390a98b936fed0a/simplejson-4.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c7876ec2ef53ff5e6714a382b3f8f042a744b944728ae0baef99421740cc57a3", size = 90983, upload-time = "2026-04-24T19:24:42.587Z" }, - { url = "https://files.pythonhosted.org/packages/c0/06/019b4ed14e26b5c38e99b8af184bc350d0a3d294efc8adcffe1b34f52022/simplejson-4.1.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:42ee1aeaa295364bb2c079c42c5796bf1db4b0d5c4bf95f2fcdddba770618cb4", size = 168458, upload-time = "2026-04-24T19:24:44.49Z" }, - { url = "https://files.pythonhosted.org/packages/82/27/a0a6c931b8ae7e0caacbc895cb6fe625f5d05701be0de21ffef242a7e780/simplejson-4.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f42a7911f64ed8f738ba55480c20d5c685851781d411f9473cafa7a643e52fe4", size = 167260, upload-time = "2026-04-24T19:24:46.457Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0c/14fd0287d71dfcc3c5717594da36411b73392ab66ad1959ea8fc7f658a36/simplejson-4.1.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b2da172a6ff43f74463522a1aa1d7a481ac2dba2de4b18ed51e989190352ba7", size = 176760, upload-time = "2026-04-24T19:24:48.069Z" }, - { url = "https://files.pythonhosted.org/packages/f5/c1/d396318914d2becbcef272e95fca6eba58c598d587fb3136d1a5bf63851e/simplejson-4.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:677fbb192b2cbefb3dc21862eaf0bf560b4b370662503036c513f1e3eb32dfac", size = 165880, upload-time = "2026-04-24T19:24:49.755Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e6/1ab403ab9f6b02a7a8c56b203826892316ce81f6735d4f0bd493960cef33/simplejson-4.1.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10048ab9b9e0f7e95f1680829f0925a63b190fa8e8e9bb91369538fe382df827", size = 174597, upload-time = "2026-04-24T19:24:51.443Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2d/b40e61a7e71b866bd8b2570aa0493fd9ad3729508f62d93b182b88161c16/simplejson-4.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:82e42ff58ee856f4029c732d35673dbe62d589445a8e6c3c98ced8fd78096617", size = 167425, upload-time = "2026-04-24T19:24:52.957Z" }, - { url = "https://files.pythonhosted.org/packages/ea/36/18800a4689db287571ba40a767f867a226b337642812b1a3ec015382e696/simplejson-4.1.1-cp39-cp39-win32.whl", hash = "sha256:43fa9a1ccf477e415c025ba507ada54984f5ed927d28d304cf50e089818818b0", size = 88365, upload-time = "2026-04-24T19:24:54.584Z" }, - { url = "https://files.pythonhosted.org/packages/cb/ae/a596dcd327b53da7ac336f3fbf54049033d492c79d7cce5027f7b2bea8da/simplejson-4.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4c1eecc2d6a186eaf5d111cf9b311fa9a9ecf68703db7b63ed5938049f3e74f5", size = 90478, upload-time = "2026-04-24T19:24:56.42Z" }, { url = "https://files.pythonhosted.org/packages/ce/6a/8b74c52ffd33dbbde00fe7251fee6a0acdc8cea33f7a43805aed258fb79b/simplejson-4.1.1-py3-none-any.whl", hash = "sha256:2ce92b3748f02423e26d2bfb636fb9d7a8f67c8f5854dcae69d350d123b2eee2", size = 69195, upload-time = "2026-04-24T19:24:57.962Z" }, ] @@ -3898,12 +2826,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, - { url = "https://files.pythonhosted.org/packages/bd/1b/6fbd611aeba01ef802c5876c94d7be603a9710db055beacbad39e75a31aa/uvloop-0.22.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b45649628d816c030dba3c80f8e2689bab1c89518ed10d426036cdc47874dfc4", size = 1345858, upload-time = "2025-10-16T22:17:11.106Z" }, - { url = "https://files.pythonhosted.org/packages/9e/91/2c84f00bdbe3c51023cc83b027bac1fe959ba4a552e970da5ef0237f7945/uvloop-0.22.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ea721dd3203b809039fcc2983f14608dae82b212288b346e0bfe46ec2fab0b7c", size = 743913, upload-time = "2025-10-16T22:17:12.165Z" }, - { url = "https://files.pythonhosted.org/packages/cc/10/76aec83886d41a88aca5681db6a2c0601622d0d2cb66cd0d200587f962ad/uvloop-0.22.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ae676de143db2b2f60a9696d7eca5bb9d0dd6cc3ac3dad59a8ae7e95f9e1b54", size = 3635818, upload-time = "2025-10-16T22:17:13.812Z" }, - { url = "https://files.pythonhosted.org/packages/d5/9a/733fcb815d345979fc54d3cdc3eb50bc75a47da3e4003ea7ada58e6daa65/uvloop-0.22.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17d4e97258b0172dfa107b89aa1eeba3016f4b1974ce85ca3ef6a66b35cbf659", size = 3685477, upload-time = "2025-10-16T22:17:15.307Z" }, - { url = "https://files.pythonhosted.org/packages/83/fb/bee1eb11cc92bd91f76d97869bb6a816e80d59fd73721b0a3044dc703d9c/uvloop-0.22.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:05e4b5f86e621cf3927631789999e697e58f0d2d32675b67d9ca9eb0bca55743", size = 3496128, upload-time = "2025-10-16T22:17:16.558Z" }, - { url = "https://files.pythonhosted.org/packages/76/ee/3fdfeaa9776c0fd585d358c92b1dbca669720ffa476f0bbe64ed8f245bd7/uvloop-0.22.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:286322a90bea1f9422a470d5d2ad82d38080be0a29c4dd9b3e6384320a4d11e7", size = 3602565, upload-time = "2025-10-16T22:17:17.755Z" }, ] [[package]] @@ -3915,52 +2837,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8d/96/04e7b441807b26b794da5b11e59ed7f83b2cf8af202bd7eba8ad2fa6046e/wadler_lindig-0.1.7-py3-none-any.whl", hash = "sha256:e3ec83835570fd0a9509f969162aeb9c65618f998b1f42918cfc8d45122fe953", size = 20516, upload-time = "2025-06-18T07:00:41.684Z" }, ] -[[package]] -name = "xgboost" -version = "2.1.4" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "nvidia-nccl-cu12", marker = "python_full_version < '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux'" }, - { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e2/5e/860a1ef13ce38db8c257c83e138be64bcffde8f401e84bf1e2e91838afa3/xgboost-2.1.4.tar.gz", hash = "sha256:ab84c4bbedd7fae1a26f61e9dd7897421d5b08454b51c6eb072abc1d346d08d7", size = 1091127, upload-time = "2025-02-06T18:18:20.192Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/fe/7a1d2342c2e93f22b41515e02b73504c7809247b16ae395bd2ee7ef11e19/xgboost-2.1.4-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:78d88da184562deff25c820d943420342014dd55e0f4c017cc4563c2148df5ee", size = 2140692, upload-time = "2025-02-06T18:16:59.23Z" }, - { url = "https://files.pythonhosted.org/packages/f5/b6/653a70910739f127adffbefb688ebc22b51139292757de7c22b1e04ce792/xgboost-2.1.4-py3-none-macosx_12_0_arm64.whl", hash = "sha256:523db01d4e74b05c61a985028bde88a4dd380eadc97209310621996d7d5d14a7", size = 1939418, upload-time = "2025-02-06T18:17:02.494Z" }, - { url = "https://files.pythonhosted.org/packages/43/06/905fee34c10fb0d0c3baa15106413b76f360d8e958765ec57c9eddf762fa/xgboost-2.1.4-py3-none-manylinux2014_aarch64.whl", hash = "sha256:57c7e98111aceef4b689d7d2ce738564a1f7fe44237136837a47847b8b33bade", size = 4442052, upload-time = "2025-02-06T18:17:04.029Z" }, - { url = "https://files.pythonhosted.org/packages/f8/6a/41956f91ab984f2fa44529b2551d825a20d33807eba051a60d06ede2a87c/xgboost-2.1.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1343a512e634822eab30d300bfc00bf777dc869d881cc74854b42173cfcdb14", size = 4533170, upload-time = "2025-02-06T18:17:05.753Z" }, - { url = "https://files.pythonhosted.org/packages/b1/53/37032dca20dae7a88ad1907f817a81f232ca6e935f0c28c98db3c0a0bd22/xgboost-2.1.4-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:d366097d0db047315736f46af852feaa907f6d7371716af741cdce488ae36d20", size = 4206715, upload-time = "2025-02-06T18:17:08.448Z" }, - { url = "https://files.pythonhosted.org/packages/e4/3c/e3a93bfa7e8693c825df5ec02a40f7ff5f0950e02198b1e85da9315a8d47/xgboost-2.1.4-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:8df6da72963969ab2bf49a520c3e147b1e15cbeddd3aa0e3e039b3532c739339", size = 223642416, upload-time = "2025-02-06T18:17:25.08Z" }, - { url = "https://files.pythonhosted.org/packages/43/80/0b5a2dfcf5b4da27b0b68d2833f05d77e1a374d43db951fca200a1f12a52/xgboost-2.1.4-py3-none-win_amd64.whl", hash = "sha256:8bbfe4fedc151b83a52edbf0de945fd94358b09a81998f2945ad330fd5f20cd6", size = 124910381, upload-time = "2025-02-06T18:17:43.202Z" }, -] - [[package]] name = "xgboost" version = "3.1.2" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", -] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "nvidia-nccl-cu12", marker = "python_full_version >= '3.10' and platform_machine != 'aarch64' and sys_platform == 'linux'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f0/64/42310363ecd814de5930981672d20da3d35271721ad2d2b4970b4092825b/xgboost-3.1.2.tar.gz", hash = "sha256:0f94496db277f5c227755e1f3ec775c59bafae38f58c94aa97c5198027c93df5", size = 1237438, upload-time = "2025-11-20T18:33:29.614Z" } From a0a652893a384a715c3fd2611bd6dd1ccd8e4614 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Wed, 24 Jun 2026 12:06:42 +0100 Subject: [PATCH 07/30] update publish rules --- .github/workflows/publish.yml | 42 ++++++++++++++++------------------- tests/smoke_test.py | 0 2 files changed, 19 insertions(+), 23 deletions(-) create mode 100644 tests/smoke_test.py diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4305e25..1141cc3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,37 +1,33 @@ -name: publish +name: Publish Release to PyPI -# Build and publish to PyPI when a GitHub Release is published. -# Release flow: bump `version` in pyproject.toml -> tag/create a Release -> this runs. on: - release: - types: [published] + push: + tags: + - 'v*.*.*' jobs: - publish: - name: build + publish to PyPI + run: runs-on: ubuntu-latest - - # PyPI Trusted Publishing (OIDC) — no API token stored as a secret. - # One-time setup: add this repo + workflow as a trusted publisher in the - # PyPI project settings (https://pypi.org/manage/project/estimint/settings/publishing/). environment: name: pypi - url: https://pypi.org/project/estimint/ permissions: id-token: write - + contents: read steps: - - uses: actions/checkout@v4 - + - name: Checkout code + uses: actions/checkout@v6 - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b with: - enable-cache: true - - - name: Build sdist + wheel + enable-cache: true + version: "0.11.18" + - name: Set up Python + run: uv python install + - name: Build run: uv build - - # uv detects the GitHub Actions OIDC token automatically when - # id-token: write is granted, so no credentials are needed here. - - name: Publish to PyPI + # - name: Smoke test (wheel) + # run: uv run --isolated --no-project --with dist/*.whl tests/smoke_test.py + # - name: Smoke test (source distribution) + # run: uv run --isolated --no-project --with dist/*.tar.gz tests/smoke_test.py + - name: Publish run: uv publish diff --git a/tests/smoke_test.py b/tests/smoke_test.py new file mode 100644 index 0000000..e69de29 From 90a8371daeee74bfa36334a88f178b7211e8651d Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Wed, 24 Jun 2026 15:38:50 +0100 Subject: [PATCH 08/30] Refactor code structure for improved readability and maintainability --- .coverage | Bin 53248 -> 53248 bytes .github/workflows/publish.yml | 14 +- .github/workflows/tests.yml | 16 +- MANIFEST.in | 1 + README.md | 40 +- pyproject.toml | 56 +- src/estimint/__init__.py | 7 +- tests/smoke_test.py | 3 + uv.lock | 1116 ++++----------------------------- 9 files changed, 160 insertions(+), 1093 deletions(-) diff --git a/.coverage b/.coverage index ad663e99750cd1edfbe244cceff9773d346d532a..1a0fcec026e9c9e7548efa780d8c7df37451060d 100644 GIT binary patch delta 1607 zcmZozz}&Eac|sCXUF61;h4#|C91Q&X`J4Ey`2O(i=d0th<74JM!P~{_!OO8(P~Zhm zy&Vq=LnEVpMt*Lpequ>RVnJe&esX?Fs(xy5Nv5x-Ux;o&Wl2VUo_=vrGFU7(Gp|HH zJtsdYF{fCspwfXGsGpTo{l&?td5J}t`Nj1>BW$>s8R|(jAt^N_FSP`y+me%+p^{YH z8A(MTtsKntr0Xpz%>(MSV<#uvic9i~64O(G`t8|(`kD3XNeuXcocxlK%)E4<3D&I4 z47H?syrd{G6Xbjw7D$-KkreH@z=Q#gbvI_9>jep0J~`H3A=R3R42PDMWP)w7X9R~6 z!C;#F++R+bmy?120B<+HH7_UcNxr{)^?WS6o_zLv2l$(Tsr@BSy**1KBL#__$C0Ix zm1O zOtQO?5;mI+b1g`J3`uDdmaE9?zT2f&yoF zv>bR?7#dmiGxBp&^^^09bMy6G@{>z*Q}arS^@CCi@{9FTi%T+dGxJI&8~93SIdKD( za}uSzz*kDko(rg)nJDEOeZ}joIhh%1iBYXzT$BuVn0`i5kzPTiH3wOmi%Ro=njP4I z4y`9D98m2pF3B%SOiu+G;m8Iwf}M2N7v$uZlw{_m>lM^j+OY!7U?km)lA^>+kT>jE zhz)O4U*zVeq~;XY15NN?2AUvBx(iYgOA_M?it>|Fi;KaYskCDv)h`y{bf#Zgl9^Ks z3Q$I%0YnApWV-%9CIf(W%s%}K8 zX0LZ*X=EqLwWvlQl657UJxe1a8AgCpH7HTC5*@s#Zh$0fpaCqNERCXMxB!@{>(P=m zGnt-&rD`T%l&}+3f@L2^ zyZVe7Cr*CXSE#1K!NSPt#m&UfuuWa~g-XTuH;fD*kpA@VyPwC+@2|JN|KFZ*a%sOB zHzylVsR&yW??1-LOZ#>8ndQMMK?EbinI$!ROh9=#u2*{T=j2r1l;`s@vT$= 1.20.0 -- pandas >= 1.3.0 -- xgboost >= 1.6.0 -- scipy >= 1.7.0 - -Optional extras, installed with `estimint[name]`: - -- `train` adds duckdb, scikit-learn and pyarrow for data prep and model training -- `viz` adds matplotlib for plotting -- `download` adds requests and appdirs for fetching published models -- `all` combines train, viz and download -- `dev` is the test and lint toolchain (pytest, pytest-cov, black, isort, mypy, flake8) - ## License MIT License diff --git a/pyproject.toml b/pyproject.toml index d5cbeac..297067b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,13 +4,14 @@ build-backend = "setuptools.build_meta" [project] name = "estimint" -version = "1.4.0" -description = "EIR Estimation using Machine learning INTerventions - Python port" +version = "1.4.2" +description = "EIR Estimation using Machine learning interventions " readme = "README.md" license = "MIT" -requires-python = ">=3.10" +requires-python = ">=3.12" authors = [ {name = "Cosmo Santoni", email = "cosmo.santoni@imperial.ac.uk"}, + {name = "Anmol Thapar", email = "a.thapar@imperial.ac.uk"} ] keywords = [ "malaria", @@ -19,21 +20,7 @@ keywords = [ "xgboost", "epidemiology", ] -classifiers = [ - "Development Status :: 4 - Beta", - "Intended Audience :: Science/Research", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Topic :: Scientific/Engineering :: Bio-Informatics", -] -# Core runtime dependencies: everything needed to load a bundled model and run -# inference (load_xgb_model / run_xgb_model / run_scenarios / calculate_dn0). dependencies = [ "numpy>=1.20.0", "pandas>=1.3.0", @@ -42,39 +29,23 @@ dependencies = [ ] [project.optional-dependencies] -# Data preparation + model training (not needed for inference): -# duckdb -> load_and_filter() SQL over the simulation parquet -# scikit-learn -> strata_and_split() K-means stratification -# pyarrow -> parquet engine for pd.read_parquet in models/*/train.py train = [ "duckdb>=0.8.0", "scikit-learn>=1.0.0", "pyarrow>=10.0.0", ] -# Plotting (plot_obs_pred and training diagnostic plots): viz = [ "matplotlib>=3.4.0", ] -# Optional model download from GitHub releases (graceful fallback if absent): download = [ "requests>=2.28.0", "appdirs>=1.4.0", ] -# run_scenarios pipeline: the stateMINT mamba2 emulator (PyPI distribution: mintstate, -# imported as stateMINT). Needs Python >=3.12. Pinned to the mamba2-train branch via -# [tool.uv.sources] for now. scenarios = [ - "mintstate; python_version >= '3.12'", -] -# Everything a model developer needs (train + plot + download): -all = [ - "duckdb>=0.8.0", - "scikit-learn>=1.0.0", - "pyarrow>=10.0.0", - "matplotlib>=3.4.0", - "requests>=2.28.0", - "appdirs>=1.4.0", + "mintstate>=0.3.0" ] +all = ["estimint[train,viz,download,scenarios]"] + dev = [ "pytest>=7.0.0", "pytest-cov>=4.0.0", @@ -90,18 +61,13 @@ Documentation = "https://github.com/CosmoNaught/estiMINT#readme" Repository = "https://github.com/CosmoNaught/estiMINT" Issues = "https://github.com/CosmoNaught/estiMINT/issues" -[tool.uv.sources] -# Dev-only override: pull mintstate from the mamba2-train branch. This is stripped from -# the published package metadata, so it does not block PyPI uploads. -mintstate = { git = "https://github.com/mrc-ide/stateMINT.git", branch = "mamba2-train" } - [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] estimint = [ - "*.txt", - "*.csv", + "*.txt", + "*.csv", "*.pkl", "*.json", "data/*", @@ -112,14 +78,14 @@ estimint = [ [tool.black] line-length = 100 -target-version = ["py310", "py311", "py312", "py313"] +target-version = ["py312", "py313"] [tool.isort] profile = "black" line_length = 100 [tool.mypy] -python_version = "3.10" +python_version = "3.12" warn_return_any = true warn_unused_configs = true ignore_missing_imports = true diff --git a/src/estimint/__init__.py b/src/estimint/__init__.py index 6d7174a..3d95ada 100644 --- a/src/estimint/__init__.py +++ b/src/estimint/__init__.py @@ -4,8 +4,6 @@ This package provides tools for training and running XGBoost models to predict Entomological Inoculation Rate (EIR) from malaria intervention data. -Equivalent to: estiMINT-package.R - Dependencies ------------ Core (inference): numpy, pandas, xgboost, scipy. @@ -15,7 +13,6 @@ - download: requests, appdirs (fetch published models) """ -__version__ = "1.4.0" __package_name__ = "estiMINT" # Public API exports @@ -53,7 +50,7 @@ bundle_model, ) -from .run import run_xgb_model +from .run import run_xgb_model, set_global_model, get_global_model from .hbr import estimate_eir_with_mosquito_delta @@ -92,6 +89,8 @@ "bundle_model", # run "run_xgb_model", + "set_global_model", + "get_global_model", # hbr "estimate_eir_with_mosquito_delta", # bednet diff --git a/tests/smoke_test.py b/tests/smoke_test.py index e69de29..9f62637 100644 --- a/tests/smoke_test.py +++ b/tests/smoke_test.py @@ -0,0 +1,3 @@ +from estimint import run_scenarios + +print("import estimint: OK") diff --git a/uv.lock b/uv.lock index 1f4e035..889ca38 100644 --- a/uv.lock +++ b/uv.lock @@ -1,18 +1,16 @@ version = 1 -revision = 3 -requires-python = ">=3.10" +revision = 2 +requires-python = ">=3.12" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version < '3.13' and sys_platform == 'emscripten'", "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", + "python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] [[package]] @@ -53,8 +51,8 @@ name = "anyio" version = "4.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "idna", marker = "python_full_version >= '3.12'" }, - { name = "typing-extensions", marker = "python_full_version == '3.12.*'" }, + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/b5/001890774a9552aff22502b8da382593109ce0c95314abaebbb116567545/anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89", size = 253586, upload-time = "2026-06-15T22:00:49.021Z" } wheels = [ @@ -75,26 +73,15 @@ name = "black" version = "25.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "click" }, { name = "mypy-extensions" }, { name = "packaging" }, { name = "pathspec" }, { name = "platformdirs" }, { name = "pytokens" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/d2/6caccbc96f9311e8ec3378c296d4f4809429c43a6cd2394e3c390e86816d/black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", size = 1743501, upload-time = "2025-11-10T01:59:06.202Z" }, - { url = "https://files.pythonhosted.org/packages/69/35/b986d57828b3f3dccbf922e2864223197ba32e74c5004264b1c62bc9f04d/black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", size = 1597308, upload-time = "2025-11-10T01:57:58.633Z" }, - { url = "https://files.pythonhosted.org/packages/39/8e/8b58ef4b37073f52b64a7b2dd8c9a96c84f45d6f47d878d0aa557e9a2d35/black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", size = 1656194, upload-time = "2025-11-10T01:57:10.909Z" }, - { url = "https://files.pythonhosted.org/packages/8d/30/9c2267a7955ecc545306534ab88923769a979ac20a27cf618d370091e5dd/black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03", size = 1347996, upload-time = "2025-11-10T01:57:22.391Z" }, - { url = "https://files.pythonhosted.org/packages/c4/62/d304786b75ab0c530b833a89ce7d997924579fb7484ecd9266394903e394/black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", size = 1727891, upload-time = "2025-11-10T02:01:40.507Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", size = 1581875, upload-time = "2025-11-10T01:57:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", size = 1642716, upload-time = "2025-11-10T01:56:51.589Z" }, - { url = "https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", size = 1352904, upload-time = "2025-11-10T01:59:26.252Z" }, { url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" }, { url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" }, { url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" }, @@ -125,38 +112,6 @@ version = "3.4.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, - { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, - { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, - { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, - { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, - { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, - { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, - { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, - { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, - { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, - { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, - { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, - { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, - { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, - { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, - { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, - { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, - { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, - { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, - { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, - { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, - { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, - { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, - { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, - { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, @@ -208,39 +163,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] -[[package]] -name = "click" -version = "8.3.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, -] - [[package]] name = "click" version = "8.4.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } wheels = [ @@ -256,109 +184,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] -[[package]] -name = "contourpy" -version = "1.3.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, - { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, - { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, - { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, - { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, - { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, - { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, - { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, - { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, - { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, - { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, - { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, - { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, - { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, - { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, - { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, - { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, - { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, - { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, - { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, - { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, - { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, - { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, - { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, - { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, - { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, - { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, - { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, - { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, - { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, - { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, - { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, - { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, - { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, - { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, - { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, - { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, - { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, - { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, - { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, - { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, - { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, - { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, -] - [[package]] name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", -] dependencies = [ - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, - { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, - { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, - { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, - { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, - { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, - { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, - { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, - { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, @@ -414,11 +248,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, - { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, - { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, - { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, - { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, - { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, ] [[package]] @@ -427,31 +256,6 @@ version = "7.12.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/89/26/4a96807b193b011588099c3b5c89fbb05294e5b90e71018e065465f34eb6/coverage-7.12.0.tar.gz", hash = "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c", size = 819341, upload-time = "2025-11-18T13:34:20.766Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/4a/0dc3de1c172d35abe512332cfdcc43211b6ebce629e4cc42e6cd25ed8f4d/coverage-7.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b", size = 217409, upload-time = "2025-11-18T13:31:53.122Z" }, - { url = "https://files.pythonhosted.org/packages/01/c3/086198b98db0109ad4f84241e8e9ea7e5fb2db8c8ffb787162d40c26cc76/coverage-7.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb2a1b6ab9fe833714a483a915de350abc624a37149649297624c8d57add089c", size = 217927, upload-time = "2025-11-18T13:31:54.458Z" }, - { url = "https://files.pythonhosted.org/packages/5d/5f/34614dbf5ce0420828fc6c6f915126a0fcb01e25d16cf141bf5361e6aea6/coverage-7.12.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5734b5d913c3755e72f70bf6cc37a0518d4f4745cde760c5d8e12005e62f9832", size = 244678, upload-time = "2025-11-18T13:31:55.805Z" }, - { url = "https://files.pythonhosted.org/packages/55/7b/6b26fb32e8e4a6989ac1d40c4e132b14556131493b1d06bc0f2be169c357/coverage-7.12.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b527a08cdf15753279b7afb2339a12073620b761d79b81cbe2cdebdb43d90daa", size = 246507, upload-time = "2025-11-18T13:31:57.05Z" }, - { url = "https://files.pythonhosted.org/packages/06/42/7d70e6603d3260199b90fb48b537ca29ac183d524a65cc31366b2e905fad/coverage-7.12.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bb44c889fb68004e94cab71f6a021ec83eac9aeabdbb5a5a88821ec46e1da73", size = 248366, upload-time = "2025-11-18T13:31:58.362Z" }, - { url = "https://files.pythonhosted.org/packages/2d/4a/d86b837923878424c72458c5b25e899a3c5ca73e663082a915f5b3c4d749/coverage-7.12.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4b59b501455535e2e5dde5881739897967b272ba25988c89145c12d772810ccb", size = 245366, upload-time = "2025-11-18T13:31:59.572Z" }, - { url = "https://files.pythonhosted.org/packages/e6/c2/2adec557e0aa9721875f06ced19730fdb7fc58e31b02b5aa56f2ebe4944d/coverage-7.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8842f17095b9868a05837b7b1b73495293091bed870e099521ada176aa3e00e", size = 246408, upload-time = "2025-11-18T13:32:00.784Z" }, - { url = "https://files.pythonhosted.org/packages/5a/4b/8bd1f1148260df11c618e535fdccd1e5aaf646e55b50759006a4f41d8a26/coverage-7.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5a6f20bf48b8866095c6820641e7ffbe23f2ac84a2efc218d91235e404c7777", size = 244416, upload-time = "2025-11-18T13:32:01.963Z" }, - { url = "https://files.pythonhosted.org/packages/0e/13/3a248dd6a83df90414c54a4e121fd081fb20602ca43955fbe1d60e2312a9/coverage-7.12.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5f3738279524e988d9da2893f307c2093815c623f8d05a8f79e3eff3a7a9e553", size = 244681, upload-time = "2025-11-18T13:32:03.408Z" }, - { url = "https://files.pythonhosted.org/packages/76/30/aa833827465a5e8c938935f5d91ba055f70516941078a703740aaf1aa41f/coverage-7.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0d68c1f7eabbc8abe582d11fa393ea483caf4f44b0af86881174769f185c94d", size = 245300, upload-time = "2025-11-18T13:32:04.686Z" }, - { url = "https://files.pythonhosted.org/packages/38/24/f85b3843af1370fb3739fa7571819b71243daa311289b31214fe3e8c9d68/coverage-7.12.0-cp310-cp310-win32.whl", hash = "sha256:7670d860e18b1e3ee5930b17a7d55ae6287ec6e55d9799982aa103a2cc1fa2ef", size = 220008, upload-time = "2025-11-18T13:32:05.806Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a2/c7da5b9566f7164db9eefa133d17761ecb2c2fde9385d754e5b5c80f710d/coverage-7.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:f999813dddeb2a56aab5841e687b68169da0d3f6fc78ccf50952fa2463746022", size = 220943, upload-time = "2025-11-18T13:32:07.166Z" }, - { url = "https://files.pythonhosted.org/packages/5a/0c/0dfe7f0487477d96432e4815537263363fb6dd7289743a796e8e51eabdf2/coverage-7.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa124a3683d2af98bd9d9c2bfa7a5076ca7e5ab09fdb96b81fa7d89376ae928f", size = 217535, upload-time = "2025-11-18T13:32:08.812Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f5/f9a4a053a5bbff023d3bec259faac8f11a1e5a6479c2ccf586f910d8dac7/coverage-7.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d93fbf446c31c0140208dcd07c5d882029832e8ed7891a39d6d44bd65f2316c3", size = 218044, upload-time = "2025-11-18T13:32:10.329Z" }, - { url = "https://files.pythonhosted.org/packages/95/c5/84fc3697c1fa10cd8571919bf9693f693b7373278daaf3b73e328d502bc8/coverage-7.12.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:52ca620260bd8cd6027317bdd8b8ba929be1d741764ee765b42c4d79a408601e", size = 248440, upload-time = "2025-11-18T13:32:12.536Z" }, - { url = "https://files.pythonhosted.org/packages/f4/36/2d93fbf6a04670f3874aed397d5a5371948a076e3249244a9e84fb0e02d6/coverage-7.12.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f3433ffd541380f3a0e423cff0f4926d55b0cc8c1d160fdc3be24a4c03aa65f7", size = 250361, upload-time = "2025-11-18T13:32:13.852Z" }, - { url = "https://files.pythonhosted.org/packages/5d/49/66dc65cc456a6bfc41ea3d0758c4afeaa4068a2b2931bf83be6894cf1058/coverage-7.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7bbb321d4adc9f65e402c677cd1c8e4c2d0105d3ce285b51b4d87f1d5db5245", size = 252472, upload-time = "2025-11-18T13:32:15.068Z" }, - { url = "https://files.pythonhosted.org/packages/35/1f/ebb8a18dffd406db9fcd4b3ae42254aedcaf612470e8712f12041325930f/coverage-7.12.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22a7aade354a72dff3b59c577bfd18d6945c61f97393bc5fb7bd293a4237024b", size = 248592, upload-time = "2025-11-18T13:32:16.328Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/67f213c06e5ea3b3d4980df7dc344d7fea88240b5fe878a5dcbdfe0e2315/coverage-7.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3ff651dcd36d2fea66877cd4a82de478004c59b849945446acb5baf9379a1b64", size = 250167, upload-time = "2025-11-18T13:32:17.687Z" }, - { url = "https://files.pythonhosted.org/packages/f0/00/e52aef68154164ea40cc8389c120c314c747fe63a04b013a5782e989b77f/coverage-7.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:31b8b2e38391a56e3cea39d22a23faaa7c3fc911751756ef6d2621d2a9daf742", size = 248238, upload-time = "2025-11-18T13:32:19.2Z" }, - { url = "https://files.pythonhosted.org/packages/1f/a4/4d88750bcf9d6d66f77865e5a05a20e14db44074c25fd22519777cb69025/coverage-7.12.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:297bc2da28440f5ae51c845a47c8175a4db0553a53827886e4fb25c66633000c", size = 247964, upload-time = "2025-11-18T13:32:21.027Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6b/b74693158899d5b47b0bf6238d2c6722e20ba749f86b74454fac0696bb00/coverage-7.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ff7651cc01a246908eac162a6a86fc0dbab6de1ad165dfb9a1e2ec660b44984", size = 248862, upload-time = "2025-11-18T13:32:22.304Z" }, - { url = "https://files.pythonhosted.org/packages/18/de/6af6730227ce0e8ade307b1cc4a08e7f51b419a78d02083a86c04ccceb29/coverage-7.12.0-cp311-cp311-win32.whl", hash = "sha256:313672140638b6ddb2c6455ddeda41c6a0b208298034544cfca138978c6baed6", size = 220033, upload-time = "2025-11-18T13:32:23.714Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a1/e7f63021a7c4fe20994359fcdeae43cbef4a4d0ca36a5a1639feeea5d9e1/coverage-7.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1783ed5bd0d5938d4435014626568dc7f93e3cb99bc59188cc18857c47aa3c4", size = 220966, upload-time = "2025-11-18T13:32:25.599Z" }, - { url = "https://files.pythonhosted.org/packages/77/e8/deae26453f37c20c3aa0c4433a1e32cdc169bf415cce223a693117aa3ddd/coverage-7.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:4648158fd8dd9381b5847622df1c90ff314efbfc1df4550092ab6013c238a5fc", size = 219637, upload-time = "2025-11-18T13:32:27.265Z" }, { url = "https://files.pythonhosted.org/packages/02/bf/638c0427c0f0d47638242e2438127f3c8ee3cfc06c7fdeb16778ed47f836/coverage-7.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647", size = 217704, upload-time = "2025-11-18T13:32:28.906Z" }, { url = "https://files.pythonhosted.org/packages/08/e1/706fae6692a66c2d6b871a608bbde0da6281903fa0e9f53a39ed441da36a/coverage-7.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736", size = 218064, upload-time = "2025-11-18T13:32:30.161Z" }, { url = "https://files.pythonhosted.org/packages/a9/8b/eb0231d0540f8af3ffda39720ff43cb91926489d01524e68f60e961366e4/coverage-7.12.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60", size = 249560, upload-time = "2025-11-18T13:32:31.835Z" }, @@ -520,11 +324,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/a3/43b749004e3c09452e39bb56347a008f0a0668aad37324a99b5c8ca91d9e/coverage-7.12.0-py3-none-any.whl", hash = "sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a", size = 209503, upload-time = "2025-11-18T13:34:18.892Z" }, ] -[package.optional-dependencies] -toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, -] - [[package]] name = "cycler" version = "0.12.1" @@ -540,18 +339,6 @@ version = "1.4.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/81/99/ac6c105118751cc3ccae980b12e44847273f3402e647ec3197aff2251e23/duckdb-1.4.2.tar.gz", hash = "sha256:df81acee3b15ecb2c72eb8f8579fb5922f6f56c71f5c8892ea3bc6fab39aa2c4", size = 18469786, upload-time = "2025-11-12T13:18:04.203Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/db/de454dea845f263fe42fa176c12ba9befe86a87514a2e5a48494a8ca5003/duckdb-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85f0c36c1b5f378d96dd7d8c6d312317f4f547a567e8b76cacb2590a31d931f3", size = 28999618, upload-time = "2025-11-12T13:16:29.558Z" }, - { url = "https://files.pythonhosted.org/packages/1a/39/644e8b130058188a15d4e5f2b955306ee486f3843d8479da1c846a85342f/duckdb-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:125cd89dbfd40846f216032b11e5eeaf2be13ee4d6745b82413ddd213ddc4d99", size = 15396589, upload-time = "2025-11-12T13:16:32.161Z" }, - { url = "https://files.pythonhosted.org/packages/50/f6/11446807f06dd65227f9817e04c01309ec8009b7fe6f0cf3fc0d7f6c7ea2/duckdb-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c80934cb15879844a752776a1ea3d1405635f307f5bb8b87c99f5a5564d33a", size = 13726628, upload-time = "2025-11-12T13:16:34.316Z" }, - { url = "https://files.pythonhosted.org/packages/a0/2c/6b2cf2d9df3776accb25ac375759c1d571fd730f216017c52cb5d4deffd6/duckdb-1.4.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d3c39429b3ce1ee33d86daa94bed75a1f5b0fcf4d66d0839a6fcee398894548", size = 18455943, upload-time = "2025-11-12T13:16:36.967Z" }, - { url = "https://files.pythonhosted.org/packages/a6/b4/f213b764bd7f2c99aab20d25e4aaeda9ce54e1dc09b326c4da5a4fbe6bfd/duckdb-1.4.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4da7aafa94800f475d287814ad91993cf1f912c16f76ff4b411769da40c4b7da", size = 20454873, upload-time = "2025-11-12T13:16:39.801Z" }, - { url = "https://files.pythonhosted.org/packages/db/0d/5ae694d1779ec06beff624a5f59190c2f140e753cbdba0f5d0c7f3d44e37/duckdb-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:c45e0e682ee9073c36dc34d7ad8033210bfea0cab80cc98d1eca516227b35fdf", size = 12320762, upload-time = "2025-11-12T13:16:42.085Z" }, - { url = "https://files.pythonhosted.org/packages/1a/76/5b79eac0abcb239806da1d26f20515882a8392d0729a031af9e61d494dd4/duckdb-1.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b2d882672b61bc6117a2c524cf64ea519d2e829295951d214f04e126f1549b09", size = 29005908, upload-time = "2025-11-12T13:16:44.454Z" }, - { url = "https://files.pythonhosted.org/packages/73/1a/324d7787fdb0de96872ff7b48524830930494b45abf9501875be7456faa2/duckdb-1.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:995ec9c1fc3ce5fbfe5950b980ede2a9d51b35fdf2e3f873ce94c22fc3355fdc", size = 15398994, upload-time = "2025-11-12T13:16:46.802Z" }, - { url = "https://files.pythonhosted.org/packages/ad/c6/a2a072ca73f91a32c0db1254dd84fec30f4d673f9d57d853802aedf867fa/duckdb-1.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19d2c2f3cdf0242cad42e803602bbc2636706fc1d2d260ffac815ea2e3a018e8", size = 13727492, upload-time = "2025-11-12T13:16:49.097Z" }, - { url = "https://files.pythonhosted.org/packages/d6/d5/8f84b3685a8730f47e68bce46dbce789cb85c915a8c6aafdf85830589eb3/duckdb-1.4.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a496a04458590dcec8e928122ebe2ecbb42c3e1de4119f5461f7bf547acbe79", size = 18456479, upload-time = "2025-11-12T13:16:51.66Z" }, - { url = "https://files.pythonhosted.org/packages/30/7c/709a80e72a3bf013fa890fc767d2959a8a2a15abee4088559ddabcb9399f/duckdb-1.4.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c2315b693f201787c9892f31eb9a0484d3c648edb3578a86dc8c1284dd2873a", size = 20458319, upload-time = "2025-11-12T13:16:54.24Z" }, - { url = "https://files.pythonhosted.org/packages/93/ff/e0b0dd10e6da48a262f3e054378a3781febf28af3381c0e1e901d0390b3c/duckdb-1.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:bdd2d808806ceeeec33ba89665a0bb707af8815f2ca40e6c4c581966c0628ba1", size = 12320864, upload-time = "2025-11-12T13:16:56.798Z" }, { url = "https://files.pythonhosted.org/packages/c9/29/2f68c57e7c4242fedbf4b3fdc24fce2ffcf60640c936621d8a645593a161/duckdb-1.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9356fe17af2711e0a5ace4b20a0373e03163545fd7516e0c3c40428f44597052", size = 29015814, upload-time = "2025-11-12T13:16:59.329Z" }, { url = "https://files.pythonhosted.org/packages/34/b7/030cc278a4ae788800a833b2901b9a7da7a6993121053c4155c359328531/duckdb-1.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:946a8374c0252db3fa41165ab9952b48adc8de06561a6b5fd62025ac700e492f", size = 15403892, upload-time = "2025-11-12T13:17:02.141Z" }, { url = "https://files.pythonhosted.org/packages/f7/a2/67f4798a7a29bd0813f8a1e94a83e857e57f5d1ba14cf3edc5551aad0095/duckdb-1.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:389fa9abe4ca37d091332a2f8c3ebd713f18e87dc4cb5e8efd3e5aa8ddf8885f", size = 13733622, upload-time = "2025-11-12T13:17:04.502Z" }, @@ -577,13 +364,9 @@ name = "estimint" version = "1.4.0" source = { editable = "." } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "scipy" }, { name = "xgboost" }, ] @@ -592,6 +375,7 @@ all = [ { name = "appdirs" }, { name = "duckdb" }, { name = "matplotlib" }, + { name = "mintstate" }, { name = "pyarrow" }, { name = "requests" }, { name = "scikit-learn" }, @@ -609,7 +393,7 @@ download = [ { name = "requests" }, ] scenarios = [ - { name = "mintstate", marker = "python_full_version >= '3.12'" }, + { name = "mintstate" }, ] train = [ { name = "duckdb" }, @@ -622,26 +406,21 @@ viz = [ [package.metadata] requires-dist = [ - { name = "appdirs", marker = "extra == 'all'", specifier = ">=1.4.0" }, { name = "appdirs", marker = "extra == 'download'", specifier = ">=1.4.0" }, { name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" }, - { name = "duckdb", marker = "extra == 'all'", specifier = ">=0.8.0" }, { name = "duckdb", marker = "extra == 'train'", specifier = ">=0.8.0" }, + { name = "estimint", extras = ["train", "viz", "download", "scenarios"], marker = "extra == 'all'" }, { name = "flake8", marker = "extra == 'dev'", specifier = ">=6.0.0" }, { name = "isort", marker = "extra == 'dev'", specifier = ">=5.12.0" }, - { name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.4.0" }, { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.4.0" }, - { name = "mintstate", marker = "python_full_version >= '3.12' and extra == 'scenarios'", git = "https://github.com/mrc-ide/stateMINT.git?branch=mamba2-train" }, + { name = "mintstate", marker = "extra == 'scenarios'", specifier = ">=0.3.0" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, { name = "numpy", specifier = ">=1.20.0" }, { name = "pandas", specifier = ">=1.3.0" }, - { name = "pyarrow", marker = "extra == 'all'", specifier = ">=10.0.0" }, { name = "pyarrow", marker = "extra == 'train'", specifier = ">=10.0.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" }, - { name = "requests", marker = "extra == 'all'", specifier = ">=2.28.0" }, { name = "requests", marker = "extra == 'download'", specifier = ">=2.28.0" }, - { name = "scikit-learn", marker = "extra == 'all'", specifier = ">=1.0.0" }, { name = "scikit-learn", marker = "extra == 'train'", specifier = ">=1.0.0" }, { name = "scipy", specifier = ">=1.7.0" }, { name = "xgboost", specifier = ">=1.6.0" }, @@ -659,24 +438,12 @@ wheels = [ [package.optional-dependencies] epath = [ - { name = "fsspec", marker = "python_full_version >= '3.12'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, - { name = "zipp", marker = "python_full_version >= '3.12'" }, + { name = "fsspec" }, + { name = "typing-extensions" }, + { name = "zipp" }, ] epy = [ - { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, -] - -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, + { name = "typing-extensions" }, ] [[package]] @@ -707,16 +474,16 @@ name = "flax" version = "0.12.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jax", marker = "python_full_version >= '3.12'" }, - { name = "msgpack", marker = "python_full_version >= '3.12'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "optax", marker = "python_full_version >= '3.12'" }, - { name = "orbax-checkpoint", marker = "python_full_version >= '3.12'" }, - { name = "pyyaml", marker = "python_full_version >= '3.12'" }, - { name = "rich", marker = "python_full_version >= '3.12'" }, - { name = "tensorstore", marker = "python_full_version >= '3.12'" }, - { name = "treescope", marker = "python_full_version >= '3.12'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, + { name = "jax" }, + { name = "msgpack" }, + { name = "numpy" }, + { name = "optax" }, + { name = "orbax-checkpoint" }, + { name = "pyyaml" }, + { name = "rich" }, + { name = "tensorstore" }, + { name = "treescope" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/93/19/4a8e128e2296eede00dc7a8586d374ef0b2770146a5cda1f50aa86f001ee/flax-0.12.7.tar.gz", hash = "sha256:abfd6acb17d6b93d1d7d7dfae7d3856222b92b35d35ab2487b77639c31dc673a", size = 5476434, upload-time = "2026-04-22T06:07:12.017Z" } wheels = [ @@ -729,22 +496,6 @@ version = "4.61.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/f3/91bba2721fb173fc68e09d15b6ccf3ad4f83d127fbff579be7e5984888a6/fonttools-4.61.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dc25a4a9c1225653e4431a9413d0381b1c62317b0f543bdcec24e1991f612f33", size = 2850151, upload-time = "2025-11-28T17:04:14.214Z" }, - { url = "https://files.pythonhosted.org/packages/f5/8c/a1691dec01038ac7e7bb3ab83300dcc5087b11d8f48640928c02a873eb92/fonttools-4.61.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b493c32d2555e9944ec1b911ea649ff8f01a649ad9cba6c118d6798e932b3f0", size = 2389769, upload-time = "2025-11-28T17:04:16.443Z" }, - { url = "https://files.pythonhosted.org/packages/2d/dd/5bb369a44319d92ba25612511eb8ed2a6fa75239979e0388907525626902/fonttools-4.61.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad751319dc532a79bdf628b8439af167181b4210a0cd28a8935ca615d9fdd727", size = 4893189, upload-time = "2025-11-28T17:04:18.398Z" }, - { url = "https://files.pythonhosted.org/packages/5e/02/51373fa8846bd22bb54e5efb30a824b417b058083f775a194a432f21a45f/fonttools-4.61.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2de14557d113faa5fb519f7f29c3abe4d69c17fe6a5a2595cc8cda7338029219", size = 4854415, upload-time = "2025-11-28T17:04:20.421Z" }, - { url = "https://files.pythonhosted.org/packages/8b/64/9cdbbb804577a7e6191448851c57e6a36eb02aa4bf6a9668b528c968e44e/fonttools-4.61.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59587bbe455dbdf75354a9dbca1697a35a8903e01fab4248d6b98a17032cee52", size = 4870927, upload-time = "2025-11-28T17:04:22.625Z" }, - { url = "https://files.pythonhosted.org/packages/92/68/e40b22919dc96dc30a70b58fec609ab85112de950bdecfadf8dd478c5a88/fonttools-4.61.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:46cb3d9279f758ac0cf671dc3482da877104b65682679f01b246515db03dbb72", size = 4988674, upload-time = "2025-11-28T17:04:24.675Z" }, - { url = "https://files.pythonhosted.org/packages/9b/5c/e857349ce8aedb2451b9448282e86544b2b7f1c8b10ea0fe49b7cb369b72/fonttools-4.61.0-cp310-cp310-win32.whl", hash = "sha256:58b4f1b78dfbfe855bb8a6801b31b8cdcca0e2847ec769ad8e0b0b692832dd3b", size = 1497663, upload-time = "2025-11-28T17:04:26.598Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0c/62961d5fe6f764d6cbc387ef2c001f5f610808c7aded837409836c0b3e7c/fonttools-4.61.0-cp310-cp310-win_amd64.whl", hash = "sha256:68704a8bbe0b61976262b255e90cde593dc0fe3676542d9b4d846bad2a890a76", size = 1546143, upload-time = "2025-11-28T17:04:28.432Z" }, - { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" }, - { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" }, - { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" }, - { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" }, - { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" }, - { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" }, { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" }, { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" }, { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" }, @@ -835,8 +586,8 @@ name = "httpcore" version = "1.0.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi", marker = "python_full_version >= '3.12'" }, - { name = "h11", marker = "python_full_version >= '3.12'" }, + { name = "certifi" }, + { name = "h11" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } wheels = [ @@ -848,10 +599,10 @@ name = "httpx" version = "0.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", marker = "python_full_version >= '3.12'" }, - { name = "certifi", marker = "python_full_version >= '3.12'" }, - { name = "httpcore", marker = "python_full_version >= '3.12'" }, - { name = "idna", marker = "python_full_version >= '3.12'" }, + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } wheels = [ @@ -863,16 +614,16 @@ name = "huggingface-hub" version = "1.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "filelock", marker = "python_full_version >= '3.12'" }, - { name = "fsspec", marker = "python_full_version >= '3.12'" }, - { name = "hf-xet", marker = "(python_full_version >= '3.12' and platform_machine == 'AMD64') or (python_full_version >= '3.12' and platform_machine == 'aarch64') or (python_full_version >= '3.12' and platform_machine == 'amd64') or (python_full_version >= '3.12' and platform_machine == 'arm64') or (python_full_version >= '3.12' and platform_machine == 'x86_64')" }, - { name = "httpx", marker = "python_full_version >= '3.12'" }, - { name = "packaging", marker = "python_full_version >= '3.12'" }, - { name = "pyyaml", marker = "python_full_version >= '3.12'" }, - { name = "tqdm", marker = "python_full_version >= '3.12'" }, - { name = "typer", marker = "python_full_version >= '3.12'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, + { name = "click" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "tqdm" }, + { name = "typer" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e6/7e/fad82ad491b226e832d2da90a1a59f36acd4526cda8c726f639834754aa4/huggingface_hub-1.20.1.tar.gz", hash = "sha256:9f6d63bfbeab2d2a8357200a9bc4f18cd2c8bfac9579f792f5922e77bf6471d0", size = 859910, upload-time = "2026-06-18T22:06:53.348Z" } wheels = [ @@ -920,11 +671,11 @@ name = "jax" version = "0.10.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jaxlib", marker = "python_full_version >= '3.12'" }, - { name = "ml-dtypes", marker = "python_full_version >= '3.12'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "opt-einsum", marker = "python_full_version >= '3.12'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "jaxlib" }, + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "opt-einsum" }, + { name = "scipy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d2/73/eb91d98fcadfa2cbcfdd4e417ab116e47eb20882acc5ee678e47c35d6b57/jax-0.10.2.tar.gz", hash = "sha256:bf77428a8c2e6904c4f46d5ab12aa5cfc6cad2179f07f7e4c0fc75ac86ef0639", size = 2775110, upload-time = "2026-06-17T23:44:57.818Z" } wheels = [ @@ -936,15 +687,11 @@ name = "jaxlib" version = "0.10.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ml-dtypes", marker = "python_full_version >= '3.12'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "scipy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/2c/7038fc73154307389631b5b2dbe5ac529e1918eecc19a27e6644ad114bbf/jaxlib-0.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5a98873fc867623b81f2bee15d554b8edd6588a183d01fa50d21b1e3db96ff2b", size = 61429039, upload-time = "2026-06-17T23:43:44.858Z" }, - { url = "https://files.pythonhosted.org/packages/66/c6/d69a0a33046f84930b89387861c061996d5207671b35080898679ca9960a/jaxlib-0.10.2-cp311-cp311-manylinux_2_27_aarch64.whl", hash = "sha256:d44565dcfd1b4f60f76d911c6512118a8a4fc764bdef92663fecb8bfccd54f23", size = 81079180, upload-time = "2026-06-17T23:43:48.245Z" }, - { url = "https://files.pythonhosted.org/packages/e2/27/fb54e3265c0ffcb687f93e9fb761c589acebbe958c3fed1b2c74c3f0e782/jaxlib-0.10.2-cp311-cp311-manylinux_2_27_x86_64.whl", hash = "sha256:1faca3c5d4662cb4a6130a68105d68bb520764817e165d6eebfd6786c0d1f30f", size = 85448560, upload-time = "2026-06-17T23:43:51.724Z" }, - { url = "https://files.pythonhosted.org/packages/21/bc/31fbb3d892c3cb97c73af9226eca63d60d8e224017145bdb6871d1d24da6/jaxlib-0.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:e7a9214e6b0b9e0825d905573d1bbf2253c20e9d7464a63e085b60519975553f", size = 65867603, upload-time = "2026-06-17T23:43:54.939Z" }, { url = "https://files.pythonhosted.org/packages/ca/93/ee9cc8743191544f65d26ab7eeb82d65968fe60905662d1a5554d056654b/jaxlib-0.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47bb7c011515ea862be7e8313f40f9c56cbec09dc98a0fcb5016785fcd454c01", size = 61434612, upload-time = "2026-06-17T23:43:57.808Z" }, { url = "https://files.pythonhosted.org/packages/11/06/8cc36021bf74d617c312eeed94c280282bb1bcbb32b63f2a42b10ae41575/jaxlib-0.10.2-cp312-cp312-manylinux_2_27_aarch64.whl", hash = "sha256:53b72977ae582c03a9e8e1cdee1efbf8ebc1418270965b0e69eade57acf40331", size = 81085366, upload-time = "2026-06-17T23:44:01.067Z" }, { url = "https://files.pythonhosted.org/packages/48/17/38b718af2353dba7753300871e83fbb64a88a772e12727ae27373ab675ce/jaxlib-0.10.2-cp312-cp312-manylinux_2_27_x86_64.whl", hash = "sha256:fe88ec443714c4379968b6c109f9fa617c7ad19b802828e4d7bf861cd66da4b7", size = 85467828, upload-time = "2026-06-17T23:44:04.238Z" }, @@ -970,7 +717,7 @@ name = "jaxtyping" version = "0.3.11" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "wadler-lindig", marker = "python_full_version >= '3.12'" }, + { name = "wadler-lindig" }, ] sdist = { url = "https://files.pythonhosted.org/packages/91/c1/091b8852bd7cbf50bd655543c8506033cf4029300c67f8c176c1286879a9/jaxtyping-0.3.11.tar.gz", hash = "sha256:b09c14acf6686feb9e0df5b0d8c6e7c5b6f8d36bf059ee54cd522a186c2ef050", size = 46489, upload-time = "2026-06-13T18:35:23.167Z" } wheels = [ @@ -992,32 +739,6 @@ version = "1.4.9" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, - { url = "https://files.pythonhosted.org/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", size = 66578, upload-time = "2025-08-10T21:25:36.73Z" }, - { url = "https://files.pythonhosted.org/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", size = 65312, upload-time = "2025-08-10T21:25:37.658Z" }, - { url = "https://files.pythonhosted.org/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", size = 1628458, upload-time = "2025-08-10T21:25:39.067Z" }, - { url = "https://files.pythonhosted.org/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", size = 1225640, upload-time = "2025-08-10T21:25:40.489Z" }, - { url = "https://files.pythonhosted.org/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", size = 1244074, upload-time = "2025-08-10T21:25:42.221Z" }, - { url = "https://files.pythonhosted.org/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", size = 1293036, upload-time = "2025-08-10T21:25:43.801Z" }, - { url = "https://files.pythonhosted.org/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", size = 2175310, upload-time = "2025-08-10T21:25:45.045Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", size = 2270943, upload-time = "2025-08-10T21:25:46.393Z" }, - { url = "https://files.pythonhosted.org/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", size = 2440488, upload-time = "2025-08-10T21:25:48.074Z" }, - { url = "https://files.pythonhosted.org/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", size = 2246787, upload-time = "2025-08-10T21:25:49.442Z" }, - { url = "https://files.pythonhosted.org/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", size = 73730, upload-time = "2025-08-10T21:25:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", size = 65036, upload-time = "2025-08-10T21:25:52.063Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, - { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, - { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, - { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, - { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, - { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, - { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, @@ -1082,16 +803,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, - { url = "https://files.pythonhosted.org/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", size = 60183, upload-time = "2025-08-10T21:27:37.669Z" }, - { url = "https://files.pythonhosted.org/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", size = 58675, upload-time = "2025-08-10T21:27:39.031Z" }, - { url = "https://files.pythonhosted.org/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", size = 80277, upload-time = "2025-08-10T21:27:40.129Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", size = 77994, upload-time = "2025-08-10T21:27:41.181Z" }, - { url = "https://files.pythonhosted.org/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", size = 73744, upload-time = "2025-08-10T21:27:42.254Z" }, - { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, - { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, - { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, ] [[package]] @@ -1100,27 +811,6 @@ version = "0.6.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/37/c3/cdff3c10e2e608490dc0a310ccf11ba777b3943ad4fcead2a2ade98c21e1/librt-0.6.3.tar.gz", hash = "sha256:c724a884e642aa2bbad52bb0203ea40406ad742368a5f90da1b220e970384aae", size = 54209, upload-time = "2025-11-29T14:01:56.058Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/84/859df8db21dedab2538ddfbe1d486dda3eb66a98c6ad7ba754a99e25e45e/librt-0.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45660d26569cc22ed30adf583389d8a0d1b468f8b5e518fcf9bfe2cd298f9dd1", size = 27294, upload-time = "2025-11-29T14:00:35.053Z" }, - { url = "https://files.pythonhosted.org/packages/f7/01/ec3971cf9c4f827f17de6729bdfdbf01a67493147334f4ef8fac68936e3a/librt-0.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:54f3b2177fb892d47f8016f1087d21654b44f7fc4cf6571c1c6b3ea531ab0fcf", size = 27635, upload-time = "2025-11-29T14:00:36.496Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f9/3efe201df84dd26388d2e0afa4c4dc668c8e406a3da7b7319152faf835a1/librt-0.6.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c5b31bed2c2f2fa1fcb4815b75f931121ae210dc89a3d607fb1725f5907f1437", size = 81768, upload-time = "2025-11-29T14:00:37.451Z" }, - { url = "https://files.pythonhosted.org/packages/0a/13/f63e60bc219b17f3d8f3d13423cd4972e597b0321c51cac7bfbdd5e1f7b9/librt-0.6.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f8ed5053ef9fb08d34f1fd80ff093ccbd1f67f147633a84cf4a7d9b09c0f089", size = 85884, upload-time = "2025-11-29T14:00:38.433Z" }, - { url = "https://files.pythonhosted.org/packages/c2/42/0068f14f39a79d1ce8a19d4988dd07371df1d0a7d3395fbdc8a25b1c9437/librt-0.6.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3f0e4bd9bcb0ee34fa3dbedb05570da50b285f49e52c07a241da967840432513", size = 85830, upload-time = "2025-11-29T14:00:39.418Z" }, - { url = "https://files.pythonhosted.org/packages/14/1c/87f5af3a9e6564f09e50c72f82fc3057fd42d1facc8b510a707d0438c4ad/librt-0.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8f89c8d20dfa648a3f0a56861946eb00e5b00d6b00eea14bc5532b2fcfa8ef1", size = 88086, upload-time = "2025-11-29T14:00:40.555Z" }, - { url = "https://files.pythonhosted.org/packages/05/e5/22153b98b88a913b5b3f266f12e57df50a2a6960b3f8fcb825b1a0cfe40a/librt-0.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ecc2c526547eacd20cb9fbba19a5268611dbc70c346499656d6cf30fae328977", size = 86470, upload-time = "2025-11-29T14:00:41.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/3c/ea1edb587799b1edcc22444e0630fa422e32d7aaa5bfb5115b948acc2d1c/librt-0.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fbedeb9b48614d662822ee514567d2d49a8012037fc7b4cd63f282642c2f4b7d", size = 89079, upload-time = "2025-11-29T14:00:42.882Z" }, - { url = "https://files.pythonhosted.org/packages/73/ad/50bb4ae6b07c9f3ab19653e0830a210533b30eb9a18d515efb5a2b9d0c7c/librt-0.6.3-cp310-cp310-win32.whl", hash = "sha256:0765b0fe0927d189ee14b087cd595ae636bef04992e03fe6dfdaa383866c8a46", size = 19820, upload-time = "2025-11-29T14:00:44.211Z" }, - { url = "https://files.pythonhosted.org/packages/7a/12/7426ee78f3b1dbe11a90619d54cb241ca924ca3c0ff9ade3992178e9b440/librt-0.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:8c659f9fb8a2f16dc4131b803fa0144c1dadcb3ab24bb7914d01a6da58ae2457", size = 21332, upload-time = "2025-11-29T14:00:45.427Z" }, - { url = "https://files.pythonhosted.org/packages/8b/80/bc60fd16fe24910bf5974fb914778a2e8540cef55385ab2cb04a0dfe42c4/librt-0.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:61348cc488b18d1b1ff9f3e5fcd5ac43ed22d3e13e862489d2267c2337285c08", size = 27285, upload-time = "2025-11-29T14:00:46.626Z" }, - { url = "https://files.pythonhosted.org/packages/88/3c/26335536ed9ba097c79cffcee148393592e55758fe76d99015af3e47a6d0/librt-0.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64645b757d617ad5f98c08e07620bc488d4bced9ced91c6279cec418f16056fa", size = 27629, upload-time = "2025-11-29T14:00:47.863Z" }, - { url = "https://files.pythonhosted.org/packages/af/fd/2dcedeacfedee5d2eda23e7a49c1c12ce6221b5d58a13555f053203faafc/librt-0.6.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:26b8026393920320bb9a811b691d73c5981385d537ffc5b6e22e53f7b65d4122", size = 82039, upload-time = "2025-11-29T14:00:49.131Z" }, - { url = "https://files.pythonhosted.org/packages/48/ff/6aa11914b83b0dc2d489f7636942a8e3322650d0dba840db9a1b455f3caa/librt-0.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d998b432ed9ffccc49b820e913c8f327a82026349e9c34fa3690116f6b70770f", size = 86560, upload-time = "2025-11-29T14:00:50.403Z" }, - { url = "https://files.pythonhosted.org/packages/76/a1/d25af61958c2c7eb978164aeba0350719f615179ba3f428b682b9a5fdace/librt-0.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e18875e17ef69ba7dfa9623f2f95f3eda6f70b536079ee6d5763ecdfe6cc9040", size = 86494, upload-time = "2025-11-29T14:00:51.383Z" }, - { url = "https://files.pythonhosted.org/packages/7d/4b/40e75d3b258c801908e64b39788f9491635f9554f8717430a491385bd6f2/librt-0.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a218f85081fc3f70cddaed694323a1ad7db5ca028c379c214e3a7c11c0850523", size = 88914, upload-time = "2025-11-29T14:00:52.688Z" }, - { url = "https://files.pythonhosted.org/packages/97/6d/0070c81aba8a169224301c75fb5fb6c3c25ca67e6ced086584fc130d5a67/librt-0.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ef42ff4edd369e84433ce9b188a64df0837f4f69e3d34d3b34d4955c599d03f", size = 86944, upload-time = "2025-11-29T14:00:53.768Z" }, - { url = "https://files.pythonhosted.org/packages/a6/94/809f38887941b7726692e0b5a083dbdc87dbb8cf893e3b286550c5f0b129/librt-0.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e0f2b79993fec23a685b3e8107ba5f8675eeae286675a216da0b09574fa1e47", size = 89852, upload-time = "2025-11-29T14:00:54.71Z" }, - { url = "https://files.pythonhosted.org/packages/58/a3/b0e5b1cda675b91f1111d8ba941da455d8bfaa22f4d2d8963ba96ccb5b12/librt-0.6.3-cp311-cp311-win32.whl", hash = "sha256:fd98cacf4e0fabcd4005c452cb8a31750258a85cab9a59fb3559e8078da408d7", size = 19948, upload-time = "2025-11-29T14:00:55.989Z" }, - { url = "https://files.pythonhosted.org/packages/cc/73/70011c2b37e3be3ece3affd3abc8ebe5cda482b03fd6b3397906321a901e/librt-0.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:e17b5b42c8045867ca9d1f54af00cc2275198d38de18545edaa7833d7e9e4ac8", size = 21406, upload-time = "2025-11-29T14:00:56.874Z" }, - { url = "https://files.pythonhosted.org/packages/91/ee/119aa759290af6ca0729edf513ca390c1afbeae60f3ecae9b9d56f25a8a9/librt-0.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:87597e3d57ec0120a3e1d857a708f80c02c42ea6b00227c728efbc860f067c45", size = 20875, upload-time = "2025-11-29T14:00:57.752Z" }, { url = "https://files.pythonhosted.org/packages/b4/2c/b59249c566f98fe90e178baf59e83f628d6c38fb8bc78319301fccda0b5e/librt-0.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74418f718083009108dc9a42c21bf2e4802d49638a1249e13677585fcc9ca176", size = 27841, upload-time = "2025-11-29T14:00:58.925Z" }, { url = "https://files.pythonhosted.org/packages/40/e8/9db01cafcd1a2872b76114c858f81cc29ce7ad606bc102020d6dabf470fb/librt-0.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:514f3f363d1ebc423357d36222c37e5c8e6674b6eae8d7195ac9a64903722057", size = 27844, upload-time = "2025-11-29T14:01:00.2Z" }, { url = "https://files.pythonhosted.org/packages/59/4d/da449d3a7d83cc853af539dee42adc37b755d7eea4ad3880bacfd84b651d/librt-0.6.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cf1115207a5049d1f4b7b4b72de0e52f228d6c696803d94843907111cbf80610", size = 84091, upload-time = "2025-11-29T14:01:01.118Z" }, @@ -1172,10 +862,10 @@ name = "mamba2-jax" version = "1.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "flax", marker = "python_full_version >= '3.12'" }, - { name = "jax", marker = "python_full_version >= '3.12'" }, - { name = "jaxlib", marker = "python_full_version >= '3.12'" }, - { name = "optax", marker = "python_full_version >= '3.12'" }, + { name = "flax" }, + { name = "jax" }, + { name = "jaxlib" }, + { name = "optax" }, ] sdist = { url = "https://files.pythonhosted.org/packages/17/c1/f5a9a7af5c852ef17c01512accba38e0b9b963a4421a274fe6a012d678a8/mamba2_jax-1.1.2.tar.gz", hash = "sha256:8113ad7236128b52806a8055afe6d5cbf1d17288e4e980ba3529942b26cd7daf", size = 24843, upload-time = "2026-06-23T14:44:46.957Z" } wheels = [ @@ -1187,7 +877,7 @@ name = "markdown-it-py" version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mdurl", marker = "python_full_version >= '3.12'" }, + { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ @@ -1199,14 +889,11 @@ name = "matplotlib" version = "3.10.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "contourpy" }, { name = "cycler" }, { name = "fonttools" }, { name = "kiwisolver" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy" }, { name = "packaging" }, { name = "pillow" }, { name = "pyparsing" }, @@ -1214,19 +901,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/87/3932d5778ab4c025db22710b61f49ccaed3956c5cf46ffb2ffa7492b06d9/matplotlib-3.10.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ac81eee3b7c266dd92cee1cd658407b16c57eed08c7421fa354ed68234de380", size = 8247141, upload-time = "2025-10-09T00:26:06.023Z" }, - { url = "https://files.pythonhosted.org/packages/45/a8/bfed45339160102bce21a44e38a358a1134a5f84c26166de03fb4a53208f/matplotlib-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667ecd5d8d37813a845053d8f5bf110b534c3c9f30e69ebd25d4701385935a6d", size = 8107995, upload-time = "2025-10-09T00:26:08.669Z" }, - { url = "https://files.pythonhosted.org/packages/e2/3c/5692a2d9a5ba848fda3f48d2b607037df96460b941a59ef236404b39776b/matplotlib-3.10.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1c51b846aca49a5a8b44fbba6a92d583a35c64590ad9e1e950dc88940a4297", size = 8680503, upload-time = "2025-10-09T00:26:10.607Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a0/86ace53c48b05d0e6e9c127b2ace097434901f3e7b93f050791c8243201a/matplotlib-3.10.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a11c2e9e72e7de09b7b72e62f3df23317c888299c875e2b778abf1eda8c0a42", size = 9514982, upload-time = "2025-10-09T00:26:12.594Z" }, - { url = "https://files.pythonhosted.org/packages/a6/81/ead71e2824da8f72640a64166d10e62300df4ae4db01a0bac56c5b39fa51/matplotlib-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f19410b486fdd139885ace124e57f938c1e6a3210ea13dd29cab58f5d4bc12c7", size = 9566429, upload-time = "2025-10-09T00:26:14.758Z" }, - { url = "https://files.pythonhosted.org/packages/65/7d/954b3067120456f472cce8fdcacaf4a5fcd522478db0c37bb243c7cb59dd/matplotlib-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:b498e9e4022f93de2d5a37615200ca01297ceebbb56fe4c833f46862a490f9e3", size = 8108174, upload-time = "2025-10-09T00:26:17.015Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bc/0fb489005669127ec13f51be0c6adc074d7cf191075dab1da9fe3b7a3cfc/matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a", size = 8257507, upload-time = "2025-10-09T00:26:19.073Z" }, - { url = "https://files.pythonhosted.org/packages/e2/6a/d42588ad895279ff6708924645b5d2ed54a7fb2dc045c8a804e955aeace1/matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6", size = 8119565, upload-time = "2025-10-09T00:26:21.023Z" }, - { url = "https://files.pythonhosted.org/packages/10/b7/4aa196155b4d846bd749cf82aa5a4c300cf55a8b5e0dfa5b722a63c0f8a0/matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a", size = 8692668, upload-time = "2025-10-09T00:26:22.967Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e7/664d2b97016f46683a02d854d730cfcf54ff92c1dafa424beebef50f831d/matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1", size = 9521051, upload-time = "2025-10-09T00:26:25.041Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a3/37aef1404efa615f49b5758a5e0261c16dd88f389bc1861e722620e4a754/matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc", size = 9576878, upload-time = "2025-10-09T00:26:27.478Z" }, - { url = "https://files.pythonhosted.org/packages/33/cd/b145f9797126f3f809d177ca378de57c45413c5099c5990de2658760594a/matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e", size = 8115142, upload-time = "2025-10-09T00:26:29.774Z" }, - { url = "https://files.pythonhosted.org/packages/2e/39/63bca9d2b78455ed497fcf51a9c71df200a11048f48249038f06447fa947/matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9", size = 7992439, upload-time = "2025-10-09T00:26:40.32Z" }, { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" }, { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" }, { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" }, @@ -1262,12 +936,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/a5/85e2edf76ea0ad4288d174926d9454ea85f3ce5390cc4e6fab196cbf250b/matplotlib-3.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:702590829c30aada1e8cef0568ddbffa77ca747b4d6e36c6d173f66e301f89cc", size = 9594066, upload-time = "2025-10-09T00:27:43.694Z" }, { url = "https://files.pythonhosted.org/packages/39/69/9684368a314f6d83fe5c5ad2a4121a3a8e03723d2e5c8ea17b66c1bad0e7/matplotlib-3.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:f79d5de970fc90cd5591f60053aecfce1fcd736e0303d9f0bf86be649fa68fb8", size = 8342832, upload-time = "2025-10-09T00:27:45.543Z" }, { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6c/a9bcf03e9afb2a873e0a5855f79bce476d1023f26f8212969f2b7504756c/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5c09cf8f2793f81368f49f118b6f9f937456362bee282eac575cca7f84cda537", size = 8241204, upload-time = "2025-10-09T00:27:48.806Z" }, - { url = "https://files.pythonhosted.org/packages/5b/fd/0e6f5aa762ed689d9fa8750b08f1932628ffa7ed30e76423c399d19407d2/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de66744b2bb88d5cd27e80dfc2ec9f0517d0a46d204ff98fe9e5f2864eb67657", size = 8104607, upload-time = "2025-10-09T00:27:50.876Z" }, - { url = "https://files.pythonhosted.org/packages/b9/a9/21c9439d698fac5f0de8fc68b2405b738ed1f00e1279c76f2d9aa5521ead/matplotlib-3.10.7-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53cc80662dd197ece414dd5b66e07370201515a3eaf52e7c518c68c16814773b", size = 8682257, upload-time = "2025-10-09T00:27:52.597Z" }, - { url = "https://files.pythonhosted.org/packages/58/8f/76d5dc21ac64a49e5498d7f0472c0781dae442dd266a67458baec38288ec/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0", size = 8252283, upload-time = "2025-10-09T00:27:54.739Z" }, - { url = "https://files.pythonhosted.org/packages/27/0d/9c5d4c2317feb31d819e38c9f947c942f42ebd4eb935fc6fd3518a11eaa7/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68", size = 8116733, upload-time = "2025-10-09T00:27:56.406Z" }, - { url = "https://files.pythonhosted.org/packages/9a/cc/3fe688ff1355010937713164caacf9ed443675ac48a997bab6ed23b3f7c0/matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91", size = 8693919, upload-time = "2025-10-09T00:27:58.41Z" }, ] [[package]] @@ -1290,19 +958,23 @@ wheels = [ [[package]] name = "mintstate" -version = "0.2.1.dev2+g3cc9c6381" -source = { git = "https://github.com/mrc-ide/stateMINT.git?branch=mamba2-train#3cc9c6381cbe4d359a20762f8e11e279976aac48" } +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "etils", marker = "python_full_version >= '3.12'" }, - { name = "flax", marker = "python_full_version >= '3.12'" }, - { name = "huggingface-hub", marker = "python_full_version >= '3.12'" }, - { name = "jax", marker = "python_full_version >= '3.12'" }, - { name = "jaxtyping", marker = "python_full_version >= '3.12'" }, - { name = "mamba2-jax", marker = "python_full_version >= '3.12'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "omegaconf", marker = "python_full_version >= '3.12'" }, - { name = "orbax-checkpoint", marker = "python_full_version >= '3.12'" }, - { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "etils" }, + { name = "flax" }, + { name = "huggingface-hub" }, + { name = "jax" }, + { name = "jaxtyping" }, + { name = "mamba2-jax" }, + { name = "numpy" }, + { name = "omegaconf" }, + { name = "orbax-checkpoint" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c4/37e514081f4b6ba8f65c52aa255ad0da522e7fb9953f51318f1d63b06d86/mintstate-0.3.0.tar.gz", hash = "sha256:6a8532864c69ca1023edca480e3deb3b9be300ce4e46c6b6b7e0bd71a78585a5", size = 367958, upload-time = "2026-06-24T13:24:03.617Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ca/50c3f273c42b8cedd49bf1c0f001fe8ac0daca66530dc1164a6125df6812/mintstate-0.3.0-py3-none-any.whl", hash = "sha256:424f29d909e2df11fb0045292c2e58afd7f0196f36e19ba41867e8cb71a04c5c", size = 35666, upload-time = "2026-06-24T13:24:02.596Z" }, ] [[package]] @@ -1310,19 +982,10 @@ name = "ml-dtypes" version = "0.5.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/3a/c5b855752a70267ff729c349e650263adb3c206c29d28cc8ea7ace30a1d5/ml_dtypes-0.5.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b95e97e470fe60ed493fd9ae3911d8da4ebac16bd21f87ffa2b7c588bf22ea2c", size = 679735, upload-time = "2025-11-17T22:31:31.367Z" }, - { url = "https://files.pythonhosted.org/packages/41/79/7433f30ee04bd4faa303844048f55e1eb939131c8e5195a00a96a0939b64/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4b801ebe0b477be666696bda493a9be8356f1f0057a57f1e35cd26928823e5a", size = 5051883, upload-time = "2025-11-17T22:31:33.658Z" }, - { url = "https://files.pythonhosted.org/packages/10/b1/8938e8830b0ee2e167fc75a094dea766a1152bde46752cd9bfc57ee78a82/ml_dtypes-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:388d399a2152dd79a3f0456a952284a99ee5c93d3e2f8dfe25977511e0515270", size = 5030369, upload-time = "2025-11-17T22:31:35.595Z" }, - { url = "https://files.pythonhosted.org/packages/c7/a3/51886727bd16e2f47587997b802dd56398692ce8c6c03c2e5bb32ecafe26/ml_dtypes-0.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:4ff7f3e7ca2972e7de850e7b8fcbb355304271e2933dd90814c1cb847414d6e2", size = 210738, upload-time = "2025-11-17T22:31:37.43Z" }, - { url = "https://files.pythonhosted.org/packages/c6/5e/712092cfe7e5eb667b8ad9ca7c54442f21ed7ca8979745f1000e24cf8737/ml_dtypes-0.5.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6c7ecb74c4bd71db68a6bea1edf8da8c34f3d9fe218f038814fd1d310ac76c90", size = 679734, upload-time = "2025-11-17T22:31:39.223Z" }, - { url = "https://files.pythonhosted.org/packages/4f/cf/912146dfd4b5c0eea956836c01dcd2fce6c9c844b2691f5152aca196ce4f/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc11d7e8c44a65115d05e2ab9989d1e045125d7be8e05a071a48bc76eb6d6040", size = 5056165, upload-time = "2025-11-17T22:31:41.071Z" }, - { url = "https://files.pythonhosted.org/packages/a9/80/19189ea605017473660e43762dc853d2797984b3c7bf30ce656099add30c/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b9a53598f21e453ea2fbda8aa783c20faff8e1eeb0d7ab899309a0053f1483", size = 5034975, upload-time = "2025-11-17T22:31:42.758Z" }, - { url = "https://files.pythonhosted.org/packages/b4/24/70bd59276883fdd91600ca20040b41efd4902a923283c4d6edcb1de128d2/ml_dtypes-0.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:7c23c54a00ae43edf48d44066a7ec31e05fdc2eee0be2b8b50dd1903a1db94bb", size = 210742, upload-time = "2025-11-17T22:31:44.068Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c9/64230ef14e40aa3f1cb254ef623bf812735e6bec7772848d19131111ac0d/ml_dtypes-0.5.4-cp311-cp311-win_arm64.whl", hash = "sha256:557a31a390b7e9439056644cb80ed0735a6e3e3bb09d67fd5687e4b04238d1de", size = 160709, upload-time = "2025-11-17T22:31:46.557Z" }, { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, @@ -1356,27 +1019,6 @@ version = "1.2.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/16/f70100614b69feb3ade7285f08c9c52d6cda0a5c03f3f5e2facd63acb211/msgpack-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c7b398c56ff125feae96c2737abfec5595f1fa0aa186df60c56040b8accb95c", size = 82926, upload-time = "2026-06-18T16:12:31.531Z" }, - { url = "https://files.pythonhosted.org/packages/e4/3c/08ecd5cdfe4e2de43aec79062028ad0f7b2d9b1fea5430068c198ba570da/msgpack-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1548006a91aa93c5da81f3bdcebc1a0d10cea2d25969754fbe848da622b2b895", size = 82730, upload-time = "2026-06-18T16:12:32.894Z" }, - { url = "https://files.pythonhosted.org/packages/19/9f/a70c9cb1a04ecc134005149367dcfe35d167284e8f65035a1e4156ad17b5/msgpack-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dabedcd0f23559f3596428c6589c1cd8c6eaed3a0d720795b07b0225d769203", size = 400729, upload-time = "2026-06-18T16:12:34.052Z" }, - { url = "https://files.pythonhosted.org/packages/fa/7f/5ce020168cf0439041526e95aa068c722c016aee21624e331aeabeee2e8e/msgpack-1.2.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83efa1c898e0fc5380fc0cabbf75164c52e3b5cbb45973710d75821928380c73", size = 407625, upload-time = "2026-06-18T16:12:35.239Z" }, - { url = "https://files.pythonhosted.org/packages/79/70/fb7668ce0386819303047057aef6fc1da73b584291d9cff82b821744e2ef/msgpack-1.2.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01e2dd6c9b19d333a00282330cc8a73d38d8dabc306dc5b42cd668c3ac82e833", size = 377891, upload-time = "2026-06-18T16:12:36.684Z" }, - { url = "https://files.pythonhosted.org/packages/3d/dc/9ebe654a73c3aed2e40aa6b52e3c2a02b5f53ef0085fa235a45d5b367f87/msgpack-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:350cb813d0af6e65d2f7ef0d729f7ff5be5a8bce03665892f43e5883d4ecc1b8", size = 391987, upload-time = "2026-06-18T16:12:37.839Z" }, - { url = "https://files.pythonhosted.org/packages/42/eb/b67cf64218a2fa25e1c671fe1d3dbb06cbeb973e71bc4b822da079862d0b/msgpack-1.2.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ee1d9ed27d0497b848923746cf762ed2e7db24f4be7eec8e5cbe8c766aa707b7", size = 374603, upload-time = "2026-06-18T16:12:39.221Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2e/9ee200cde32fd1a0101b4006202fde554c1860adfb9bf7bff31ea4c08df8/msgpack-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:633727297ed063441fd1cda2288865487f33ad14eeb8831afb5f0c396a62cfce", size = 405121, upload-time = "2026-06-18T16:12:40.524Z" }, - { url = "https://files.pythonhosted.org/packages/43/b6/f10117be7ca7a51e8feed699a907b8e663a8cd66e115ae6b4fb30cc7945c/msgpack-1.2.1-cp310-cp310-win32.whl", hash = "sha256:298872ecf9e61950f1c6af4ca969b859ee91783bb920ef6e6172697d0c8aad74", size = 64088, upload-time = "2026-06-18T16:12:41.762Z" }, - { url = "https://files.pythonhosted.org/packages/ba/93/89976c696fb0224662239d952c47b4d1661b34d79a332ef5584facaa8579/msgpack-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2ff164c1b0bcb740b073b99e945234d0212852fa378e44a208c425379140dbeb", size = 70113, upload-time = "2026-06-18T16:12:42.78Z" }, - { url = "https://files.pythonhosted.org/packages/f4/6b/e9b1cdc042c4458801d2545ed782a95f3d6ba8e270cce8745b8603c7f748/msgpack-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29a3f6e9667868429d8240dfd063ea5ffdc1321c13d783aa23827a38de0dcb22", size = 82812, upload-time = "2026-06-18T16:12:45.022Z" }, - { url = "https://files.pythonhosted.org/packages/0c/3a/dd518a1bf78ed1e9ad8afe57307c079a00eafe4b3068932a27ca1ea56b4f/msgpack-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aded5bdf32609dc7987a49bbbd15a8ef096193f96dd8bbeb791de729e650acf5", size = 82739, upload-time = "2026-06-18T16:12:46.025Z" }, - { url = "https://files.pythonhosted.org/packages/70/e0/7ba9e1542bf0771a27b8b37c1316e3f95ae9d748fd765284655c476ad4ef/msgpack-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:146ee4e9ce80b365c6d4c47073da9da7bcec473e58194ceee5dd7620ace77e06", size = 414233, upload-time = "2026-06-18T16:12:47.029Z" }, - { url = "https://files.pythonhosted.org/packages/03/8d/671d81534ea0e2b0e8a121be100020da09eb78861fe3aa8f3ef7dcd3bed1/msgpack-1.2.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a28d076ca7c82b9c8728ad90b7147489449557038bed50e4241eb832395169b4", size = 423843, upload-time = "2026-06-18T16:12:48.19Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b6/e5c737515ed1f166664b87601b532f58cbb73d8aa6a90b99f7c2c5037e8e/msgpack-1.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7d31c0ac0c640f877804c67cb2bc9f4e23dc2db97e96c2e67fa27d38283b41f8", size = 390772, upload-time = "2026-06-18T16:12:49.624Z" }, - { url = "https://files.pythonhosted.org/packages/a8/46/62ed8c2e87d7021eab19921594d961ef3aa3794eec76c716dc30f3bfd433/msgpack-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ff92d7feeaf5bc26c51495b69e2f99ed97ab79346fb6555f44be7dd2ac6503b", size = 409559, upload-time = "2026-06-18T16:12:50.936Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/59aa3887b860bbf43532835e192b1c388a17590d6068ae4f8b2bc74c906e/msgpack-1.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:779197a6513bab3c3632265e3d0f7cb3227e62510841a6f34f1eaa37efbb345e", size = 387838, upload-time = "2026-06-18T16:12:52.161Z" }, - { url = "https://files.pythonhosted.org/packages/09/11/f8563e471093420cf6478cb3271a0175d8402b82d879783d4035d2d03360/msgpack-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:67f6dd22fa72a93752643f07889796d62739a13415ee630169a8ce764f86cf9f", size = 421732, upload-time = "2026-06-18T16:12:53.556Z" }, - { url = "https://files.pythonhosted.org/packages/57/cf/e673683c4c6c90c1022b24c65af4b03eda72b182a1176ef6449069d66acc/msgpack-1.2.1-cp311-cp311-win32.whl", hash = "sha256:91054a783328e0ea7954b8771095705c8d2243b814743fbaadf14552c9c52c5d", size = 64091, upload-time = "2026-06-18T16:12:54.821Z" }, - { url = "https://files.pythonhosted.org/packages/3f/07/ca212739d179f9083bff2c7c08c24101c3555a334fadc2b876b18768a3ae/msgpack-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2eda0b7ebb1283a98d3e4492ac933c8af6aff59fd3df1c3ed024f536af4b1dc8", size = 70462, upload-time = "2026-06-18T16:12:55.898Z" }, - { url = "https://files.pythonhosted.org/packages/6d/be/6798347b425e26f35db82e69dd83c09716c856a3714e7bffc4c0860fd830/msgpack-1.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ee967f7c7e1df2890c671ff2ee51a28ded0efc95da3e507176dee881ce36c66", size = 65059, upload-time = "2026-06-18T16:12:57.053Z" }, { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, @@ -1431,23 +1073,10 @@ dependencies = [ { name = "librt" }, { name = "mypy-extensions" }, { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f9/b5/b58cdc25fadd424552804bf410855d52324183112aa004f0732c5f6324cf/mypy-1.19.0.tar.gz", hash = "sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528", size = 3579025, upload-time = "2025-11-28T15:49:01.26Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/8f/55fb488c2b7dabd76e3f30c10f7ab0f6190c1fcbc3e97b1e588ec625bbe2/mypy-1.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8", size = 13093239, upload-time = "2025-11-28T15:45:11.342Z" }, - { url = "https://files.pythonhosted.org/packages/72/1b/278beea978456c56b3262266274f335c3ba5ff2c8108b3b31bec1ffa4c1d/mypy-1.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39", size = 12156128, upload-time = "2025-11-28T15:46:02.566Z" }, - { url = "https://files.pythonhosted.org/packages/21/f8/e06f951902e136ff74fd7a4dc4ef9d884faeb2f8eb9c49461235714f079f/mypy-1.19.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab", size = 12753508, upload-time = "2025-11-28T15:44:47.538Z" }, - { url = "https://files.pythonhosted.org/packages/67/5a/d035c534ad86e09cee274d53cf0fd769c0b29ca6ed5b32e205be3c06878c/mypy-1.19.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e", size = 13507553, upload-time = "2025-11-28T15:44:39.26Z" }, - { url = "https://files.pythonhosted.org/packages/6a/17/c4a5498e00071ef29e483a01558b285d086825b61cf1fb2629fbdd019d94/mypy-1.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3", size = 13792898, upload-time = "2025-11-28T15:44:31.102Z" }, - { url = "https://files.pythonhosted.org/packages/67/f6/bb542422b3ee4399ae1cdc463300d2d91515ab834c6233f2fd1d52fa21e0/mypy-1.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134", size = 10048835, upload-time = "2025-11-28T15:48:15.744Z" }, - { url = "https://files.pythonhosted.org/packages/0f/d2/010fb171ae5ac4a01cc34fbacd7544531e5ace95c35ca166dd8fd1b901d0/mypy-1.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106", size = 13010563, upload-time = "2025-11-28T15:48:23.975Z" }, - { url = "https://files.pythonhosted.org/packages/41/6b/63f095c9f1ce584fdeb595d663d49e0980c735a1d2004720ccec252c5d47/mypy-1.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7", size = 12077037, upload-time = "2025-11-28T15:47:51.582Z" }, - { url = "https://files.pythonhosted.org/packages/d7/83/6cb93d289038d809023ec20eb0b48bbb1d80af40511fa077da78af6ff7c7/mypy-1.19.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7", size = 12680255, upload-time = "2025-11-28T15:46:57.628Z" }, - { url = "https://files.pythonhosted.org/packages/99/db/d217815705987d2cbace2edd9100926196d6f85bcb9b5af05058d6e3c8ad/mypy-1.19.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b", size = 13421472, upload-time = "2025-11-28T15:47:59.655Z" }, - { url = "https://files.pythonhosted.org/packages/4e/51/d2beaca7c497944b07594f3f8aad8d2f0e8fc53677059848ae5d6f4d193e/mypy-1.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7", size = 13651823, upload-time = "2025-11-28T15:45:29.318Z" }, - { url = "https://files.pythonhosted.org/packages/aa/d1/7883dcf7644db3b69490f37b51029e0870aac4a7ad34d09ceae709a3df44/mypy-1.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e", size = 10049077, upload-time = "2025-11-28T15:45:39.818Z" }, { url = "https://files.pythonhosted.org/packages/11/7e/1afa8fb188b876abeaa14460dc4983f909aaacaa4bf5718c00b2c7e0b3d5/mypy-1.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d", size = 13207728, upload-time = "2025-11-28T15:46:26.463Z" }, { url = "https://files.pythonhosted.org/packages/b2/13/f103d04962bcbefb1644f5ccb235998b32c337d6c13145ea390b9da47f3e/mypy-1.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760", size = 12202945, upload-time = "2025-11-28T15:48:49.143Z" }, { url = "https://files.pythonhosted.org/packages/e4/93/a86a5608f74a22284a8ccea8592f6e270b61f95b8588951110ad797c2ddd/mypy-1.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6", size = 12718673, upload-time = "2025-11-28T15:47:37.193Z" }, @@ -1487,170 +1116,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] -[[package]] -name = "numpy" -version = "2.2.6" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, - { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, - { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, -] - -[[package]] -name = "numpy" -version = "2.3.5" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.11.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" }, - { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" }, - { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" }, - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, - { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" }, - { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" }, - { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" }, - { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, -] - [[package]] name = "numpy" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] sdist = { url = "https://files.pythonhosted.org/packages/e7/05/3d27272d30698dc0ecb7fdfaa41ad70303b444f81722bb99bce1d818638a/numpy-2.5.0.tar.gz", hash = "sha256:5a129578019311b6e56bdd714250f19b518f7dceeeb8d1af5490f4942d3f891c", size = 20652461, upload-time = "2026-06-21T20:57:51.95Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fa/0a/11486d02add7b1384dff7374d124b1cfbb0ee864dcc9f6a2c0380638cf84/numpy-2.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:489780423903667933b4ed6197b6ec3b75ea5dd17d1d8f0f38d798feb6921561", size = 16789987, upload-time = "2026-06-21T20:56:16.657Z" }, @@ -1712,8 +1181,8 @@ name = "omegaconf" version = "2.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "antlr4-python3-runtime", marker = "python_full_version >= '3.12'" }, - { name = "pyyaml", marker = "python_full_version >= '3.12'" }, + { name = "antlr4-python3-runtime" }, + { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/3d/e4b57b8d9008c6ebe0d5eff901f91d5700cf7bdb8c8863df817463a7fd5e/omegaconf-2.3.1.tar.gz", hash = "sha256:e5e7de64aeebeddaf8e6d3f7a783b32ac2a01c0fbd9c878012caecb891a1f42a", size = 3298472, upload-time = "2026-06-11T05:05:12.885Z" } wheels = [ @@ -1734,10 +1203,10 @@ name = "optax" version = "0.2.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "absl-py", marker = "python_full_version >= '3.12'" }, - { name = "jax", marker = "python_full_version >= '3.12'" }, - { name = "jaxlib", marker = "python_full_version >= '3.12'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "absl-py" }, + { name = "jax" }, + { name = "jaxlib" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8c/f9/e3d11ae6f298ee941a0690e353a323d158ba5dedc436e75621c310845c5c/optax-0.2.8.tar.gz", hash = "sha256:5b225b35066fc3eebaa4d798f1b4173b4d57d1a480610908981f8343b50af0b0", size = 301193, upload-time = "2026-03-20T23:30:05.465Z" } wheels = [ @@ -1749,22 +1218,22 @@ name = "orbax-checkpoint" version = "0.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "absl-py", marker = "python_full_version >= '3.12'" }, - { name = "aiofiles", marker = "python_full_version >= '3.12'" }, - { name = "etils", extra = ["epath", "epy"], marker = "python_full_version >= '3.12'" }, - { name = "humanize", marker = "python_full_version >= '3.12'" }, - { name = "jax", marker = "python_full_version >= '3.12'" }, - { name = "msgpack", marker = "python_full_version >= '3.12'" }, - { name = "nest-asyncio", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "prometheus-client", marker = "python_full_version >= '3.12'" }, - { name = "protobuf", marker = "python_full_version >= '3.12'" }, - { name = "psutil", marker = "python_full_version >= '3.12'" }, - { name = "pyyaml", marker = "python_full_version >= '3.12'" }, - { name = "simplejson", marker = "python_full_version >= '3.12'" }, - { name = "tensorstore", marker = "python_full_version >= '3.12'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, - { name = "uvloop", marker = "python_full_version >= '3.12' and sys_platform != 'win32'" }, + { name = "absl-py" }, + { name = "aiofiles" }, + { name = "etils", extra = ["epath", "epy"] }, + { name = "humanize" }, + { name = "jax" }, + { name = "msgpack" }, + { name = "nest-asyncio", marker = "sys_platform == 'win32'" }, + { name = "numpy" }, + { name = "prometheus-client" }, + { name = "protobuf" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "simplejson" }, + { name = "tensorstore" }, + { name = "typing-extensions" }, + { name = "uvloop", marker = "sys_platform != 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7f/f5/bf5ce9e75b5fedfa89950af7aad39fd60f6194a514aa505ce6a4099a34e0/orbax_checkpoint-0.12.0.tar.gz", hash = "sha256:7233730f18514bdef9b0a813dd84f05dd6578aebfe54682a3759f7655b54a769", size = 661894, upload-time = "2026-06-02T20:46:22.497Z" } wheels = [ @@ -1780,102 +1249,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] -[[package]] -name = "pandas" -version = "2.3.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "python-dateutil", marker = "python_full_version < '3.12'" }, - { name = "pytz", marker = "python_full_version < '3.12'" }, - { name = "tzdata", marker = "python_full_version < '3.12'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, - { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, - { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, - { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, - { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, - { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, - { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, - { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, - { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, - { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, - { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, - { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, -] - [[package]] name = "pandas" version = "3.0.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", -] dependencies = [ - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "python-dateutil", marker = "python_full_version >= '3.12'" }, - { name = "tzdata", marker = "(python_full_version >= '3.12' and sys_platform == 'emscripten') or (python_full_version >= '3.12' and sys_platform == 'win32')" }, + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/16/b5c76b838fd9bf6ce84d3a53346b8874ec05c5f0040d75ef2c320100cd2a/pandas-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:455f6f8139d4282188f526868dbc3c828470e88a3d9d59a891bd46a455f21b98", size = 10338495, upload-time = "2026-05-11T18:52:11.558Z" }, - { url = "https://files.pythonhosted.org/packages/5a/b0/a4ffc4ae74d2d822200dcc46898987d8eb6032d1e2b219cae39da6f5cbcc/pandas-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e15135e2ee5df1063313e2425ceef8ac0f4ae775893815b0923651b806a5639", size = 9938250, upload-time = "2026-05-11T18:52:17.005Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b2/3323601a52caee42c019e370090ca4544b241437240ca04f786cce82b0cf/pandas-3.0.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f1f1752b8533ea03f7f39a9c15b1a058d067bb48f4748948e7a8691e0510f2", size = 10770558, upload-time = "2026-05-11T18:52:19.865Z" }, - { url = "https://files.pythonhosted.org/packages/32/f1/bbecd2f867b97abebe0f9b53d750f862251b40337e061b36676ded3d920f/pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1e45c80cceb3b4a21bc5939d52e8cbd8d9b7305309219d59e9754d9ce09e27", size = 11274611, upload-time = "2026-05-11T18:52:22.622Z" }, - { url = "https://files.pythonhosted.org/packages/7f/4f/eafabf2d5fae5adf143b4d18d3706c5efdc368a7c4eb1ee8a3eddabbd0f6/pandas-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:14da8316da4d0c5a77618425996bfb1248ca87fc2c1486e6fde4652bd18b5824", size = 11784670, upload-time = "2026-05-11T18:52:25.4Z" }, - { url = "https://files.pythonhosted.org/packages/49/44/1eb20389301b57b19cc099a1c2f662501f72f08a65f912d05822613c1532/pandas-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a55066a0505dae0ba2b50a46637db34b46f9094c65c5d4800794ef6335010938", size = 12353708, upload-time = "2026-05-11T18:52:28.139Z" }, - { url = "https://files.pythonhosted.org/packages/eb/62/c321f13b5ba1819fc8dca456c7fce578da2dcfecff1abbf0eaddf8406c0f/pandas-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6674ab18ad8c57802867264b00e15e7bb904700cdd9046e3b2fa1fce237439ea", size = 9907609, upload-time = "2026-05-11T18:52:30.982Z" }, - { url = "https://files.pythonhosted.org/packages/53/85/1b7f563ebc6357c27233a02a96b589bcce1fa9c6eb89fb4f0e56421d277e/pandas-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:5cc09a68b3120e0f54870dede8287a7bb1fa463907e4fcec1ea77cab6179bf7a", size = 9165596, upload-time = "2026-05-11T18:52:33.334Z" }, { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, @@ -1932,28 +1316,6 @@ version = "12.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b", size = 5289809, upload-time = "2025-10-15T18:21:27.791Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e9/4e58fb097fb74c7b4758a680aacd558810a417d1edaa7000142976ef9d2f/pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1", size = 4650606, upload-time = "2025-10-15T18:21:29.823Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e0/1fa492aa9f77b3bc6d471c468e62bfea1823056bf7e5e4f1914d7ab2565e/pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363", size = 6221023, upload-time = "2025-10-15T18:21:31.415Z" }, - { url = "https://files.pythonhosted.org/packages/c1/09/4de7cd03e33734ccd0c876f0251401f1314e819cbfd89a0fcb6e77927cc6/pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca", size = 8024937, upload-time = "2025-10-15T18:21:33.453Z" }, - { url = "https://files.pythonhosted.org/packages/2e/69/0688e7c1390666592876d9d474f5e135abb4acb39dcb583c4dc5490f1aff/pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e", size = 6334139, upload-time = "2025-10-15T18:21:35.395Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1c/880921e98f525b9b44ce747ad1ea8f73fd7e992bafe3ca5e5644bf433dea/pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782", size = 7026074, upload-time = "2025-10-15T18:21:37.219Z" }, - { url = "https://files.pythonhosted.org/packages/28/03/96f718331b19b355610ef4ebdbbde3557c726513030665071fd025745671/pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10", size = 6448852, upload-time = "2025-10-15T18:21:39.168Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a0/6a193b3f0cc9437b122978d2c5cbce59510ccf9a5b48825096ed7472da2f/pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa", size = 7117058, upload-time = "2025-10-15T18:21:40.997Z" }, - { url = "https://files.pythonhosted.org/packages/a7/c4/043192375eaa4463254e8e61f0e2ec9a846b983929a8d0a7122e0a6d6fff/pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275", size = 6295431, upload-time = "2025-10-15T18:21:42.518Z" }, - { url = "https://files.pythonhosted.org/packages/92/c6/c2f2fc7e56301c21827e689bb8b0b465f1b52878b57471a070678c0c33cd/pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d", size = 7000412, upload-time = "2025-10-15T18:21:44.404Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d2/5f675067ba82da7a1c238a73b32e3fd78d67f9d9f80fbadd33a40b9c0481/pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7", size = 2435903, upload-time = "2025-10-15T18:21:46.29Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, - { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, - { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, - { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, - { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, - { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, - { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, - { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, - { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, @@ -2015,13 +1377,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, - { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, - { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, - { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, - { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, - { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, ] [[package]] @@ -2100,20 +1455,6 @@ version = "24.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", hash = "sha256:85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83", size = 1180261, upload-time = "2026-04-21T10:51:25.837Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/bf/a34fee1d624152124fa8355c42f34195ad5fe5233ce5bb87946432047d52/pyarrow-24.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7c2b98645d576a0b9616892ead22b64a83a5f043c5e2ca15ebcefcb5b70c80cb", size = 35076681, upload-time = "2026-04-21T08:51:46.845Z" }, - { url = "https://files.pythonhosted.org/packages/1d/41/64180033d7027afce12dc96d0fe1f504c6fa112190582b458acea2399530/pyarrow-24.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:644a246325b8c69c595ad1dd4b463eba4b0cdb731370e4a86137d433208d6147", size = 36684260, upload-time = "2026-04-21T08:51:53.642Z" }, - { url = "https://files.pythonhosted.org/packages/57/02/9b9320e673dd8a99411fac78690f3df92f6dd6f59754c750110bca66d64e/pyarrow-24.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3a577bd840ca83f646f0a625dbc571dba7044c43c2d1503afc378b570954345c", size = 45698566, upload-time = "2026-04-21T10:46:02.133Z" }, - { url = "https://files.pythonhosted.org/packages/67/33/f75e91b9a64c3f33c787e263c93b871ad91b8a4a68c1d5cebddd9840e835/pyarrow-24.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:e3268e43984d0b1a185c89b4cfff282a7ead12fc93f56cfd7088bdbcbe727041", size = 48835562, upload-time = "2026-04-21T10:46:10.278Z" }, - { url = "https://files.pythonhosted.org/packages/a5/63/097510448e47e4091faa41c43ba92f97cecaab8f4535b56a3d149578f634/pyarrow-24.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2392d954fcb920f42d230284b677605e4e2fbb11f2821e823e642abd67fbb491", size = 49394997, upload-time = "2026-04-21T10:46:18.08Z" }, - { url = "https://files.pythonhosted.org/packages/60/6b/c047d6222ab279024a062742d1807e2fbaf27bba88a98637299ff47b9236/pyarrow-24.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bec9373df11544592b0ba7ec2af0e35059e5f0e7647c6183a854dedd193298f1", size = 51911424, upload-time = "2026-04-21T10:46:25.347Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ba/464cc70761c2a525d97ebd84e21c31ebd47f3ef4bdcee117009f51c46f24/pyarrow-24.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:c42ab9439498270139cc63e18847a02afe5c8b3ed9c931266533cfe378bd3591", size = 27251730, upload-time = "2026-04-21T10:46:30.913Z" }, - { url = "https://files.pythonhosted.org/packages/62/c9/a47ab7ece0d86cbe6678418a0fbd1ac4bb493b9184a3891dfa0e7f287ae0/pyarrow-24.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b0e131f880cda8d04e076cee175a46fc0e8bc8b65c99c6c09dff6669335fde74", size = 35068898, upload-time = "2026-04-21T10:46:36.599Z" }, - { url = "https://files.pythonhosted.org/packages/d1/bc/8db86617a9a58008acf8913d6fed68ea2a46acb6de928db28d724c891a68/pyarrow-24.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:1b2fe7f9a5566401a0ef2571f197eb92358925c1f0c8dba305d6e43ea0871bb3", size = 36679915, upload-time = "2026-04-21T10:46:42.602Z" }, - { url = "https://files.pythonhosted.org/packages/eb/8e/fb178720400ef69db251eb4a9c3ccf4af269bc1feb5055529b8fc87170d1/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:0b3537c00fb8d384f15ac1e79b6eb6db04a16514c8c1d22e59a9b95c8ba42868", size = 45697931, upload-time = "2026-04-21T10:46:48.403Z" }, - { url = "https://files.pythonhosted.org/packages/f3/27/99c42abe8e21b44f4917f62631f3aa31404882a2c41d8a4cd5c110e13d52/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:14e31a3c9e35f1ab6356c6378f6f72830e6d2d5f1791df3774a7b097d18a6a1e", size = 48837449, upload-time = "2026-04-21T10:46:55.329Z" }, - { url = "https://files.pythonhosted.org/packages/36/b6/333749e2666e9032891125bf9c691146e92901bece62030ac1430e2e7c88/pyarrow-24.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7d9a514e73bc42711e6a35aaccf3587c520024fe0a25d830a1a8a27c15f4f57", size = 49395949, upload-time = "2026-04-21T10:47:01.869Z" }, - { url = "https://files.pythonhosted.org/packages/17/25/c5201706a2dd374e8ba6ee3fd7a8c89fb7ffc16eed5217a91fd2bd7f7626/pyarrow-24.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b196eb3f931862af3fa84c2a253514d859c08e0d8fe020e07be12e75a5a9780c", size = 51912986, upload-time = "2026-04-21T10:47:09.872Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d2/4d1bbba65320b21a49678d6fbdc6ff7c649251359fdcfc03568c4136231d/pyarrow-24.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:35405aecb474e683fb36af650618fd5340ee5471fc65a21b36076a18bbc6c981", size = 27255371, upload-time = "2026-04-21T10:47:15.943Z" }, { url = "https://files.pythonhosted.org/packages/b4/a9/9686d9f07837f91f775e8932659192e02c74f9d8920524b480b85212cc68/pyarrow-24.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6233c9ed9ab9d1db47de57d9753256d9dcffbf42db341576099f0fd9f6bf4810", size = 34981559, upload-time = "2026-04-21T10:47:22.17Z" }, { url = "https://files.pythonhosted.org/packages/80/b6/0ddf0e9b6ead3474ab087ae598c76b031fc45532bf6a63f3a553440fb258/pyarrow-24.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:f7616236ec1bc2b15bfdec22a71ab38851c86f8f05ff64f379e1278cf20c634a", size = 36663654, upload-time = "2026-04-21T10:47:28.315Z" }, { url = "https://files.pythonhosted.org/packages/7c/3b/926382efe8ce27ba729071d3566ade6dfb86bdf112f366000196b2f5780a/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:1617043b99bd33e5318ae18eb2919af09c71322ef1ca46566cdafc6e6712fb66", size = 45679394, upload-time = "2026-04-21T10:47:34.821Z" }, @@ -2193,12 +1534,10 @@ version = "9.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", size = 1564125, upload-time = "2025-11-12T13:05:09.333Z" } wheels = [ @@ -2210,7 +1549,7 @@ name = "pytest-cov" version = "7.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", extra = ["toml"] }, + { name = "coverage" }, { name = "pluggy" }, { name = "pytest" }, ] @@ -2240,39 +1579,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3", size = 12195, upload-time = "2025-11-05T13:36:33.183Z" }, ] -[[package]] -name = "pytz" -version = "2025.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, -] - [[package]] name = "pyyaml" version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, - { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, - { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, - { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, @@ -2333,8 +1645,8 @@ name = "rich" version = "15.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py", marker = "python_full_version >= '3.12'" }, - { name = "pygments", marker = "python_full_version >= '3.12'" }, + { name = "markdown-it-py" }, + { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ @@ -2347,25 +1659,12 @@ version = "1.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "joblib" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, + { name = "scipy" }, { name = "threadpoolctl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/3e/daed796fd69cce768b8788401cc464ea90b306fb196ae1ffed0b98182859/scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f", size = 9336221, upload-time = "2025-09-09T08:20:19.328Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ce/af9d99533b24c55ff4e18d9b7b4d9919bbc6cd8f22fe7a7be01519a347d5/scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c", size = 8653834, upload-time = "2025-09-09T08:20:22.073Z" }, - { url = "https://files.pythonhosted.org/packages/58/0e/8c2a03d518fb6bd0b6b0d4b114c63d5f1db01ff0f9925d8eb10960d01c01/scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8", size = 9660938, upload-time = "2025-09-09T08:20:24.327Z" }, - { url = "https://files.pythonhosted.org/packages/2b/75/4311605069b5d220e7cf5adabb38535bd96f0079313cdbb04b291479b22a/scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18", size = 9477818, upload-time = "2025-09-09T08:20:26.845Z" }, - { url = "https://files.pythonhosted.org/packages/7f/9b/87961813c34adbca21a6b3f6b2bea344c43b30217a6d24cc437c6147f3e8/scikit_learn-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:ca250e6836d10e6f402436d6463d6c0e4d8e0234cfb6a9a47835bd392b852ce5", size = 8886969, upload-time = "2025-09-09T08:20:29.329Z" }, - { url = "https://files.pythonhosted.org/packages/43/83/564e141eef908a5863a54da8ca342a137f45a0bfb71d1d79704c9894c9d1/scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e", size = 9331967, upload-time = "2025-09-09T08:20:32.421Z" }, - { url = "https://files.pythonhosted.org/packages/18/d6/ba863a4171ac9d7314c4d3fc251f015704a2caeee41ced89f321c049ed83/scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1", size = 8648645, upload-time = "2025-09-09T08:20:34.436Z" }, - { url = "https://files.pythonhosted.org/packages/ef/0e/97dbca66347b8cf0ea8b529e6bb9367e337ba2e8be0ef5c1a545232abfde/scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d", size = 9715424, upload-time = "2025-09-09T08:20:36.776Z" }, - { url = "https://files.pythonhosted.org/packages/f7/32/1f3b22e3207e1d2c883a7e09abb956362e7d1bd2f14458c7de258a26ac15/scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1", size = 9509234, upload-time = "2025-09-09T08:20:38.957Z" }, - { url = "https://files.pythonhosted.org/packages/9f/71/34ddbd21f1da67c7a768146968b4d0220ee6831e4bcbad3e03dd3eae88b6/scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1", size = 8894244, upload-time = "2025-09-09T08:20:41.166Z" }, { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload-time = "2025-09-09T08:20:43.19Z" }, { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload-time = "2025-09-09T08:20:45.468Z" }, { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload-time = "2025-09-09T08:20:47.982Z" }, @@ -2388,97 +1687,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload-time = "2025-09-09T08:21:26.713Z" }, ] -[[package]] -name = "scipy" -version = "1.15.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, - { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, - { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, - { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, - { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, - { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, - { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, - { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201, upload-time = "2025-05-08T16:05:08.166Z" }, - { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, - { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, - { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, - { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, - { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, - { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, - { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504, upload-time = "2025-05-08T16:06:00.437Z" }, - { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, - { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, - { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, - { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, - { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, - { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, - { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, - { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256, upload-time = "2025-05-08T16:06:58.696Z" }, - { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540, upload-time = "2025-05-08T16:07:04.209Z" }, - { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115, upload-time = "2025-05-08T16:07:08.998Z" }, - { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884, upload-time = "2025-05-08T16:07:14.091Z" }, - { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018, upload-time = "2025-05-08T16:07:19.427Z" }, - { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716, upload-time = "2025-05-08T16:07:25.712Z" }, - { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342, upload-time = "2025-05-08T16:07:31.468Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869, upload-time = "2025-05-08T16:07:38.002Z" }, - { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851, upload-time = "2025-05-08T16:08:33.671Z" }, - { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011, upload-time = "2025-05-08T16:07:44.039Z" }, - { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407, upload-time = "2025-05-08T16:07:49.891Z" }, - { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030, upload-time = "2025-05-08T16:07:54.121Z" }, - { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709, upload-time = "2025-05-08T16:07:58.506Z" }, - { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045, upload-time = "2025-05-08T16:08:03.929Z" }, - { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062, upload-time = "2025-05-08T16:08:09.558Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132, upload-time = "2025-05-08T16:08:15.34Z" }, - { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503, upload-time = "2025-05-08T16:08:21.513Z" }, - { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097, upload-time = "2025-05-08T16:08:27.627Z" }, -] - [[package]] name = "scipy" version = "1.16.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.11.*'", -] dependencies = [ - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/5f/6f37d7439de1455ce9c5a556b8d1db0979f03a796c030bafdf08d35b7bf9/scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97", size = 36630881, upload-time = "2025-10-28T17:31:47.104Z" }, - { url = "https://files.pythonhosted.org/packages/7c/89/d70e9f628749b7e4db2aa4cd89735502ff3f08f7b9b27d2e799485987cd9/scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511", size = 28941012, upload-time = "2025-10-28T17:31:53.411Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a8/0e7a9a6872a923505dbdf6bb93451edcac120363131c19013044a1e7cb0c/scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005", size = 20931935, upload-time = "2025-10-28T17:31:57.361Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c7/020fb72bd79ad798e4dbe53938543ecb96b3a9ac3fe274b7189e23e27353/scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb", size = 23534466, upload-time = "2025-10-28T17:32:01.875Z" }, - { url = "https://files.pythonhosted.org/packages/be/a0/668c4609ce6dbf2f948e167836ccaf897f95fb63fa231c87da7558a374cd/scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876", size = 33593618, upload-time = "2025-10-28T17:32:06.902Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6e/8942461cf2636cdae083e3eb72622a7fbbfa5cf559c7d13ab250a5dbdc01/scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2", size = 35899798, upload-time = "2025-10-28T17:32:12.665Z" }, - { url = "https://files.pythonhosted.org/packages/79/e8/d0f33590364cdbd67f28ce79368b373889faa4ee959588beddf6daef9abe/scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e", size = 36226154, upload-time = "2025-10-28T17:32:17.961Z" }, - { url = "https://files.pythonhosted.org/packages/39/c1/1903de608c0c924a1749c590064e65810f8046e437aba6be365abc4f7557/scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733", size = 38878540, upload-time = "2025-10-28T17:32:23.907Z" }, - { url = "https://files.pythonhosted.org/packages/f1/d0/22ec7036ba0b0a35bccb7f25ab407382ed34af0b111475eb301c16f8a2e5/scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78", size = 38722107, upload-time = "2025-10-28T17:32:29.921Z" }, - { url = "https://files.pythonhosted.org/packages/7b/60/8a00e5a524bb3bf8898db1650d350f50e6cffb9d7a491c561dc9826c7515/scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184", size = 25506272, upload-time = "2025-10-28T17:32:34.577Z" }, { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, @@ -2546,28 +1763,6 @@ version = "4.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0e/2a/54837395a3487c725669428d513293612a48d82b95a0642c936932e5d898/simplejson-4.1.1.tar.gz", hash = "sha256:c08eb9f7a90f77ae470e19a07472e9a79ebc0d1c2315d86a72767665bd5ba79f", size = 118860, upload-time = "2026-04-24T19:24:59.819Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/da/3ba5e87e917094961e7b51b541c88f735f1ca37d580ac78a9302b468f64e/simplejson-4.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7f61eefab86235c800e7f4e37d977080ec424bb2bf0b74e95a2d17ecb48eac0a", size = 111675, upload-time = "2026-04-24T19:22:30.344Z" }, - { url = "https://files.pythonhosted.org/packages/fe/8a/d0c08f4b8934b64469a63d461a68a01d5cc32faf313400dda2bdc1075a29/simplejson-4.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4484960512db9c8124bfa91e0d8a9f9c302338f1c5454e74c21d7d022df10f46", size = 90544, upload-time = "2026-04-24T19:22:32.095Z" }, - { url = "https://files.pythonhosted.org/packages/c2/2d/7832ed91cf4900f86c783d589bfac53358abfccb278f1c8b55eec167b395/simplejson-4.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b75c7ef874dbb350f41827cdf3cee23f5257bdcb0df46d4c01b34badb62dcfe8", size = 90895, upload-time = "2026-04-24T19:22:34.412Z" }, - { url = "https://files.pythonhosted.org/packages/1d/d6/a2a7a482fa43aaeaefc001491d381960f5e685ee4645343e0e037cebb57c/simplejson-4.1.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c7494c75b95171194f965ea609e97081837a26494d91dcc046ad27dd9c3503e2", size = 168660, upload-time = "2026-04-24T19:22:35.717Z" }, - { url = "https://files.pythonhosted.org/packages/aa/06/7a6482f336338dbdb6ca6d3099b2fdc1c74c47eea3c6511975751e9198df/simplejson-4.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1778e09a6e4bb4ef304627915dc4a838569d9e6b737c787925b4e98244bbbc16", size = 167264, upload-time = "2026-04-24T19:22:37.415Z" }, - { url = "https://files.pythonhosted.org/packages/c9/43/039982e956b06c6b019d48bdf9d4ec06f298adf6136552ad1979b94be0fd/simplejson-4.1.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:67e43e7c0555e10de6d83e1408035652fad28c983516e38c4e3a9a748c9af129", size = 176909, upload-time = "2026-04-24T19:22:38.872Z" }, - { url = "https://files.pythonhosted.org/packages/f1/f5/e3ad592d089922abce2c2ea377548953ac55ffcbe061d600f01b9db2e6b6/simplejson-4.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93bf6653420258372444de90194dab8de8ff13d74b5d4263a5fefbbe8b8d2060", size = 165930, upload-time = "2026-04-24T19:22:40.575Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b9/f830b648ae04601e6813306535d8e0a4c178d6453cec539b85dafdac80ed/simplejson-4.1.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0662cfe0482c9796bd097213b27f006815bfdc9b671264c3c0b7fc0e72b71d00", size = 174710, upload-time = "2026-04-24T19:22:42.437Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3e/82c8997c4ef2ef6c832fbfc3bb2ed14a212616a284100af03b552ea7e072/simplejson-4.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a9ab55d2459f6d0fdf9984a7a0fb0280dae12979f4fcc3171f5096a4fcf5fafe", size = 167685, upload-time = "2026-04-24T19:22:44.023Z" }, - { url = "https://files.pythonhosted.org/packages/4d/03/80e67a6c63fe812094c681917a5c5d403e34904d200570416863fe2e8328/simplejson-4.1.1-cp310-cp310-win32.whl", hash = "sha256:dfb84ace97acbdf1916c5a675387493fc5a7f67c2e15d4a7687143f8c73024d4", size = 88317, upload-time = "2026-04-24T19:22:45.547Z" }, - { url = "https://files.pythonhosted.org/packages/f4/05/d4fa2c024d566bddff732a2aa437faa4cbee15ee277e2a855faf91a9d906/simplejson-4.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:8eb821ef27f688f59ed4a93b17a666a7ebacf8dd65fecaa2b3c531a3aea62eaf", size = 90461, upload-time = "2026-04-24T19:22:47.447Z" }, - { url = "https://files.pythonhosted.org/packages/1e/25/39013ffe279d90093ec1c848565b3683c586906c10fa55d9000ec29d046b/simplejson-4.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2867c64d92abd1992c15666fae198203093f593e43d6b81adf176bae530d493a", size = 111538, upload-time = "2026-04-24T19:22:49.051Z" }, - { url = "https://files.pythonhosted.org/packages/f2/ae/2c272971c8a87e2539c54a98eb6ff037bee1e2e93943c3986cf7500a4f3a/simplejson-4.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c47c46e16c8ea9e4850061e6ed5aa2b9cd2074cb2274bfd9c138cba15ce7453", size = 90594, upload-time = "2026-04-24T19:22:50.408Z" }, - { url = "https://files.pythonhosted.org/packages/4e/a2/6eebfb99dedc139f549200f61ade6d1890ac5707c5d427bdfa6fe39c9313/simplejson-4.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e294e33dbf316a9bbdd4030d46503c9b0f19470ae7ad6af5bae6c426bc2e869f", size = 90718, upload-time = "2026-04-24T19:22:51.694Z" }, - { url = "https://files.pythonhosted.org/packages/80/7e/c9e6c0c4ad8415e64dad0c47f619b556b02680a41631b4dbc281d55dc54d/simplejson-4.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7ce252b28fddbdd83db5bd7d93dad2a8a591d7ada098afec9c1b23d6b722a7a4", size = 180901, upload-time = "2026-04-24T19:22:53.025Z" }, - { url = "https://files.pythonhosted.org/packages/34/09/69e331e3994b1ed9be6ce9ace4ade704e7ed503edf869929ca7bb404eda8/simplejson-4.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c44ef6b02a4eb67ed17a72342341792149b3ff46f15426c26e970e49addf327", size = 178133, upload-time = "2026-04-24T19:22:54.574Z" }, - { url = "https://files.pythonhosted.org/packages/5d/40/ed806f24afef295c1032448f5ff6f6f2979392d5645ddb9f4fed7f38194d/simplejson-4.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82bfca2b85a34178c25829c703f0a9e9f113a5af7539285bd3efb583a0bf1ba3", size = 188155, upload-time = "2026-04-24T19:22:56.044Z" }, - { url = "https://files.pythonhosted.org/packages/38/94/8d6f515b827b0f7881a49c8c1ac6920b7ae9428939ef04238c973278b42a/simplejson-4.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e4b23f71dd781f8830f1663dc01a4944d3dbf87a1f93d78fba1cf64722d0ccf", size = 176225, upload-time = "2026-04-24T19:22:57.981Z" }, - { url = "https://files.pythonhosted.org/packages/c9/fd/6dffb4956563d48bbe46b91ff341adae34920e94008fd6b8d728072abfc7/simplejson-4.1.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:82fee635d7b73ad801030b05a75fbd34a098da0c2ecf600667a03636d09e1e42", size = 185535, upload-time = "2026-04-24T19:22:59.618Z" }, - { url = "https://files.pythonhosted.org/packages/de/d2/a509ee37763e79aec75d68f8521db1440306edeba3b8b4064ab4ee8bf1d9/simplejson-4.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:68e62eda21192c5ea9bb92d571ca46a4477fef48762f50d433de2b4253051551", size = 179302, upload-time = "2026-04-24T19:23:01.324Z" }, - { url = "https://files.pythonhosted.org/packages/d8/23/5b343bfd2a79d3b6818e4db3586c405a001a090d4c89d336e31273ce7177/simplejson-4.1.1-cp311-cp311-win32.whl", hash = "sha256:ffd3d82294b47f5ec64050021ace95fd62628a0c1cc8bbf4d06d2d1fb697e055", size = 88408, upload-time = "2026-04-24T19:23:02.808Z" }, - { url = "https://files.pythonhosted.org/packages/38/04/df9b37aedbd524dca20840d25ebe01d6ae486b89792aeff5d15b9c4114f7/simplejson-4.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:78a3fe0995be42bed62a26aa78e0e0b4d87c6545785346b9cc898f3389569a35", size = 90526, upload-time = "2026-04-24T19:23:04.408Z" }, { url = "https://files.pythonhosted.org/packages/60/25/e90998fe8e480eb43b966c09e835379887d427567ebd496563d3b1e16b19/simplejson-4.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:19040a17154dc03d289bab68d73ce0a6a0be01de30c584bbdd93490bead14b22", size = 112414, upload-time = "2026-04-24T19:23:06.084Z" }, { url = "https://files.pythonhosted.org/packages/9c/a0/abd4785f36c3400f1fbb21f517be39295a750a714f04b7ee175adf6ef580/simplejson-4.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a94ebaecdbaa80d9551a3ec6bf0c9302fc8b53ab6c1b2bfd498a1df4cb28158d", size = 91120, upload-time = "2026-04-24T19:23:07.877Z" }, { url = "https://files.pythonhosted.org/packages/b8/78/fc060d2e3b13c6ec59288574b8efac64075e316b2afba4396a56b2422f78/simplejson-4.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:67341c95c0a168ab4a6d1e807e50463f1c8da932c3286d81e201266c427061fa", size = 91055, upload-time = "2026-04-24T19:23:09.264Z" }, @@ -2629,16 +1824,11 @@ name = "tensorstore" version = "0.1.84" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ml-dtypes", marker = "python_full_version >= '3.12'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "ml-dtypes" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/83/18/c8e8b4faffab1a434b6c013d54cf7f5b754a6849429d9dbb718297705796/tensorstore-0.1.84.tar.gz", hash = "sha256:3cb091dfde68600e6d8f03a389ccc92ffa7c0798a0c600d1013c0138d7163e6b", size = 7208048, upload-time = "2026-05-16T06:17:58.448Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/2f/7630705a1db3a349f162552c7a34f4e74c06bf9800d73c233eb939305f6e/tensorstore-0.1.84-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6103311700359e9f552e8560d16eecf1548b87e2f8a6a766b9f6a65c8722f879", size = 16556656, upload-time = "2026-05-16T06:17:01.065Z" }, - { url = "https://files.pythonhosted.org/packages/09/2b/fbba516c549fc868d9b9c74e3e593157825b08db0103dcfcde1ae994d1f4/tensorstore-0.1.84-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:340fe971f1808d7060f2273b8eee352780bcb65e5035f78163fa9b8930aa795a", size = 14900174, upload-time = "2026-05-16T06:17:03.647Z" }, - { url = "https://files.pythonhosted.org/packages/55/6d/fe5013aa1b8e8e6a73213285f29a059bfcbefcfebafc937694823bdc5a00/tensorstore-0.1.84-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34352f8ba6e5efba5feb18917d68da1a92bbff80e64c3fd06d3d1af4b343821a", size = 19341729, upload-time = "2026-05-16T06:17:06.242Z" }, - { url = "https://files.pythonhosted.org/packages/11/c5/65e7dfc4108451f5317aca47a7c339954d0b7601ed4db4481a2f80ee2da1/tensorstore-0.1.84-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ae74451ab5cc8a0cd9e51926adf04f4dfdbd8ad5ac31ac71f1caa7bdfb2828d", size = 20952887, upload-time = "2026-05-16T06:17:08.653Z" }, - { url = "https://files.pythonhosted.org/packages/ca/dc/11a487107c5b73684aeaa4667693d5e73b96bc3ad7211db4a03f6049bf65/tensorstore-0.1.84-cp311-cp311-win_amd64.whl", hash = "sha256:4c9b084b0b44c36eaa9b9c51c3347474cd3c94fda12344fb507e6629357615bf", size = 13391569, upload-time = "2026-05-16T06:17:11.307Z" }, { url = "https://files.pythonhosted.org/packages/46/8a/1b5231e965257c3ee7d4615cb49a0fac53a71a1c34b293bcf524bb7c6d13/tensorstore-0.1.84-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:915371fc2c27540e8b69c573b7a06217fb8d161ec231cedfa9f3d264615a326d", size = 16571584, upload-time = "2026-05-16T06:17:13.283Z" }, { url = "https://files.pythonhosted.org/packages/88/5d/52e52aa00a5ae3ebe1116ca52ac9f47ef98e94f6c4e411649cd3d1bb79cc/tensorstore-0.1.84-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4477eabe26e2f5131f1b1a3444cd9167fe69fabc29579eab8259d218399b9e6b", size = 14905169, upload-time = "2026-05-16T06:17:15.638Z" }, { url = "https://files.pythonhosted.org/packages/61/36/f88b4bf267902f12cd2ca33aff10fabd6839dd1ce7d51876ebefa98aaf2c/tensorstore-0.1.84-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ace00cf2e45dc5d64fe3a10c2cbef61343915683808a10a3e081233566a7231", size = 19345134, upload-time = "2026-05-16T06:17:17.984Z" }, @@ -2669,61 +1859,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, ] -[[package]] -name = "tomli" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" }, - { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" }, - { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" }, - { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" }, - { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" }, - { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" }, - { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" }, - { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, - { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, - { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, - { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, - { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, - { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, - { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, - { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, - { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, - { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, - { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, - { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, - { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, - { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, - { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, - { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, - { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, - { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, - { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, - { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, - { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, - { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, - { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, - { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, - { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, - { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, - { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, - { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, - { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, - { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, -] - [[package]] name = "tqdm" version = "4.68.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/87/d7/0535a28b1f5f24f6612fb3ff1e89fb1a8d160fee0f976e0aa6803862134b/tqdm-4.68.3.tar.gz", hash = "sha256:00dfa48452b6b6cfae3dd9885636c23d3422d1ec97c66d96818cbd5e0821d482", size = 170596, upload-time = "2026-06-17T07:36:52.105Z" } wheels = [ @@ -2735,7 +1876,7 @@ name = "treescope" version = "0.1.10" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f0/2a/d13d3c38862632742d2fe2f7ae307c431db06538fd05ca03020d207b5dcc/treescope-0.1.10.tar.gz", hash = "sha256:20f74656f34ab2d8716715013e8163a0da79bdc2554c16d5023172c50d27ea95", size = 138870, upload-time = "2025-08-08T05:43:48.048Z" } wheels = [ @@ -2747,10 +1888,10 @@ name = "typer" version = "0.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "annotated-doc", marker = "python_full_version >= '3.12'" }, - { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "rich", marker = "python_full_version >= '3.12'" }, - { name = "shellingham", marker = "python_full_version >= '3.12'" }, + { name = "annotated-doc" }, + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" } wheels = [ @@ -2790,18 +1931,6 @@ version = "0.22.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/14/ecceb239b65adaaf7fde510aa8bd534075695d1e5f8dadfa32b5723d9cfb/uvloop-0.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c", size = 1343335, upload-time = "2025-10-16T22:16:11.43Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ae/6f6f9af7f590b319c94532b9567409ba11f4fa71af1148cab1bf48a07048/uvloop-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792", size = 742903, upload-time = "2025-10-16T22:16:12.979Z" }, - { url = "https://files.pythonhosted.org/packages/09/bd/3667151ad0702282a1f4d5d29288fce8a13c8b6858bf0978c219cd52b231/uvloop-0.22.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86", size = 3648499, upload-time = "2025-10-16T22:16:14.451Z" }, - { url = "https://files.pythonhosted.org/packages/b3/f6/21657bb3beb5f8c57ce8be3b83f653dd7933c2fd00545ed1b092d464799a/uvloop-0.22.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:481c990a7abe2c6f4fc3d98781cc9426ebd7f03a9aaa7eb03d3bfc68ac2a46bd", size = 3700133, upload-time = "2025-10-16T22:16:16.272Z" }, - { url = "https://files.pythonhosted.org/packages/09/e0/604f61d004ded805f24974c87ddd8374ef675644f476f01f1df90e4cdf72/uvloop-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2", size = 3512681, upload-time = "2025-10-16T22:16:18.07Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ce/8491fd370b0230deb5eac69c7aae35b3be527e25a911c0acdffb922dc1cd/uvloop-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec", size = 3615261, upload-time = "2025-10-16T22:16:19.596Z" }, - { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, - { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, - { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, - { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, - { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, @@ -2842,12 +1971,9 @@ name = "xgboost" version = "3.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "numpy", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy" }, { name = "nvidia-nccl-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f0/64/42310363ecd814de5930981672d20da3d35271721ad2d2b4970b4092825b/xgboost-3.1.2.tar.gz", hash = "sha256:0f94496db277f5c227755e1f3ec775c59bafae38f58c94aa97c5198027c93df5", size = 1237438, upload-time = "2025-11-20T18:33:29.614Z" } wheels = [ From b6fb4dd4ae5811704df63ec467a56945d1e985b9 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Wed, 24 Jun 2026 15:40:26 +0100 Subject: [PATCH 09/30] Bump estimint version to 1.4.2 in uv.lock --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 889ca38..81ee79c 100644 --- a/uv.lock +++ b/uv.lock @@ -361,7 +361,7 @@ wheels = [ [[package]] name = "estimint" -version = "1.4.0" +version = "1.4.2" source = { editable = "." } dependencies = [ { name = "numpy" }, From 528d9b2c0cefde9b65add4b9f8689151bcb50707 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Wed, 24 Jun 2026 15:43:58 +0100 Subject: [PATCH 10/30] Add dependency groups for development dependencies in pyproject.toml and uv.lock --- pyproject.toml | 1 + uv.lock | 36 +++++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 297067b..23de981 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,6 +46,7 @@ scenarios = [ ] all = ["estimint[train,viz,download,scenarios]"] +[dependency-groups] dev = [ "pytest>=7.0.0", "pytest-cov>=4.0.0", diff --git a/uv.lock b/uv.lock index 81ee79c..4e2de78 100644 --- a/uv.lock +++ b/uv.lock @@ -380,14 +380,6 @@ all = [ { name = "requests" }, { name = "scikit-learn" }, ] -dev = [ - { name = "black" }, - { name = "flake8" }, - { name = "isort" }, - { name = "mypy" }, - { name = "pytest" }, - { name = "pytest-cov" }, -] download = [ { name = "appdirs" }, { name = "requests" }, @@ -404,28 +396,42 @@ viz = [ { name = "matplotlib" }, ] +[package.dev-dependencies] +dev = [ + { name = "black" }, + { name = "flake8" }, + { name = "isort" }, + { name = "mypy" }, + { name = "pytest" }, + { name = "pytest-cov" }, +] + [package.metadata] requires-dist = [ { name = "appdirs", marker = "extra == 'download'", specifier = ">=1.4.0" }, - { name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" }, { name = "duckdb", marker = "extra == 'train'", specifier = ">=0.8.0" }, { name = "estimint", extras = ["train", "viz", "download", "scenarios"], marker = "extra == 'all'" }, - { name = "flake8", marker = "extra == 'dev'", specifier = ">=6.0.0" }, - { name = "isort", marker = "extra == 'dev'", specifier = ">=5.12.0" }, { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.4.0" }, { name = "mintstate", marker = "extra == 'scenarios'", specifier = ">=0.3.0" }, - { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, { name = "numpy", specifier = ">=1.20.0" }, { name = "pandas", specifier = ">=1.3.0" }, { name = "pyarrow", marker = "extra == 'train'", specifier = ">=10.0.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, - { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" }, { name = "requests", marker = "extra == 'download'", specifier = ">=2.28.0" }, { name = "scikit-learn", marker = "extra == 'train'", specifier = ">=1.0.0" }, { name = "scipy", specifier = ">=1.7.0" }, { name = "xgboost", specifier = ">=1.6.0" }, ] -provides-extras = ["train", "viz", "download", "scenarios", "all", "dev"] +provides-extras = ["train", "viz", "download", "scenarios", "all"] + +[package.metadata.requires-dev] +dev = [ + { name = "black", specifier = ">=23.0.0" }, + { name = "flake8", specifier = ">=6.0.0" }, + { name = "isort", specifier = ">=5.12.0" }, + { name = "mypy", specifier = ">=1.0.0" }, + { name = "pytest", specifier = ">=7.0.0" }, + { name = "pytest-cov", specifier = ">=4.0.0" }, +] [[package]] name = "etils" From 2b224e7cc031114fb9e447453717f5471b6971b2 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 12:34:06 +0100 Subject: [PATCH 11/30] refactor: restore canonical scenario key names --- src/estimint/scenarios.py | 22 +++++++++++----------- tests/test_scenarios.py | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/estimint/scenarios.py b/src/estimint/scenarios.py index b848890..59554d2 100644 --- a/src/estimint/scenarios.py +++ b/src/estimint/scenarios.py @@ -47,15 +47,15 @@ def _emulators(hf_repo: str) -> Dict[str, Any]: def _estimate_eir(scn: Dict[str, Any], est: Dict[str, Any]) -> Dict[str, Any]: """scenario -> EIR + the stateMINT covariate dict.""" - net = scn.get("net") + net = scn.get("net_type_future") if net: - res = calculate_dn0(scn["resistance"], **{net: scn["net_usage"]}) - dn0_use, itn_use = res.dn0, res.itn_use * scn["net_usage"] + res = calculate_dn0(scn["res_use"], **{net: scn["itn_future"]}) + dn0_use, itn_use = res.dn0, res.itn_use * scn["itn_future"] else: dn0_use = itn_use = 0.0 - Q0, phi, seasonal = scn["Q0"], scn["phi_bednets"], float(scn["seasonal"]) - irs_use, lsm = scn["irs_use"], scn.get("lsm", 0.0) + Q0, phi, seasonal = scn["Q0"], scn["phi"], float(scn["seasonal"]) + irs_use, lsm = scn["irs"], scn.get("lsm", 0.0) feats = dict(dn0_use=dn0_use, Q0=Q0, phi_bednets=phi, seasonal=seasonal, itn_use=itn_use, irs_use=irs_use) @@ -93,10 +93,10 @@ def run_scenarios( ) -> pd.DataFrame: """Run scenarios end-to-end (estiMINT EIR -> stateMINT emulator) -> DataFrame. - Each scenario: input ("prevalence"|"hbr"|"eir") + value; Q0, phi_bednets, seasonal, - irs_use; lsm (opt); nets via net/resistance/net_usage (opt); mosquito_delta (opt, + Each scenario: input ("prevalence"|"hbr"|"eir") + value; Q0, phi, seasonal, + irs; lsm (opt); nets via net_type_future/res_use/itn_future (opt); mosquito_delta (opt, prevalence only); name (opt). Output adds prev_y9/prev_endline/cases_endline and the - length-157 prev_series/cases_series. + length-157 prevalence/cases series. """ if isinstance(scenarios, pd.DataFrame): scenarios = scenarios.to_dict(orient="records") @@ -108,11 +108,11 @@ def run_scenarios( parts = [_estimate_eir(scn, est) for scn in scenarios] covs = [p["cov"] for p in parts] - prev = np.asarray(emu["prevalence"].predict(covs), dtype=np.float32) - cases = np.maximum(np.asarray(emu["cases"].predict(covs), dtype=np.float32), 0.0) + prev = emu["prevalence"].predict(covs) + cases = np.maximum(emu["cases"].predict(covs), 0.0) return pd.DataFrame([ {**part["row"], "prev_y9": float(p[_IDX_Y9]), "prev_endline": float(p[-1]), - "cases_endline": float(c[-1]), "prev_series": p, "cases_series": c} + "cases_endline": float(c[-1]), "prevalence": p, "cases": c} for part, p, c in zip(parts, prev, cases) ]) diff --git a/tests/test_scenarios.py b/tests/test_scenarios.py index 837c79d..53ca498 100644 --- a/tests/test_scenarios.py +++ b/tests/test_scenarios.py @@ -10,7 +10,7 @@ from estimint.scenarios import _estimate_eir, _est_models, run_scenarios -INTV = dict(Q0=0.87, phi_bednets=0.82, seasonal=0.0, irs_use=0.0) +INTV = dict(Q0=0.87, phi=0.82, seasonal=0.0, irs=0.0) @pytest.fixture(scope="module") @@ -37,10 +37,10 @@ def test_hbr_input(self, est): assert out["row"]["eir_baseline"] > 0 def test_bednet_spec_scales_itn_by_usage(self, est): - # mirrors the demo script: itn_use = calculate_dn0(...).itn_use * net_usage + # mirrors the demo script: itn_use = calculate_dn0(...).itn_use * itn_future out = _estimate_eir( - dict(input="prevalence", value=0.30, net="pyrethroid_only", - resistance=0.30, net_usage=0.70, **INTV), est) + dict(input="prevalence", value=0.30, net_type_future="pyrethroid_only", + res_use=0.30, itn_future=0.70, **INTV), est) assert out["row"]["dn0_use"] > 0 assert out["row"]["itn_use"] == pytest.approx(0.70 * 0.70) @@ -70,12 +70,12 @@ def test_end_to_end(self): pytest.importorskip("stateMINT", reason="stateMINT not installed") df = run_scenarios([ dict(name="prev+delta", input="prevalence", value=0.30, - net="pyrethroid_pbo", resistance=0.55, net_usage=0.85, - Q0=0.90, phi_bednets=0.85, seasonal=1, irs_use=0.40, mosquito_delta=0.60), + net_type_future="pyrethroid_pbo", res_use=0.55, itn_future=0.85, + Q0=0.90, phi=0.85, seasonal=1, irs=0.40, mosquito_delta=0.60), dict(name="eir", input="eir", value=20.0, - Q0=0.88, phi_bednets=0.78, seasonal=1, irs_use=0.60), + Q0=0.88, phi=0.78, seasonal=1, irs=0.60), ]) assert len(df) == 2 - assert {"eir_final", "prev_y9", "prev_series", "cases_series"} <= set(df.columns) - assert len(df.iloc[0]["prev_series"]) == 157 - assert (df["cases_series"].iloc[0] >= 0).all() + assert {"eir_final", "prev_y9", "prevalence", "cases"} <= set(df.columns) + assert len(df.iloc[0]["prevalence"]) == 157 + assert (df["cases"].iloc[0] >= 0).all() From 9963a04c754fb324a5ccd7f93cc624d35add2761 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 12:34:06 +0100 Subject: [PATCH 12/30] refactor(hbr): rename DT to dt, lower prev floor to 0.01 --- models/hbr/prepare.py | 6 +-- models/hbr/train_eir_to_hbr.py | 75 +++++++++++++++++----------------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/models/hbr/prepare.py b/models/hbr/prepare.py index e0f19e6..5535ff1 100644 --- a/models/hbr/prepare.py +++ b/models/hbr/prepare.py @@ -1,7 +1,7 @@ """Derive the two HBR training views from datasets/estimint_simulations_y9.parquet. - hbr_training: HBR->EIR model (hbr_y9 > 0) -- eir_to_hbr_training: EIR->HBR model (prev_y9 >= 0.02 AND hbr_y9 > 0) +- eir_to_hbr_training: EIR->HBR model (prev_y9 >= 0.01 AND hbr_y9 > 0) Both sorted by key for a deterministic, reproducible view. """ @@ -15,7 +15,7 @@ KEYS = ["parameter_index", "simulation_index"] COLS = KEYS + ["eir", "dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "hbr_y9"] -MIN_PREVALENCE = 0.02 +MIN_PREVALENCE = 0.01 def prepare(): @@ -28,7 +28,7 @@ def prepare(): print(f"hbr view: {len(hbr):,} rows -> models/hbr/hbr_training.parquet") e2h = src[(src.prev_y9 >= MIN_PREVALENCE) & (src.hbr_y9 > 0)][COLS].sort_values(KEYS).reset_index(drop=True) - assert len(e2h) == 12429, f"expected 12,429 eir_to_hbr rows, got {len(e2h):,}" + assert len(e2h) == 12874, f"expected 12,874 eir_to_hbr rows, got {len(e2h):,}" assert not e2h.isna().any().any(), "unexpected NaN in eir_to_hbr view" e2h.to_parquet(HERE / "eir_to_hbr_training.parquet", index=False) print(f"eir_to_hbr view: {len(e2h):,} rows -> models/hbr/eir_to_hbr_training.parquet") diff --git a/models/hbr/train_eir_to_hbr.py b/models/hbr/train_eir_to_hbr.py index f2c0ebc..0fef99b 100644 --- a/models/hbr/train_eir_to_hbr.py +++ b/models/hbr/train_eir_to_hbr.py @@ -17,8 +17,7 @@ sys.path.insert(0, str(Path(__file__).parents[2] / "src")) from estimint.utils import ( - ts, r2, rmse, mse, mae, median_ae, mae_rel, rmsle, - safe_div, smape, fit_qmap_w, predict_qmap_w, scale_pos + ts, r2, rmse, mae, fit_qmap_w, predict_qmap_w, scale_pos ) from estimint.data_processing import make_value_weights from estimint.plotting import plot_obs_pred @@ -38,12 +37,12 @@ def main(): d.mkdir(parents=True, exist_ok=True) ts("Loading training data...") - DT = pd.read_parquet(DATA_PATH) - print(f"Loaded {len(DT):,} rows") + dt = pd.read_parquet(DATA_PATH) + print(f"Loaded {len(dt):,} rows") features = ["eir", "dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use"] - DT["hbr_log10"] = np.log10(DT["hbr_y9"]) + dt["hbr_log10"] = np.log10(dt["hbr_y9"]) xgb_params = { "objective": "reg:squarederror", @@ -61,18 +60,18 @@ def main(): ts("Creating %d strata on log10(HBR) and 70/15/15 split...", K_STRATA) np.random.seed(SEED) - hbr_log10 = DT["hbr_log10"].values.reshape(-1, 1) + hbr_log10 = dt["hbr_log10"].values.reshape(-1, 1) km = KMeans(n_clusters=K_STRATA, n_init=50, max_iter=5000, random_state=SEED) km.fit(hbr_log10) centers = km.cluster_centers_.flatten() ord_idx = np.argsort(centers) id_map = {old_id: new_id + 1 for new_id, old_id in enumerate(ord_idx)} - DT["strat_bin"] = np.array([id_map[c] for c in km.labels_]) + dt["strat_bin"] = np.array([id_map[c] for c in km.labels_]) - DT["split"] = None - for b in sorted(DT["strat_bin"].unique()): - idx = DT[DT["strat_bin"] == b].index.tolist() + dt["split"] = None + for b in sorted(dt["strat_bin"].unique()): + idx = dt[dt["strat_bin"] == b].index.tolist() n_b = len(idx) n_tr = int(np.floor(0.70 * n_b)) n_val = int(np.floor(0.15 * n_b)) @@ -83,48 +82,48 @@ def main(): val_idx = idx[n_tr:n_tr + n_val] if n_val > 0 else [] te_idx = idx[n_tr + n_val:] - DT.loc[tr_idx, "split"] = "train" - DT.loc[val_idx, "split"] = "val" - DT.loc[te_idx, "split"] = "test" + dt.loc[tr_idx, "split"] = "train" + dt.loc[val_idx, "split"] = "val" + dt.loc[te_idx, "split"] = "test" - DT["split"] = DT["split"].fillna("train") + dt["split"] = dt["split"].fillna("train") - DT_test = DT[DT["split"] == "test"] - X_test = DT_test[features].values.astype(np.float64) - y_test = DT_test["hbr_log10"].values + dt_test = dt[dt["split"] == "test"] + X_test = dt_test[features].values.astype(np.float64) + y_test = dt_test["hbr_log10"].values obs_hbr_test = np.power(10, y_test) - ts("Test set: %d rows", len(DT_test)) + ts("Test set: %d rows", len(dt_test)) ts("Assigning %d-fold CV within TRAIN+VAL strata...", K_FOLDS) - DTcv = DT[DT["split"] != "test"].copy() + dtcv = dt[dt["split"] != "test"].copy() np.random.seed(SEED + 1) - DTcv["fold"] = 0 - for b in DTcv["strat_bin"].unique(): - mask = DTcv["strat_bin"] == b + dtcv["fold"] = 0 + for b in dtcv["strat_bin"].unique(): + mask = dtcv["strat_bin"] == b n_b = mask.sum() - idx = DTcv.index[mask].tolist() + idx = dtcv.index[mask].tolist() np.random.shuffle(idx) folds = np.tile(np.arange(1, K_FOLDS + 1), int(np.ceil(n_b / K_FOLDS)))[:n_b] np.random.shuffle(folds) - DTcv.loc[idx, "fold"] = folds + dtcv.loc[idx, "fold"] = folds ts("Running %d-fold CV with early stopping...", K_FOLDS) - oof_pred_raw = np.full(len(DTcv), np.nan) + oof_pred_raw = np.full(len(dtcv), np.nan) best_iters = np.zeros(K_FOLDS, dtype=int) for k in range(1, K_FOLDS + 1): ts(" Fold %d / %d", k, K_FOLDS) - idx_val = DTcv["fold"] == k - idx_tr = DTcv["fold"] != k + idx_val = dtcv["fold"] == k + idx_tr = dtcv["fold"] != k - X_tr = DTcv.loc[idx_tr, features].values.astype(np.float64) - y_tr = DTcv.loc[idx_tr, "hbr_log10"].values - X_va = DTcv.loc[idx_val, features].values.astype(np.float64) - y_va = DTcv.loc[idx_val, "hbr_log10"].values + X_tr = dtcv.loc[idx_tr, features].values.astype(np.float64) + y_tr = dtcv.loc[idx_tr, "hbr_log10"].values + X_va = dtcv.loc[idx_val, features].values.astype(np.float64) + y_va = dtcv.loc[idx_val, "hbr_log10"].values w_tr = make_value_weights(np.power(10, y_tr), digits=3) w_va = make_value_weights(np.power(10, y_va), digits=3) @@ -145,7 +144,7 @@ def main(): pred_log10_va = mdl.predict(dva) oof_pred_raw[idx_val.values] = np.power(10, pred_log10_va) - obs_cv_raw = np.power(10, DTcv["hbr_log10"].values) + obs_cv_raw = np.power(10, dtcv["hbr_log10"].values) ts("Fitting final calibrator (QMAP + positive scale) on OOF...") cal_oof = fit_qmap_w(oof_pred_raw, obs_cv_raw, ngrid=1024, round_digits=8) @@ -167,9 +166,9 @@ def main(): best_nrounds = int(np.round(np.median(best_iters))) print(f"Best nrounds: {best_nrounds}") - DT_trcv = DT[DT["split"] != "test"] - X_trcv = DT_trcv[features].values.astype(np.float64) - y_trcv = DT_trcv["hbr_log10"].values + dt_trcv = dt[dt["split"] != "test"] + X_trcv = dt_trcv[features].values.astype(np.float64) + y_trcv = dt_trcv["hbr_log10"].values w_trcv = make_value_weights(np.power(10, y_trcv), digits=3) dtrcv = xgb.DMatrix(X_trcv, label=y_trcv, weight=w_trcv) @@ -217,9 +216,9 @@ def main(): "transform": "log10", "inverse": "pow10", "training_data": { - "source": "datasets/estimint_simulations_y9.parquet (prev_y9 >= 0.02 AND hbr_y9 > 0)", - "n_rows": len(DT), - "n_params": DT["parameter_index"].nunique() + "source": "datasets/estimint_simulations_y9.parquet (prev_y9 >= 0.01 AND hbr_y9 > 0)", + "n_rows": len(dt), + "n_params": dt["parameter_index"].nunique() }, "cv": { "K": K_FOLDS, From 8ca87e0f6a05a2c48eb8a6bdd430dbcbad128b46 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 12:34:06 +0100 Subject: [PATCH 13/30] style: remove unused imports --- models/hbr/train_hbr_to_eir.py | 3 +-- models/prevalence/train.py | 3 +-- src/estimint/data_processing.py | 2 +- src/estimint/hbr.py | 3 +-- src/estimint/models.py | 2 +- src/estimint/plotting.py | 1 - src/estimint/train.py | 2 +- src/estimint/utils.py | 3 +-- tests/test_flows.py | 1 - 9 files changed, 7 insertions(+), 13 deletions(-) diff --git a/models/hbr/train_hbr_to_eir.py b/models/hbr/train_hbr_to_eir.py index f8035f7..dfb717a 100644 --- a/models/hbr/train_hbr_to_eir.py +++ b/models/hbr/train_hbr_to_eir.py @@ -16,8 +16,7 @@ sys.path.insert(0, str(Path(__file__).parents[2] / "src")) from estimint.utils import ( - ts, r2, rmse, mse, mae, median_ae, mae_rel, rmsle, - safe_div, smape, fit_qmap_w, predict_qmap_w, scale_pos + ts, r2, rmse, mae, fit_qmap_w, predict_qmap_w, scale_pos ) from estimint.data_processing import make_value_weights from estimint.plotting import plot_obs_pred diff --git a/models/prevalence/train.py b/models/prevalence/train.py index 0b5be73..75a0a8b 100644 --- a/models/prevalence/train.py +++ b/models/prevalence/train.py @@ -16,8 +16,7 @@ sys.path.insert(0, str(Path(__file__).parents[2] / "src")) from estimint.utils import ( - ts, r2, rmse, mse, mae, median_ae, mae_rel, rmsle, - safe_div, smape, fit_qmap_w, predict_qmap_w, scale_pos + ts, r2, rmse, mae, fit_qmap_w, predict_qmap_w, scale_pos ) from estimint.data_processing import make_value_weights from estimint.plotting import plot_obs_pred diff --git a/src/estimint/data_processing.py b/src/estimint/data_processing.py index 2315779..2044093 100644 --- a/src/estimint/data_processing.py +++ b/src/estimint/data_processing.py @@ -4,7 +4,7 @@ Equivalent to: data_processing.R """ -from typing import Dict, Tuple, Optional +from typing import Dict import numpy as np import pandas as pd diff --git a/src/estimint/hbr.py b/src/estimint/hbr.py index b1fea14..894495b 100644 --- a/src/estimint/hbr.py +++ b/src/estimint/hbr.py @@ -11,9 +11,8 @@ 5. EIR_new = EIR_baseline * (EIR_scaled / EIR_roundtrip) """ -from typing import Dict, Any, Optional, Union +from typing import Dict, Any, Optional -import numpy as np import pandas as pd from .run import run_xgb_model diff --git a/src/estimint/models.py b/src/estimint/models.py index 788282c..c8850e1 100644 --- a/src/estimint/models.py +++ b/src/estimint/models.py @@ -4,7 +4,7 @@ Equivalent to: models.R """ -from typing import Dict, Any, Optional, Callable, List +from typing import Dict, Any, Optional import numpy as np import xgboost as xgb from numpy.typing import ArrayLike diff --git a/src/estimint/plotting.py b/src/estimint/plotting.py index 6639eeb..ec26da5 100644 --- a/src/estimint/plotting.py +++ b/src/estimint/plotting.py @@ -4,7 +4,6 @@ Equivalent to: plotting.R """ -from typing import Optional from pathlib import Path import numpy as np diff --git a/src/estimint/train.py b/src/estimint/train.py index 2ed52db..447c74b 100644 --- a/src/estimint/train.py +++ b/src/estimint/train.py @@ -6,7 +6,7 @@ import pickle from pathlib import Path -from typing import Dict, Any, Optional, List +from typing import Dict, Any, Optional import numpy as np import pandas as pd diff --git a/src/estimint/utils.py b/src/estimint/utils.py index d945b34..8e2a5e3 100644 --- a/src/estimint/utils.py +++ b/src/estimint/utils.py @@ -5,9 +5,8 @@ """ import sys -import os from datetime import datetime -from typing import Optional, Dict, Any, List, Union +from typing import Optional, Dict, Any, Union from pathlib import Path import numpy as np diff --git a/tests/test_flows.py b/tests/test_flows.py index 5ace6a0..e963b0d 100644 --- a/tests/test_flows.py +++ b/tests/test_flows.py @@ -4,7 +4,6 @@ """ import pandas as pd -import pytest from estimint import ( load_xgb_model, From 8a014548ee24fd15d5284b6e19c74b4a44a08958 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 12:34:06 +0100 Subject: [PATCH 14/30] chore: drop committed coverage and metrics --- .coverage | Bin 53248 -> 0 bytes .gitignore | 7 +++++++ models/hbr/metrics/eir_OOF_metrics_K10CV.csv | 3 --- models/hbr/metrics/eir_test_metrics.csv | 2 -- models/hbr/metrics/hbr_OOF_metrics_K10CV.csv | 3 --- models/hbr/metrics/hbr_test_metrics.csv | 2 -- .../metrics/eir_OOF_metrics_K10CV.csv | 3 --- models/prevalence/metrics/eir_test_metrics.csv | 2 -- 8 files changed, 7 insertions(+), 15 deletions(-) delete mode 100644 .coverage delete mode 100644 models/hbr/metrics/eir_OOF_metrics_K10CV.csv delete mode 100644 models/hbr/metrics/eir_test_metrics.csv delete mode 100644 models/hbr/metrics/hbr_OOF_metrics_K10CV.csv delete mode 100644 models/hbr/metrics/hbr_test_metrics.csv delete mode 100644 models/prevalence/metrics/eir_OOF_metrics_K10CV.csv delete mode 100644 models/prevalence/metrics/eir_test_metrics.csv diff --git a/.coverage b/.coverage deleted file mode 100644 index 1a0fcec026e9c9e7548efa780d8c7df37451060d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmeI4UyK_^9mi+AYp>V;CVvR#xVEt2sDrqN+Se9sI?!Z}yMvOLA3h zq&xNau58cl%=~74zt8+;#$i}X$ooldmm zf6n=@mrT#SXtsoB zF53-Z+D_fBS%K}Wn8B(@a<_d^mlGYu(Nrfh&W7^xtYX(mDiAAFM9Z_AmbY$xPpnUe z8RFUku@*!TREV%w9GSyB9E(qxo>&&1aB9Mjv^Z?nr*c!5H*$LU;6dez2yL>w8olyc ztf7d$DW{gHpqlH|rS?_Na%!u>pEj+Yg*BJ-Tni#=J-0a*xMst4LNguT4s6#k#hR$K z15v-LfzuLNauB>hYpASq(x7vZWL(z(oxbp0B;)L{@G>dqxCz$2psbpNL!F&=vr5Rn z+itdGRf=wz*4N_U+x$oC$K-qLEbFvCp?fukokNzT|XhhT~3~ z(g^Z^`}3LdqX!j6UMbf6^9}mGRk7NE8(vqa@hkK6QTW0BtX`g&P_CR09Yx})RPDg; zofuo3rWd`9>&W!&{YLhZtxh6)QKMnH%VC$1(q_~+tQ9dEr$)oVZaWgW&b*N+pPbmv zb$TvPneUzEI%65VJU*^;jnIwa)`|mtiwh+!d6!`{NooqqZ+po=@Kied?mOm6;S8r^*p4DSx&_Ok}A|s~&ZC*(d`g zUR)J-6c^1#U$g=d*iB)|ETJ-?V_md-v*rm(q`7ozQvDz|kgZjjm!EQ#oRweYIunXs ze(*u1(~di1G|p6fn$(+CqIP_l+TtX)CHDR03=O#SZD-I=B)b6|@-nJH4sKBkRwD{Y zuK2r7Zb~lj6@G)!3kL{*00@8p2!H?xfB*=900@8p2!O!eBcLiNMVIUU6u-{+U+Dt} z2!H?xfB*=900@8p2!H?xfB*=9z(MS(W1N zF#Znz$4AmYC=CK200JNY0w4eaAOHd&00JNY0wB;MP*CqxlG^~OoH}mAcLC({|3Wd# z_*LHJM@u(LS4+>7PL$N*wc>Nd$0-2^2!H?xfB*=900@8p2!H?x>@fl-3L5JubE|Gs z%+Y`Tt(N7{P8W4CC;Y&E;?&p9&a~EpRo9vGy;>O8q`y$ltPmw{iva`^FP&63dEdGceD;mXLm)`2u5>wkSw>!?GkJ+S`I99J(5EuXCa)1wgYt^c(zYn}Z=*L~;uUmeAS zWc{C_22hP*Z$b>L|FQoc20su00T2KI5C8!X009sH0T2KI5ZKcMR7GV)`TSquHyOQf zfB*=900@8p2!H?xfB*=900@8p2<$-us!G52C%f{cUo!q4{{w%W|APOVKhN8|!qcUH zQ8W$^009sH0T2KI5C8!X009sH0T9?_0>|>2VyvaQZi<=g*)xnyvS$ynO@m$6XiIx~ zs?A#TNsqP9z44a+p95@j>4!gI>}iUlwKbh{n!WOUHTKJZcR*cROy?g5kLs?{O zUuasi_npER#U#h|{p{NBslM=tH^<{iq6}~KE=Z7__*jUTn94U;;n32 zo@w2;`Its$pEXj8rO|zW@cDmyzhlSEK!qRx0w4eaAOHd&00JNY0w4eaAOHe8LqI Date: Thu, 25 Jun 2026 13:06:45 +0100 Subject: [PATCH 15/30] docs: sync run_scenarios example to canonical keys --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6331e3d..cc8bcd0 100644 --- a/README.md +++ b/README.md @@ -133,30 +133,30 @@ from estimint import run_scenarios scenarios = [ dict(name="PBO nets, prevalence input, 60% more mosquitoes", input="prevalence", value=0.30, - net="pyrethroid_pbo", resistance=0.55, net_usage=0.85, - Q0=0.90, phi_bednets=0.85, seasonal=1, irs_use=0.40, lsm=0.0, + net_type_future="pyrethroid_pbo", res_use=0.55, itn_future=0.85, + Q0=0.90, phi=0.85, seasonal=1, irs=0.40, lsm=0.0, mosquito_delta=0.60), dict(name="Biting rate input", input="hbr", value=250000.0, - net="pyrethroid_ppf", resistance=0.45, net_usage=0.50, - Q0=0.80, phi_bednets=0.82, seasonal=0, irs_use=0.0), + net_type_future="pyrethroid_ppf", res_use=0.45, itn_future=0.50, + Q0=0.80, phi=0.82, seasonal=0, irs=0.0), dict(name="EIR supplied directly, no nets", input="eir", value=20.0, - Q0=0.88, phi_bednets=0.78, seasonal=1, irs_use=0.60), + Q0=0.88, phi=0.78, seasonal=1, irs=0.60), ] df = run_scenarios(scenarios) print(df[["name", "eir_baseline", "eir_final", "prev_y9", "cases_endline"]]) ``` -Every scenario needs `input` and `value`, plus `Q0`, `phi_bednets`, `seasonal` and -`irs_use`. `lsm` defaults to 0. To include nets give `net`, `resistance` and `net_usage`, -or leave `net` out for none. `mosquito_delta` only applies when `input` is `"prevalence"`. +Every scenario needs `input` and `value`, plus `Q0`, `phi`, `seasonal` and +`irs`. `lsm` defaults to 0. To include nets give `net_type_future`, `res_use` and `itn_future`, +or leave `net_type_future` out for none. `mosquito_delta` only applies when `input` is `"prevalence"`. The returned DataFrame has one row per scenario. Alongside the inputs it gives the estimated EIR (`eir_baseline`, and `eir_final` after any mosquito-density change) and the stateMINT output. That output is year-9 prevalence (`prev_y9`), endline prevalence and -cases, and the full 157-step `prev_series` and `cases_series`. What you do with it is up to +cases, and the full 157-step `prevalence` and `cases` series. What you do with it is up to you. The `estimint.scenarios` module is also where the simulation-based inference and experiment From 013b4716891435485594f21f9ac0764d304ffadb Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 13:16:06 +0100 Subject: [PATCH 16/30] refactor(hbr): use df for the dataframe in eir_to_hbr trainer --- models/hbr/train_eir_to_hbr.py | 70 +++++++++++++++++----------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/models/hbr/train_eir_to_hbr.py b/models/hbr/train_eir_to_hbr.py index 0fef99b..4f087ff 100644 --- a/models/hbr/train_eir_to_hbr.py +++ b/models/hbr/train_eir_to_hbr.py @@ -37,12 +37,12 @@ def main(): d.mkdir(parents=True, exist_ok=True) ts("Loading training data...") - dt = pd.read_parquet(DATA_PATH) - print(f"Loaded {len(dt):,} rows") + df = pd.read_parquet(DATA_PATH) + print(f"Loaded {len(df):,} rows") features = ["eir", "dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use"] - dt["hbr_log10"] = np.log10(dt["hbr_y9"]) + df["hbr_log10"] = np.log10(df["hbr_y9"]) xgb_params = { "objective": "reg:squarederror", @@ -60,18 +60,18 @@ def main(): ts("Creating %d strata on log10(HBR) and 70/15/15 split...", K_STRATA) np.random.seed(SEED) - hbr_log10 = dt["hbr_log10"].values.reshape(-1, 1) + hbr_log10 = df["hbr_log10"].values.reshape(-1, 1) km = KMeans(n_clusters=K_STRATA, n_init=50, max_iter=5000, random_state=SEED) km.fit(hbr_log10) centers = km.cluster_centers_.flatten() ord_idx = np.argsort(centers) id_map = {old_id: new_id + 1 for new_id, old_id in enumerate(ord_idx)} - dt["strat_bin"] = np.array([id_map[c] for c in km.labels_]) + df["strat_bin"] = np.array([id_map[c] for c in km.labels_]) - dt["split"] = None - for b in sorted(dt["strat_bin"].unique()): - idx = dt[dt["strat_bin"] == b].index.tolist() + df["split"] = None + for b in sorted(df["strat_bin"].unique()): + idx = df[df["strat_bin"] == b].index.tolist() n_b = len(idx) n_tr = int(np.floor(0.70 * n_b)) n_val = int(np.floor(0.15 * n_b)) @@ -82,48 +82,48 @@ def main(): val_idx = idx[n_tr:n_tr + n_val] if n_val > 0 else [] te_idx = idx[n_tr + n_val:] - dt.loc[tr_idx, "split"] = "train" - dt.loc[val_idx, "split"] = "val" - dt.loc[te_idx, "split"] = "test" + df.loc[tr_idx, "split"] = "train" + df.loc[val_idx, "split"] = "val" + df.loc[te_idx, "split"] = "test" - dt["split"] = dt["split"].fillna("train") + df["split"] = df["split"].fillna("train") - dt_test = dt[dt["split"] == "test"] - X_test = dt_test[features].values.astype(np.float64) - y_test = dt_test["hbr_log10"].values + df_test = df[df["split"] == "test"] + X_test = df_test[features].values.astype(np.float64) + y_test = df_test["hbr_log10"].values obs_hbr_test = np.power(10, y_test) - ts("Test set: %d rows", len(dt_test)) + ts("Test set: %d rows", len(df_test)) ts("Assigning %d-fold CV within TRAIN+VAL strata...", K_FOLDS) - dtcv = dt[dt["split"] != "test"].copy() + dfcv = df[df["split"] != "test"].copy() np.random.seed(SEED + 1) - dtcv["fold"] = 0 - for b in dtcv["strat_bin"].unique(): - mask = dtcv["strat_bin"] == b + dfcv["fold"] = 0 + for b in dfcv["strat_bin"].unique(): + mask = dfcv["strat_bin"] == b n_b = mask.sum() - idx = dtcv.index[mask].tolist() + idx = dfcv.index[mask].tolist() np.random.shuffle(idx) folds = np.tile(np.arange(1, K_FOLDS + 1), int(np.ceil(n_b / K_FOLDS)))[:n_b] np.random.shuffle(folds) - dtcv.loc[idx, "fold"] = folds + dfcv.loc[idx, "fold"] = folds ts("Running %d-fold CV with early stopping...", K_FOLDS) - oof_pred_raw = np.full(len(dtcv), np.nan) + oof_pred_raw = np.full(len(dfcv), np.nan) best_iters = np.zeros(K_FOLDS, dtype=int) for k in range(1, K_FOLDS + 1): ts(" Fold %d / %d", k, K_FOLDS) - idx_val = dtcv["fold"] == k - idx_tr = dtcv["fold"] != k + idx_val = dfcv["fold"] == k + idx_tr = dfcv["fold"] != k - X_tr = dtcv.loc[idx_tr, features].values.astype(np.float64) - y_tr = dtcv.loc[idx_tr, "hbr_log10"].values - X_va = dtcv.loc[idx_val, features].values.astype(np.float64) - y_va = dtcv.loc[idx_val, "hbr_log10"].values + X_tr = dfcv.loc[idx_tr, features].values.astype(np.float64) + y_tr = dfcv.loc[idx_tr, "hbr_log10"].values + X_va = dfcv.loc[idx_val, features].values.astype(np.float64) + y_va = dfcv.loc[idx_val, "hbr_log10"].values w_tr = make_value_weights(np.power(10, y_tr), digits=3) w_va = make_value_weights(np.power(10, y_va), digits=3) @@ -144,7 +144,7 @@ def main(): pred_log10_va = mdl.predict(dva) oof_pred_raw[idx_val.values] = np.power(10, pred_log10_va) - obs_cv_raw = np.power(10, dtcv["hbr_log10"].values) + obs_cv_raw = np.power(10, dfcv["hbr_log10"].values) ts("Fitting final calibrator (QMAP + positive scale) on OOF...") cal_oof = fit_qmap_w(oof_pred_raw, obs_cv_raw, ngrid=1024, round_digits=8) @@ -166,9 +166,9 @@ def main(): best_nrounds = int(np.round(np.median(best_iters))) print(f"Best nrounds: {best_nrounds}") - dt_trcv = dt[dt["split"] != "test"] - X_trcv = dt_trcv[features].values.astype(np.float64) - y_trcv = dt_trcv["hbr_log10"].values + df_trcv = df[df["split"] != "test"] + X_trcv = df_trcv[features].values.astype(np.float64) + y_trcv = df_trcv["hbr_log10"].values w_trcv = make_value_weights(np.power(10, y_trcv), digits=3) dtrcv = xgb.DMatrix(X_trcv, label=y_trcv, weight=w_trcv) @@ -217,8 +217,8 @@ def main(): "inverse": "pow10", "training_data": { "source": "datasets/estimint_simulations_y9.parquet (prev_y9 >= 0.01 AND hbr_y9 > 0)", - "n_rows": len(dt), - "n_params": dt["parameter_index"].nunique() + "n_rows": len(df), + "n_params": df["parameter_index"].nunique() }, "cv": { "K": K_FOLDS, From 8c5327ffdf0b1ef0578d90f804910ae99c531da9 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 13:17:53 +0100 Subject: [PATCH 17/30] refactor: use df for the dataframe in remaining trainers --- models/hbr/train_hbr_to_eir.py | 70 +++++++++++++++++----------------- models/prevalence/train.py | 70 +++++++++++++++++----------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/models/hbr/train_hbr_to_eir.py b/models/hbr/train_hbr_to_eir.py index dfb717a..b42ea80 100644 --- a/models/hbr/train_hbr_to_eir.py +++ b/models/hbr/train_hbr_to_eir.py @@ -36,12 +36,12 @@ def main(): d.mkdir(parents=True, exist_ok=True) ts("Loading training data...") - DT = pd.read_parquet(DATA_PATH) - print(f"Loaded {len(DT):,} rows") + df = pd.read_parquet(DATA_PATH) + print(f"Loaded {len(df):,} rows") features = ["dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "hbr_y9"] - DT["eir_log10"] = np.log10(DT["eir"]) + df["eir_log10"] = np.log10(df["eir"]) # monotone constraint: hbr_y9 (index 6) positively correlated with EIR xgb_params = { @@ -62,18 +62,18 @@ def main(): ts("Creating %d strata on log10(EIR) and 70/15/15 split...", K_STRATA) np.random.seed(SEED) - eir_log10 = DT["eir_log10"].values.reshape(-1, 1) + eir_log10 = df["eir_log10"].values.reshape(-1, 1) km = KMeans(n_clusters=K_STRATA, n_init=50, max_iter=5000, random_state=SEED) km.fit(eir_log10) centers = km.cluster_centers_.flatten() ord_idx = np.argsort(centers) id_map = {old_id: new_id + 1 for new_id, old_id in enumerate(ord_idx)} - DT["strat_bin"] = np.array([id_map[c] for c in km.labels_]) + df["strat_bin"] = np.array([id_map[c] for c in km.labels_]) - DT["split"] = None - for b in sorted(DT["strat_bin"].unique()): - idx = DT[DT["strat_bin"] == b].index.tolist() + df["split"] = None + for b in sorted(df["strat_bin"].unique()): + idx = df[df["strat_bin"] == b].index.tolist() n_b = len(idx) n_tr = int(np.floor(0.70 * n_b)) n_val = int(np.floor(0.15 * n_b)) @@ -84,48 +84,48 @@ def main(): val_idx = idx[n_tr:n_tr + n_val] if n_val > 0 else [] te_idx = idx[n_tr + n_val:] - DT.loc[tr_idx, "split"] = "train" - DT.loc[val_idx, "split"] = "val" - DT.loc[te_idx, "split"] = "test" + df.loc[tr_idx, "split"] = "train" + df.loc[val_idx, "split"] = "val" + df.loc[te_idx, "split"] = "test" - DT["split"] = DT["split"].fillna("train") + df["split"] = df["split"].fillna("train") - DT_test = DT[DT["split"] == "test"] - X_test = DT_test[features].values.astype(np.float64) - y_test = DT_test["eir_log10"].values + df_test = df[df["split"] == "test"] + X_test = df_test[features].values.astype(np.float64) + y_test = df_test["eir_log10"].values obs_eir_test = np.power(10, y_test) - ts("Test set: %d rows", len(DT_test)) + ts("Test set: %d rows", len(df_test)) ts("Assigning %d-fold CV within TRAIN+VAL strata...", K_FOLDS) - DTcv = DT[DT["split"] != "test"].copy() + dfcv = df[df["split"] != "test"].copy() np.random.seed(SEED + 1) - DTcv["fold"] = 0 - for b in DTcv["strat_bin"].unique(): - mask = DTcv["strat_bin"] == b + dfcv["fold"] = 0 + for b in dfcv["strat_bin"].unique(): + mask = dfcv["strat_bin"] == b n_b = mask.sum() - idx = DTcv.index[mask].tolist() + idx = dfcv.index[mask].tolist() np.random.shuffle(idx) folds = np.tile(np.arange(1, K_FOLDS + 1), int(np.ceil(n_b / K_FOLDS)))[:n_b] np.random.shuffle(folds) - DTcv.loc[idx, "fold"] = folds + dfcv.loc[idx, "fold"] = folds ts("Running %d-fold CV with early stopping...", K_FOLDS) - oof_pred_raw = np.full(len(DTcv), np.nan) + oof_pred_raw = np.full(len(dfcv), np.nan) best_iters = np.zeros(K_FOLDS, dtype=int) for k in range(1, K_FOLDS + 1): ts(" Fold %d / %d", k, K_FOLDS) - idx_val = DTcv["fold"] == k - idx_tr = DTcv["fold"] != k + idx_val = dfcv["fold"] == k + idx_tr = dfcv["fold"] != k - X_tr = DTcv.loc[idx_tr, features].values.astype(np.float64) - y_tr = DTcv.loc[idx_tr, "eir_log10"].values - X_va = DTcv.loc[idx_val, features].values.astype(np.float64) - y_va = DTcv.loc[idx_val, "eir_log10"].values + X_tr = dfcv.loc[idx_tr, features].values.astype(np.float64) + y_tr = dfcv.loc[idx_tr, "eir_log10"].values + X_va = dfcv.loc[idx_val, features].values.astype(np.float64) + y_va = dfcv.loc[idx_val, "eir_log10"].values w_tr = make_value_weights(np.power(10, y_tr), digits=3) w_va = make_value_weights(np.power(10, y_va), digits=3) @@ -146,7 +146,7 @@ def main(): pred_log10_va = mdl.predict(dva) oof_pred_raw[idx_val.values] = np.power(10, pred_log10_va) - obs_cv_raw = np.power(10, DTcv["eir_log10"].values) + obs_cv_raw = np.power(10, dfcv["eir_log10"].values) ts("Fitting final calibrator (QMAP + positive scale) on OOF...") cal_oof = fit_qmap_w(oof_pred_raw, obs_cv_raw, ngrid=1024, round_digits=8) @@ -168,9 +168,9 @@ def main(): best_nrounds = int(np.round(np.median(best_iters))) print(f"Best nrounds: {best_nrounds}") - DT_trcv = DT[DT["split"] != "test"] - X_trcv = DT_trcv[features].values.astype(np.float64) - y_trcv = DT_trcv["eir_log10"].values + df_trcv = df[df["split"] != "test"] + X_trcv = df_trcv[features].values.astype(np.float64) + y_trcv = df_trcv["eir_log10"].values w_trcv = make_value_weights(np.power(10, y_trcv), digits=3) dtrcv = xgb.DMatrix(X_trcv, label=y_trcv, weight=w_trcv) @@ -222,8 +222,8 @@ def main(): }, "training_data": { "source": "datasets/estimint_simulations_y9.parquet (hbr_y9 > 0)", - "n_rows": len(DT), - "n_params": DT["parameter_index"].nunique() + "n_rows": len(df), + "n_params": df["parameter_index"].nunique() }, "cv": { "K": K_FOLDS, diff --git a/models/prevalence/train.py b/models/prevalence/train.py index 75a0a8b..3cdb65c 100644 --- a/models/prevalence/train.py +++ b/models/prevalence/train.py @@ -36,12 +36,12 @@ def main(): d.mkdir(parents=True, exist_ok=True) ts("Loading training data...") - DT = pd.read_parquet(DATA_PATH) - print(f"Loaded {len(DT):,} rows") + df = pd.read_parquet(DATA_PATH) + print(f"Loaded {len(df):,} rows") features = ["dn0_use", "Q0", "phi_bednets", "seasonal", "itn_use", "irs_use", "prev_y9"] - DT["eir_log10"] = np.log10(DT["eir"]) + df["eir_log10"] = np.log10(df["eir"]) # monotone constraint: prev_y9 (index 6) positively correlated with EIR xgb_params = { @@ -62,18 +62,18 @@ def main(): ts("Creating %d strata on log10(EIR) and 70/15/15 split...", K_STRATA) np.random.seed(SEED) - eir_log10 = DT["eir_log10"].values.reshape(-1, 1) + eir_log10 = df["eir_log10"].values.reshape(-1, 1) km = KMeans(n_clusters=K_STRATA, n_init=50, max_iter=5000, random_state=SEED) km.fit(eir_log10) centers = km.cluster_centers_.flatten() ord_idx = np.argsort(centers) id_map = {old_id: new_id + 1 for new_id, old_id in enumerate(ord_idx)} - DT["strat_bin"] = np.array([id_map[c] for c in km.labels_]) + df["strat_bin"] = np.array([id_map[c] for c in km.labels_]) - DT["split"] = None - for b in sorted(DT["strat_bin"].unique()): - idx = DT[DT["strat_bin"] == b].index.tolist() + df["split"] = None + for b in sorted(df["strat_bin"].unique()): + idx = df[df["strat_bin"] == b].index.tolist() n_b = len(idx) n_tr = int(np.floor(0.70 * n_b)) n_val = int(np.floor(0.15 * n_b)) @@ -84,48 +84,48 @@ def main(): val_idx = idx[n_tr:n_tr + n_val] if n_val > 0 else [] te_idx = idx[n_tr + n_val:] - DT.loc[tr_idx, "split"] = "train" - DT.loc[val_idx, "split"] = "val" - DT.loc[te_idx, "split"] = "test" + df.loc[tr_idx, "split"] = "train" + df.loc[val_idx, "split"] = "val" + df.loc[te_idx, "split"] = "test" - DT["split"] = DT["split"].fillna("train") + df["split"] = df["split"].fillna("train") - DT_test = DT[DT["split"] == "test"] - X_test = DT_test[features].values.astype(np.float64) - y_test = DT_test["eir_log10"].values + df_test = df[df["split"] == "test"] + X_test = df_test[features].values.astype(np.float64) + y_test = df_test["eir_log10"].values obs_eir_test = np.power(10, y_test) - ts("Test set: %d rows", len(DT_test)) + ts("Test set: %d rows", len(df_test)) ts("Assigning %d-fold CV within TRAIN+VAL strata...", K_FOLDS) - DTcv = DT[DT["split"] != "test"].copy() + dfcv = df[df["split"] != "test"].copy() np.random.seed(SEED + 1) - DTcv["fold"] = 0 - for b in DTcv["strat_bin"].unique(): - mask = DTcv["strat_bin"] == b + dfcv["fold"] = 0 + for b in dfcv["strat_bin"].unique(): + mask = dfcv["strat_bin"] == b n_b = mask.sum() - idx = DTcv.index[mask].tolist() + idx = dfcv.index[mask].tolist() np.random.shuffle(idx) folds = np.tile(np.arange(1, K_FOLDS + 1), int(np.ceil(n_b / K_FOLDS)))[:n_b] np.random.shuffle(folds) - DTcv.loc[idx, "fold"] = folds + dfcv.loc[idx, "fold"] = folds ts("Running %d-fold CV with early stopping...", K_FOLDS) - oof_pred_raw = np.full(len(DTcv), np.nan) + oof_pred_raw = np.full(len(dfcv), np.nan) best_iters = np.zeros(K_FOLDS, dtype=int) for k in range(1, K_FOLDS + 1): ts(" Fold %d / %d", k, K_FOLDS) - idx_val = DTcv["fold"] == k - idx_tr = DTcv["fold"] != k + idx_val = dfcv["fold"] == k + idx_tr = dfcv["fold"] != k - X_tr = DTcv.loc[idx_tr, features].values.astype(np.float64) - y_tr = DTcv.loc[idx_tr, "eir_log10"].values - X_va = DTcv.loc[idx_val, features].values.astype(np.float64) - y_va = DTcv.loc[idx_val, "eir_log10"].values + X_tr = dfcv.loc[idx_tr, features].values.astype(np.float64) + y_tr = dfcv.loc[idx_tr, "eir_log10"].values + X_va = dfcv.loc[idx_val, features].values.astype(np.float64) + y_va = dfcv.loc[idx_val, "eir_log10"].values w_tr = make_value_weights(np.power(10, y_tr), digits=3) w_va = make_value_weights(np.power(10, y_va), digits=3) @@ -146,7 +146,7 @@ def main(): pred_log10_va = mdl.predict(dva) oof_pred_raw[idx_val.values] = np.power(10, pred_log10_va) - obs_cv_raw = np.power(10, DTcv["eir_log10"].values) + obs_cv_raw = np.power(10, dfcv["eir_log10"].values) ts("Fitting final calibrator (QMAP + positive scale) on OOF...") cal_oof = fit_qmap_w(oof_pred_raw, obs_cv_raw, ngrid=1024, round_digits=8) @@ -168,9 +168,9 @@ def main(): best_nrounds = int(np.round(np.median(best_iters))) print(f"Best nrounds: {best_nrounds}") - DT_trcv = DT[DT["split"] != "test"] - X_trcv = DT_trcv[features].values.astype(np.float64) - y_trcv = DT_trcv["eir_log10"].values + df_trcv = df[df["split"] != "test"] + X_trcv = df_trcv[features].values.astype(np.float64) + y_trcv = df_trcv["eir_log10"].values w_trcv = make_value_weights(np.power(10, y_trcv), digits=3) dtrcv = xgb.DMatrix(X_trcv, label=y_trcv, weight=w_trcv) @@ -223,8 +223,8 @@ def main(): }, "training_data": { "source": "datasets/estimint_simulations_y9.parquet (prev_y9 >= 0.02)", - "n_rows": len(DT), - "n_params": DT["parameter_index"].nunique() + "n_rows": len(df), + "n_params": df["parameter_index"].nunique() }, "cv": { "K": K_FOLDS, From 4a7493e9bd67631c300f18bc1f81a46ceef47933 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 13:24:30 +0100 Subject: [PATCH 18/30] docs: clarify y9 columns are year-9 means, not 'aggregates' --- datasets/README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/datasets/README.md b/datasets/README.md index 44b7de9..93f6908 100644 --- a/datasets/README.md +++ b/datasets/README.md @@ -2,8 +2,10 @@ Training data for retraining the estiMINT models. Not shipped with the package. -**`estimint_simulations_y9.parquet`** — 16,384 rows (4,096 parameter sets × 4 sims), -year-9 aggregates. Columns: `parameter_index`, `simulation_index`, `eir`, `dn0_use`, -`Q0`, `phi_bednets`, `seasonal`, `itn_use`, `irs_use`, `prev_y9`, `hbr_y9`. +**`estimint_simulations_y9.parquet`** — 16,384 rows (4,096 parameter sets × 4 sims). +`prev_y9` and `hbr_y9` are year-9 means: prevalence and human biting rate averaged over +the 365 days of simulation year 9 (the year ending at the intervention on day 3285). +Columns: `parameter_index`, `simulation_index`, `eir`, `dn0_use`, `Q0`, `phi_bednets`, +`seasonal`, `itn_use`, `irs_use`, `prev_y9`, `hbr_y9`. Each model's `prepare.py` filters this source and sorts by key into its training view. From eb676f75ae6becdb851cccbb409171c2b1dbddd3 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 14:20:36 +0100 Subject: [PATCH 19/30] fix(scenarios): map current/future nets, IRS, LSM and routine covariates 1:1 with minte --- README.md | 14 ++++++--- src/estimint/scenarios.py | 64 ++++++++++++++++++++++++++------------- tests/test_scenarios.py | 61 +++++++++++++++++++++++++++++++++---- 3 files changed, 107 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index cc8bcd0..8f3b46e 100644 --- a/README.md +++ b/README.md @@ -133,12 +133,12 @@ from estimint import run_scenarios scenarios = [ dict(name="PBO nets, prevalence input, 60% more mosquitoes", input="prevalence", value=0.30, - net_type_future="pyrethroid_pbo", res_use=0.55, itn_future=0.85, + res_use=0.55, py_pbo=0.85, Q0=0.90, phi=0.85, seasonal=1, irs=0.40, lsm=0.0, mosquito_delta=0.60), - dict(name="Biting rate input", + dict(name="Biting rate input, mixed nets", input="hbr", value=250000.0, - net_type_future="pyrethroid_ppf", res_use=0.45, itn_future=0.50, + res_use=0.45, py_only=0.30, py_ppf=0.20, Q0=0.80, phi=0.82, seasonal=0, irs=0.0), dict(name="EIR supplied directly, no nets", input="eir", value=20.0, @@ -150,8 +150,12 @@ print(df[["name", "eir_baseline", "eir_final", "prev_y9", "cases_endline"]]) ``` Every scenario needs `input` and `value`, plus `Q0`, `phi`, `seasonal` and -`irs`. `lsm` defaults to 0. To include nets give `net_type_future`, `res_use` and `itn_future`, -or leave `net_type_future` out for none. `mosquito_delta` only applies when `input` is `"prevalence"`. +`irs`. `lsm` and `routine` default to 0; `irs_future` defaults to `irs`. **Current +nets:** give `res_use` and a net-type usage mix (`py_only`, `py_pbo`, `py_pyrrole`, +`py_ppf` shares), or leave the net keys out for none. **Future nets:** give +`net_type_future` + `itn_future` + `res_future` to switch net type; omit them and the +current mix carries forward (at `res_future` if given), or set `itn_future=0` to remove +nets. `mosquito_delta` only applies when `input` is `"prevalence"`. The returned DataFrame has one row per scenario. Alongside the inputs it gives the estimated EIR (`eir_baseline`, and `eir_final` after any mosquito-density change) and the diff --git a/src/estimint/scenarios.py b/src/estimint/scenarios.py index 59554d2..a1e0c09 100644 --- a/src/estimint/scenarios.py +++ b/src/estimint/scenarios.py @@ -7,7 +7,7 @@ import numpy as np import pandas as pd -from .bednet import calculate_dn0 +from .bednet import calculate_dn0, DN0Result from .run import run_xgb_model from .hbr import estimate_eir_with_mosquito_delta from .storage import load_xgb_model @@ -20,6 +20,29 @@ _MODELS: Dict[str, Any] = {} _EMULATORS: Dict[str, Dict[str, Any]] = {} +_NET_KEYS = ("py_only", "py_pbo", "py_pyrrole", "py_ppf", + "pyrethroid_only", "pyrethroid_pbo", "pyrethroid_pyrrole", "pyrethroid_ppf") + + +def _bednet(scn: Dict[str, Any]): + """Current and future net (dn0, itn_use); returns (cur, net_now, net_next).""" + cur = {nt: float(scn[nt]) for nt in _NET_KEYS if scn.get(nt)} + res_use = float(scn.get("res_use", 0.0)) + res_future = float(scn["res_future"]) if scn.get("res_future") is not None else res_use + + net_now = calculate_dn0(res_use, **cur) if cur else DN0Result(0.0, 0.0) + + net_future = scn.get("net_type_future") + itn_future = scn.get("itn_future") + itn_future = None if itn_future is None else float(itn_future) + if itn_future == 0.0: + net_next = DN0Result(0.0, 0.0) + elif not net_future or itn_future is None: + net_next = calculate_dn0(res_future, **cur) if cur else DN0Result(0.0, 0.0) + else: + net_next = calculate_dn0(res_future, **{net_future: itn_future}) + return cur, net_now, net_next + def _est_models() -> Dict[str, Any]: if not _MODELS: @@ -47,15 +70,18 @@ def _emulators(hf_repo: str) -> Dict[str, Any]: def _estimate_eir(scn: Dict[str, Any], est: Dict[str, Any]) -> Dict[str, Any]: """scenario -> EIR + the stateMINT covariate dict.""" - net = scn.get("net_type_future") - if net: - res = calculate_dn0(scn["res_use"], **{net: scn["itn_future"]}) - dn0_use, itn_use = res.dn0, res.itn_use * scn["itn_future"] - else: - dn0_use = itn_use = 0.0 + cur, net_now, net_next = _bednet(scn) + dn0_use, itn_use = net_now.dn0, net_now.itn_use + dn0_future, itn_future = net_next.dn0, net_next.itn_use Q0, phi, seasonal = scn["Q0"], scn["phi"], float(scn["seasonal"]) - irs_use, lsm = scn["irs"], scn.get("lsm", 0.0) + irs_use = scn["irs"] + irs_future = scn.get("irs_future", irs_use) + routine = scn.get("routine", 0.0) + ppf = float(scn.get("py_ppf", 0.0)) + float(scn.get("pyrethroid_ppf", 0.0)) + lsm = float(scn.get("lsm", 0.0)) + if ppf > 0: + lsm = min(ppf * 0.248 + lsm, 1.0) feats = dict(dn0_use=dn0_use, Q0=Q0, phi_bednets=phi, seasonal=seasonal, itn_use=itn_use, irs_use=irs_use) @@ -75,12 +101,14 @@ def _estimate_eir(scn: Dict[str, Any], est: Dict[str, Any]) -> Dict[str, Any]: r = estimate_eir_with_mosquito_delta(prevalence=value, mosquito_delta=delta, **feats) eir_final, hbr_baseline, hbr_new = r["eir_new"], r["hbr_baseline"], r["hbr_new"] - # future = use: interventions stay on past day 3285. - cov = dict(eir=eir_final, dn0_use=dn0_use, dn0_future=dn0_use, Q0=Q0, phi_bednets=phi, - seasonal=seasonal, routine=0.0, itn_use=itn_use, irs_use=irs_use, - itn_future=itn_use, irs_future=irs_use, lsm=lsm) - row = dict(name=scn.get("name"), input_mode=mode, net=net or "none", - dn0_use=dn0_use, itn_use=itn_use, irs_use=irs_use, lsm=lsm, seasonal=seasonal, + cov = dict(eir=eir_final, dn0_use=dn0_use, dn0_future=dn0_future, Q0=Q0, phi_bednets=phi, + seasonal=seasonal, routine=routine, itn_use=itn_use, irs_use=irs_use, + itn_future=itn_future, irs_future=irs_future, lsm=lsm) + row = dict(name=scn.get("name"), input_mode=mode, net="+".join(cur) or "none", + net_future=scn.get("net_type_future") or "none", + dn0_use=dn0_use, itn_use=itn_use, irs_use=irs_use, + dn0_future=dn0_future, itn_future=itn_future, irs_future=irs_future, + routine=routine, lsm=lsm, seasonal=seasonal, eir_baseline=eir_base, mosquito_delta=delta, eir_final=eir_final, hbr_baseline=hbr_baseline, hbr_new=hbr_new) return {"row": row, "cov": cov} @@ -91,13 +119,7 @@ def run_scenarios( *, hf_repo: str = HF_REPO, ) -> pd.DataFrame: - """Run scenarios end-to-end (estiMINT EIR -> stateMINT emulator) -> DataFrame. - - Each scenario: input ("prevalence"|"hbr"|"eir") + value; Q0, phi, seasonal, - irs; lsm (opt); nets via net_type_future/res_use/itn_future (opt); mosquito_delta (opt, - prevalence only); name (opt). Output adds prev_y9/prev_endline/cases_endline and the - length-157 prevalence/cases series. - """ + if isinstance(scenarios, pd.DataFrame): scenarios = scenarios.to_dict(orient="records") if not scenarios: diff --git a/tests/test_scenarios.py b/tests/test_scenarios.py index 53ca498..e674174 100644 --- a/tests/test_scenarios.py +++ b/tests/test_scenarios.py @@ -36,13 +36,61 @@ def test_hbr_input(self, est): out = _estimate_eir(dict(input="hbr", value=250000.0, **INTV), est) assert out["row"]["eir_baseline"] > 0 - def test_bednet_spec_scales_itn_by_usage(self, est): - # mirrors the demo script: itn_use = calculate_dn0(...).itn_use * itn_future + def test_bednet_mix_matches_minte(self, est): + # net-type usage mix feeds calculate_dn0 directly, same as minte; itn_use + # is the sum of pyrethroid shares (NOT rescaled by coverage again). out = _estimate_eir( - dict(input="prevalence", value=0.30, net_type_future="pyrethroid_only", - res_use=0.30, itn_future=0.70, **INTV), est) + dict(input="prevalence", value=0.30, py_only=0.70, py_pbo=0.30, + res_use=0.30, **INTV), est) assert out["row"]["dn0_use"] > 0 - assert out["row"]["itn_use"] == pytest.approx(0.70 * 0.70) + assert out["row"]["itn_use"] == pytest.approx(1.00) + assert out["row"]["net"] == "py_only+py_pbo" + + def test_future_net_switch_is_separate_leg(self, est): + # net_type_future/itn_future/res_future drive the future leg, not current nets + out = _estimate_eir( + dict(input="prevalence", value=0.30, py_only=0.50, res_use=0.30, + net_type_future="pyrethroid_pbo", itn_future=0.70, res_future=0.55, + **INTV), est)["row"] + assert out["itn_use"] == pytest.approx(0.50) # current: py_only=0.50 + assert out["itn_future"] == pytest.approx(0.70) # future: pbo=0.70 + assert out["dn0_use"] != out["dn0_future"] + assert out["net"] == "py_only" and out["net_future"] == "pyrethroid_pbo" + + def test_future_unchanged_carries_mix_forward(self, est): + # no future net named -> current mix carried forward at res_future + out = _estimate_eir( + dict(input="prevalence", value=0.30, py_pbo=0.80, res_use=0.30, + res_future=0.60, **INTV), est)["row"] + assert out["itn_future"] == pytest.approx(out["itn_use"]) == pytest.approx(0.80) + assert out["dn0_future"] < out["dn0_use"] # higher future resistance -> lower dn0 + + def test_future_nets_removed(self, est): + # itn_future == 0 removes nets in the future leg + out = _estimate_eir( + dict(input="prevalence", value=0.30, py_only=0.60, res_use=0.30, + itn_future=0.0, **INTV), est)["row"] + assert out["itn_use"] == pytest.approx(0.60) + assert out["dn0_future"] == 0.0 and out["itn_future"] == 0.0 + + def test_ppf_boosts_lsm(self, est): + # PPF nets add larviciding to LSM (minte: py_ppf * 0.248) + out = _estimate_eir( + dict(input="eir", value=15.0, py_ppf=0.50, res_use=0.30, lsm=0.10, **INTV), est) + assert out["cov"]["lsm"] == pytest.approx(0.50 * 0.248 + 0.10) + + def test_irs_future_and_routine_are_inputs(self, est): + # irs_future and routine are separate scenario inputs, like minte + out = _estimate_eir( + dict(input="eir", value=15.0, Q0=0.87, phi=0.82, seasonal=0.0, + irs=0.40, irs_future=0.10, routine=0.25), est)["cov"] + assert out["irs_use"] == 0.40 and out["irs_future"] == 0.10 + assert out["routine"] == 0.25 + + def test_irs_future_and_routine_defaults(self, est): + out = _estimate_eir(dict(input="eir", value=15.0, **INTV), est)["cov"] + assert out["irs_future"] == out["irs_use"] # defaults to irs + assert out["routine"] == 0.0 def test_mosquito_delta_direction(self, est): up = _estimate_eir(dict(input="prevalence", value=0.30, mosquito_delta=0.25, **INTV), est) @@ -70,7 +118,8 @@ def test_end_to_end(self): pytest.importorskip("stateMINT", reason="stateMINT not installed") df = run_scenarios([ dict(name="prev+delta", input="prevalence", value=0.30, - net_type_future="pyrethroid_pbo", res_use=0.55, itn_future=0.85, + py_only=0.60, res_use=0.55, net_type_future="pyrethroid_pbo", + itn_future=0.85, res_future=0.55, Q0=0.90, phi=0.85, seasonal=1, irs=0.40, mosquito_delta=0.60), dict(name="eir", input="eir", value=20.0, Q0=0.88, phi=0.78, seasonal=1, irs=0.60), From d8a4e741d1be35fa8fb689d9ddac1a42041d3a76 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 14:48:39 +0100 Subject: [PATCH 20/30] update manifest --- MANIFEST.in | 1 - 1 file changed, 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index e819d4a..851de40 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,3 @@ include README.md recursive-include src/estimint/data * -recursive-include src/estimint/inst * prune tests From e6ba6535ca186507ac748b7b2a242b43769e38c3 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 14:50:04 +0100 Subject: [PATCH 21/30] verbump --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 23de981..d938f54 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "estimint" -version = "1.4.2" +version = "1.4.3" description = "EIR Estimation using Machine learning interventions " readme = "README.md" license = "MIT" From 70c43e7aece86d7bd8f088ad733bb542f2c886b3 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 14:58:56 +0100 Subject: [PATCH 22/30] verbump --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d938f54..6cb5f63 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "estimint" -version = "1.4.3" +version = "1.4.4" description = "EIR Estimation using Machine learning interventions " readme = "README.md" license = "MIT" From 0516fbcf03c934934c770710bb6ac2fc003f970a Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 15:32:25 +0100 Subject: [PATCH 23/30] fix(ci): sync uv.lock to estimint 1.4.4 The publish workflow bumped pyproject.toml to 1.4.3 then 1.4.4 without regenerating the lockfile, so uv.lock still pinned estimint 1.4.2. CI runs `uv sync --locked`, which aborts when the lockfile is stale -- failing the tests job before any test could run. Regenerated with the CI-pinned uv 0.11.18. Co-Authored-By: Claude Opus 4.8 (1M context) --- uv.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uv.lock b/uv.lock index 4e2de78..64701fe 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.12" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", @@ -361,7 +361,7 @@ wheels = [ [[package]] name = "estimint" -version = "1.4.2" +version = "1.4.4" source = { editable = "." } dependencies = [ { name = "numpy" }, From 121e9a2083b29925b84ac00ec834c1d885447d06 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 15:42:05 +0100 Subject: [PATCH 24/30] build: add scripts/release.sh for atomic version bumps Replaces the manual "verbump" edit (which bumped pyproject.toml but left uv.lock stale, breaking `uv sync --locked` in CI). The script runs `uv version --bump`, which rewrites pyproject.toml and uv.lock together, then commits and tags. Pushing the tag stays a manual step since it triggers the irreversible PyPI publish. Co-Authored-By: Claude Opus 4.8 (1M context) --- scripts/release.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100755 scripts/release.sh diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..2db3be6 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# +# Cut a release: bump the version in pyproject.toml AND uv.lock together, +# commit, and tag. Pushing the tag is left as a deliberate manual step +# because it triggers the PyPI publish (which cannot be undone). +# +# Usage: +# ./scripts/release.sh [patch|minor|major] # default: patch +# +# The key point: `uv version --bump` rewrites pyproject.toml and uv.lock in +# lockstep, so the lockfile can never go stale and `uv sync --locked` (CI) +# can never fail on a version mismatch again. + +set -euo pipefail + +part="${1:-patch}" + +case "$part" in + patch|minor|major) ;; + *) echo "error: part must be patch, minor or major (got '$part')" >&2; exit 1 ;; +esac + +# Refuse to run on a dirty tree so the bump lands as an isolated commit. +if [[ -n "$(git status --porcelain)" ]]; then + echo "error: working tree is dirty -- commit or stash your changes first." >&2 + exit 1 +fi + +branch="$(git rev-parse --abbrev-ref HEAD)" +if [[ "$branch" != "master" ]]; then + echo "warning: you are on '$branch', not master. Releases usually come from master." >&2 +fi + +old="$(uv version --short)" +uv version --bump "$part" # updates pyproject.toml + uv.lock atomically +new="$(uv version --short)" + +git commit -am "verbump to v${new}" +git tag "v${new}" + +echo +echo "Bumped ${old} -> ${new}, committed, and tagged v${new}." +echo "When you're ready to publish to PyPI, push the commit and the tag:" +echo +echo " git push && git push origin v${new}" +echo From 90bc0fe925d118b040e542c33184b1dd463a2f86 Mon Sep 17 00:00:00 2001 From: CosmoNaught Date: Thu, 25 Jun 2026 15:49:01 +0100 Subject: [PATCH 25/30] remove scripts folder --- scripts/release.sh | 46 ---------------------------------------------- 1 file changed, 46 deletions(-) delete mode 100755 scripts/release.sh diff --git a/scripts/release.sh b/scripts/release.sh deleted file mode 100755 index 2db3be6..0000000 --- a/scripts/release.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash -# -# Cut a release: bump the version in pyproject.toml AND uv.lock together, -# commit, and tag. Pushing the tag is left as a deliberate manual step -# because it triggers the PyPI publish (which cannot be undone). -# -# Usage: -# ./scripts/release.sh [patch|minor|major] # default: patch -# -# The key point: `uv version --bump` rewrites pyproject.toml and uv.lock in -# lockstep, so the lockfile can never go stale and `uv sync --locked` (CI) -# can never fail on a version mismatch again. - -set -euo pipefail - -part="${1:-patch}" - -case "$part" in - patch|minor|major) ;; - *) echo "error: part must be patch, minor or major (got '$part')" >&2; exit 1 ;; -esac - -# Refuse to run on a dirty tree so the bump lands as an isolated commit. -if [[ -n "$(git status --porcelain)" ]]; then - echo "error: working tree is dirty -- commit or stash your changes first." >&2 - exit 1 -fi - -branch="$(git rev-parse --abbrev-ref HEAD)" -if [[ "$branch" != "master" ]]; then - echo "warning: you are on '$branch', not master. Releases usually come from master." >&2 -fi - -old="$(uv version --short)" -uv version --bump "$part" # updates pyproject.toml + uv.lock atomically -new="$(uv version --short)" - -git commit -am "verbump to v${new}" -git tag "v${new}" - -echo -echo "Bumped ${old} -> ${new}, committed, and tagged v${new}." -echo "When you're ready to publish to PyPI, push the commit and the tag:" -echo -echo " git push && git push origin v${new}" -echo From b2e9ae0d0ab5027e1dd280b3bc988ee260b362db Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Thu, 25 Jun 2026 21:06:58 +0100 Subject: [PATCH 26/30] refactor: update scenarios to use Scenario dataclass for improved clarity and structure --- README.md | 41 +++++---- src/estimint/__init__.py | 3 +- src/estimint/scenarios.py | 183 ++++++++++++++++++++++++-------------- tests/test_scenarios.py | 74 ++++++++------- 4 files changed, 183 insertions(+), 118 deletions(-) diff --git a/README.md b/README.md index 8f3b46e..e9b58dc 100644 --- a/README.md +++ b/README.md @@ -129,33 +129,36 @@ download from HuggingFace. ```python from estimint import run_scenarios +from estimint.scenarios import Scenario scenarios = [ - dict(name="PBO nets, prevalence input, 60% more mosquitoes", - input="prevalence", value=0.30, - res_use=0.55, py_pbo=0.85, - Q0=0.90, phi=0.85, seasonal=1, irs=0.40, lsm=0.0, - mosquito_delta=0.60), - dict(name="Biting rate input, mixed nets", - input="hbr", value=250000.0, - res_use=0.45, py_only=0.30, py_ppf=0.20, - Q0=0.80, phi=0.82, seasonal=0, irs=0.0), - dict(name="EIR supplied directly, no nets", - input="eir", value=20.0, - Q0=0.88, phi=0.78, seasonal=1, irs=0.60), + Scenario(name="PBO nets, prevalence input, 60% more mosquitoes", + input="prevalence", value=0.30, + res_use=0.55, py_pbo=0.85, + Q0=0.90, phi=0.85, seasonal=1, irs=0.40, lsm=0.0, + mosquito_delta=0.60), + Scenario(name="Biting rate input, mixed nets", + input="hbr", value=250000.0, + res_use=0.45, py_only=0.30, py_ppf=0.20, + Q0=0.80, phi=0.82, seasonal=0, irs=0.0), + Scenario(name="EIR supplied directly, no nets", + input="eir", value=20.0, res_use=0.0, + Q0=0.88, phi=0.78, seasonal=1, irs=0.60), ] df = run_scenarios(scenarios) print(df[["name", "eir_baseline", "eir_final", "prev_y9", "cases_endline"]]) ``` -Every scenario needs `input` and `value`, plus `Q0`, `phi`, `seasonal` and -`irs`. `lsm` and `routine` default to 0; `irs_future` defaults to `irs`. **Current -nets:** give `res_use` and a net-type usage mix (`py_only`, `py_pbo`, `py_pyrrole`, -`py_ppf` shares), or leave the net keys out for none. **Future nets:** give -`net_type_future` + `itn_future` + `res_future` to switch net type; omit them and the -current mix carries forward (at `res_future` if given), or set `itn_future=0` to remove -nets. `mosquito_delta` only applies when `input` is `"prevalence"`. +Every scenario is a `Scenario` and needs `name`, `res_use`, `input`, `value`, `Q0`, +`phi`, `seasonal` and `irs`. `lsm`, `routine` and `irs_future` default to 0 (note +`irs_future` does **not** default to `irs` — set it explicitly if you want IRS to +continue). **Current nets:** give a net-type usage mix (`py_only`, `py_pbo`, +`py_pyrrole`, `py_ppf` shares), or leave the net keys out for none; current and +future legs share the same `res_use`. **Future nets:** give `net_type_future` + +`itn_future` to switch net type; omit `net_type_future` and the future leg is zeroed +(it does **not** carry the current mix forward), or set `itn_future=0` to remove +nets explicitly. `mosquito_delta` only applies when `input` is `"prevalence"`. The returned DataFrame has one row per scenario. Alongside the inputs it gives the estimated EIR (`eir_baseline`, and `eir_final` after any mosquito-density change) and the diff --git a/src/estimint/__init__.py b/src/estimint/__init__.py index 3d95ada..7c571bb 100644 --- a/src/estimint/__init__.py +++ b/src/estimint/__init__.py @@ -56,7 +56,7 @@ from .bednet import calculate_dn0, net_types, DN0Result -from .scenarios import run_scenarios +from .scenarios import run_scenarios, Scenario __all__ = [ # utils @@ -99,4 +99,5 @@ "DN0Result", # scenarios "run_scenarios", + "Scenario", ] diff --git a/src/estimint/scenarios.py b/src/estimint/scenarios.py index a1e0c09..350206f 100644 --- a/src/estimint/scenarios.py +++ b/src/estimint/scenarios.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Any, Dict, List, Union +from typing import Any, Dict import numpy as np import pandas as pd @@ -11,6 +11,7 @@ from .run import run_xgb_model from .hbr import estimate_eir_with_mosquito_delta from .storage import load_xgb_model +from dataclasses import dataclass HF_REPO = "dide-ic/stateMINT" # 157 windows of 14 days from day 2190; intervention at day 3285. @@ -20,28 +21,26 @@ _MODELS: Dict[str, Any] = {} _EMULATORS: Dict[str, Dict[str, Any]] = {} -_NET_KEYS = ("py_only", "py_pbo", "py_pyrrole", "py_ppf", - "pyrethroid_only", "pyrethroid_pbo", "pyrethroid_pyrrole", "pyrethroid_ppf") +_NET_KEYS = ( + "py_only", + "py_pbo", + "py_pyrrole", + "py_ppf", +) -def _bednet(scn: Dict[str, Any]): +def _bednet(scenario: Scenario): """Current and future net (dn0, itn_use); returns (cur, net_now, net_next).""" - cur = {nt: float(scn[nt]) for nt in _NET_KEYS if scn.get(nt)} - res_use = float(scn.get("res_use", 0.0)) - res_future = float(scn["res_future"]) if scn.get("res_future") is not None else res_use + cur_nets = {net_type: getattr(scenario, net_type) for net_type in _NET_KEYS if getattr(scenario, net_type)} - net_now = calculate_dn0(res_use, **cur) if cur else DN0Result(0.0, 0.0) + net_now = calculate_dn0(scenario.res_use, **cur_nets) if cur_nets else DN0Result(0.0, 0.0) - net_future = scn.get("net_type_future") - itn_future = scn.get("itn_future") - itn_future = None if itn_future is None else float(itn_future) - if itn_future == 0.0: + net_type_future = scenario.net_type_future + if scenario.itn_future == 0.0 or not net_type_future: net_next = DN0Result(0.0, 0.0) - elif not net_future or itn_future is None: - net_next = calculate_dn0(res_future, **cur) if cur else DN0Result(0.0, 0.0) else: - net_next = calculate_dn0(res_future, **{net_future: itn_future}) - return cur, net_now, net_next + net_next = calculate_dn0(scenario.res_use, **{net_type_future: scenario.itn_future}) + return cur_nets, net_now, net_next def _est_models() -> Dict[str, Any]: @@ -58,83 +57,137 @@ def _emulators(hf_repo: str) -> Dict[str, Any]: except ImportError as e: raise ImportError( "run_scenarios needs stateMINT. Install it with: " - 'uv sync --extra scenarios (or pip install ' + "uv sync --extra scenarios (or pip install " '"git+https://github.com/mrc-ide/stateMINT.git@mamba2-train").' ) from e _EMULATORS[hf_repo] = { - p: Mamba2Regressor.from_pretrained(hf_repo, predictor=p) - for p in ("prevalence", "cases") + p: Mamba2Regressor.from_pretrained(hf_repo, predictor=p) for p in ("prevalence", "cases") } return _EMULATORS[hf_repo] -def _estimate_eir(scn: Dict[str, Any], est: Dict[str, Any]) -> Dict[str, Any]: +def _estimate_eir(scenario: Scenario, eir_models: Dict[str, Any]) -> Dict[str, Any]: """scenario -> EIR + the stateMINT covariate dict.""" - cur, net_now, net_next = _bednet(scn) + cur_nets, net_now, net_next = _bednet(scenario) dn0_use, itn_use = net_now.dn0, net_now.itn_use dn0_future, itn_future = net_next.dn0, net_next.itn_use - Q0, phi, seasonal = scn["Q0"], scn["phi"], float(scn["seasonal"]) - irs_use = scn["irs"] - irs_future = scn.get("irs_future", irs_use) - routine = scn.get("routine", 0.0) - ppf = float(scn.get("py_ppf", 0.0)) + float(scn.get("pyrethroid_ppf", 0.0)) - lsm = float(scn.get("lsm", 0.0)) + Q0, phi, seasonal = scenario.Q0, scenario.phi, scenario.seasonal + irs_use = scenario.irs + irs_future = scenario.irs_future + routine = scenario.routine + ppf = scenario.py_ppf + lsm = scenario.lsm if ppf > 0: lsm = min(ppf * 0.248 + lsm, 1.0) - feats = dict(dn0_use=dn0_use, Q0=Q0, phi_bednets=phi, - seasonal=seasonal, itn_use=itn_use, irs_use=irs_use) + feats = dict(dn0_use=dn0_use, Q0=Q0, phi_bednets=phi, seasonal=seasonal, itn_use=itn_use, irs_use=irs_use) - mode, value = scn["input"], float(scn["value"]) - if mode == "eir": + input_mode, value = scenario.input, scenario.value + if input_mode == "eir": eir_base = value - elif mode == "prevalence": - eir_base = float(run_xgb_model(pd.DataFrame({**{k: [v] for k, v in feats.items()}, "prev_y9": [value]}), est["prevalence"])[0]) - elif mode == "hbr": - eir_base = float(run_xgb_model(pd.DataFrame({**{k: [v] for k, v in feats.items()}, "hbr_y9": [value]}), est["hbr"])[0]) + elif input_mode == "prevalence": + eir_base = float( + run_xgb_model( + pd.DataFrame({**{k: [v] for k, v in feats.items()}, "prev_y9": [value]}), eir_models["prevalence"] + )[0] + ) + elif input_mode == "hbr": + eir_base = float( + run_xgb_model(pd.DataFrame({**{k: [v] for k, v in feats.items()}, "hbr_y9": [value]}), eir_models["hbr"])[0] + ) else: - raise ValueError(f"'input' must be 'prevalence', 'hbr' or 'eir'; got {mode!r}") + raise ValueError(f"'input' must be 'prevalence', 'hbr' or 'eir'; got {input_mode!r}") eir_final, hbr_baseline, hbr_new = eir_base, np.nan, np.nan - delta = scn.get("mosquito_delta") - if delta is not None and mode == "prevalence": + delta = scenario.mosquito_delta + if delta and input_mode == "prevalence": r = estimate_eir_with_mosquito_delta(prevalence=value, mosquito_delta=delta, **feats) eir_final, hbr_baseline, hbr_new = r["eir_new"], r["hbr_baseline"], r["hbr_new"] - cov = dict(eir=eir_final, dn0_use=dn0_use, dn0_future=dn0_future, Q0=Q0, phi_bednets=phi, - seasonal=seasonal, routine=routine, itn_use=itn_use, irs_use=irs_use, - itn_future=itn_future, irs_future=irs_future, lsm=lsm) - row = dict(name=scn.get("name"), input_mode=mode, net="+".join(cur) or "none", - net_future=scn.get("net_type_future") or "none", - dn0_use=dn0_use, itn_use=itn_use, irs_use=irs_use, - dn0_future=dn0_future, itn_future=itn_future, irs_future=irs_future, - routine=routine, lsm=lsm, seasonal=seasonal, - eir_baseline=eir_base, mosquito_delta=delta, eir_final=eir_final, - hbr_baseline=hbr_baseline, hbr_new=hbr_new) + cov = dict( + eir=eir_final, + dn0_use=dn0_use, + dn0_future=dn0_future, + Q0=Q0, + phi_bednets=phi, + seasonal=seasonal, + routine=routine, + itn_use=itn_use, + irs_use=irs_use, + itn_future=itn_future, + irs_future=irs_future, + lsm=lsm, + ) + row = dict( + name=scenario.name, + input_mode=input_mode, + net="+".join(cur_nets) or "none", + net_future=scenario.net_type_future or "none", + dn0_use=dn0_use, + itn_use=itn_use, + irs_use=irs_use, + dn0_future=dn0_future, + itn_future=itn_future, + irs_future=irs_future, + routine=routine, + lsm=lsm, + seasonal=seasonal, + eir_baseline=eir_base, + mosquito_delta=delta, + eir_final=eir_final, + hbr_baseline=hbr_baseline, + hbr_new=hbr_new, + ) return {"row": row, "cov": cov} def run_scenarios( - scenarios: Union[List[Dict[str, Any]], pd.DataFrame], + scenarios: list[Scenario], *, hf_repo: str = HF_REPO, ) -> pd.DataFrame: - - if isinstance(scenarios, pd.DataFrame): - scenarios = scenarios.to_dict(orient="records") - if not scenarios: - return pd.DataFrame() + """Run a list of scenarios through the estiMINT -> stateMINT pipeline.""" - est = _est_models() - emu = _emulators(hf_repo) + eir_models = _est_models() + emulator_models = _emulators(hf_repo) - parts = [_estimate_eir(scn, est) for scn in scenarios] + parts = [_estimate_eir(scenario, eir_models) for scenario in scenarios] covs = [p["cov"] for p in parts] - prev = emu["prevalence"].predict(covs) - cases = np.maximum(emu["cases"].predict(covs), 0.0) - - return pd.DataFrame([ - {**part["row"], "prev_y9": float(p[_IDX_Y9]), "prev_endline": float(p[-1]), - "cases_endline": float(c[-1]), "prevalence": p, "cases": c} - for part, p, c in zip(parts, prev, cases) - ]) + prev = emulator_models["prevalence"].predict(covs) + cases = np.maximum(emulator_models["cases"].predict(covs), 0.0) + + return pd.DataFrame( + [ + { + **part["row"], + "prev_y9": float(p[_IDX_Y9]), + "prev_endline": float(p[-1]), + "cases_endline": float(c[-1]), + "prevalence": p, + "cases": c, + } + for part, p, c in zip(parts, prev, cases) + ] + ) + + +@dataclass +class Scenario: + name: str + res_use: float + Q0: float + phi: float + seasonal: float + irs: float + value: float + input: str = "prevalence" + py_only: float = 0.0 + py_pbo: float = 0.0 + py_pyrrole: float = 0.0 + py_ppf: float = 0.0 + mosquito_delta: float = 0.0 + itn_future: float = 0.0 + net_type_future: str | None = None + irs_future: float = 0.0 + routine: float = 0.0 + lsm: float = 0.0 diff --git a/tests/test_scenarios.py b/tests/test_scenarios.py index e674174..2971911 100644 --- a/tests/test_scenarios.py +++ b/tests/test_scenarios.py @@ -8,11 +8,17 @@ import numpy as np import pytest -from estimint.scenarios import _estimate_eir, _est_models, run_scenarios +from estimint.scenarios import Scenario, _estimate_eir, _est_models, run_scenarios INTV = dict(Q0=0.87, phi=0.82, seasonal=0.0, irs=0.0) +def mk(**kwargs) -> Scenario: + defaults = dict(name="t", res_use=0.0, **INTV) + defaults.update(kwargs) + return Scenario(**defaults) + + @pytest.fixture(scope="module") def est(): return _est_models() @@ -20,7 +26,7 @@ def est(): class TestEstimateEir: def test_prevalence_input(self, est): - out = _estimate_eir(dict(input="prevalence", value=0.30, **INTV), est) + out = _estimate_eir(mk(input="prevalence", value=0.30), est) assert out["row"]["eir_baseline"] > 0 assert out["cov"]["eir"] == out["row"]["eir_final"] # no nets, no delta @@ -28,79 +34,81 @@ def test_prevalence_input(self, est): assert np.isnan(out["row"]["hbr_baseline"]) def test_eir_input_passes_through(self, est): - out = _estimate_eir(dict(input="eir", value=20.0, **INTV), est) + out = _estimate_eir(mk(input="eir", value=20.0), est) assert out["row"]["eir_baseline"] == 20.0 assert out["row"]["eir_final"] == 20.0 def test_hbr_input(self, est): - out = _estimate_eir(dict(input="hbr", value=250000.0, **INTV), est) + out = _estimate_eir(mk(input="hbr", value=250000.0), est) assert out["row"]["eir_baseline"] > 0 def test_bednet_mix_matches_minte(self, est): # net-type usage mix feeds calculate_dn0 directly, same as minte; itn_use # is the sum of pyrethroid shares (NOT rescaled by coverage again). out = _estimate_eir( - dict(input="prevalence", value=0.30, py_only=0.70, py_pbo=0.30, - res_use=0.30, **INTV), est) + mk(input="prevalence", value=0.30, py_only=0.70, py_pbo=0.30, res_use=0.30), est) assert out["row"]["dn0_use"] > 0 assert out["row"]["itn_use"] == pytest.approx(1.00) assert out["row"]["net"] == "py_only+py_pbo" def test_future_net_switch_is_separate_leg(self, est): - # net_type_future/itn_future/res_future drive the future leg, not current nets + # net_type_future/itn_future drive the future leg, not current nets; + # the future leg shares the same res_use as current (no res_future field). out = _estimate_eir( - dict(input="prevalence", value=0.30, py_only=0.50, res_use=0.30, - net_type_future="pyrethroid_pbo", itn_future=0.70, res_future=0.55, - **INTV), est)["row"] + mk(input="prevalence", value=0.30, py_only=0.50, res_use=0.30, + net_type_future="pyrethroid_pbo", itn_future=0.70), est)["row"] assert out["itn_use"] == pytest.approx(0.50) # current: py_only=0.50 assert out["itn_future"] == pytest.approx(0.70) # future: pbo=0.70 assert out["dn0_use"] != out["dn0_future"] assert out["net"] == "py_only" and out["net_future"] == "pyrethroid_pbo" - def test_future_unchanged_carries_mix_forward(self, est): - # no future net named -> current mix carried forward at res_future + def test_future_without_net_type_is_zeroed(self, est): + # no net_type_future named -> future leg is zeroed, even if itn_future is set + # (no carry-forward of the current mix; this is intentional, not a default) out = _estimate_eir( - dict(input="prevalence", value=0.30, py_pbo=0.80, res_use=0.30, - res_future=0.60, **INTV), est)["row"] - assert out["itn_future"] == pytest.approx(out["itn_use"]) == pytest.approx(0.80) - assert out["dn0_future"] < out["dn0_use"] # higher future resistance -> lower dn0 + mk(input="prevalence", value=0.30, py_pbo=0.80, res_use=0.30, + itn_future=0.70), est)["row"] + assert out["dn0_future"] == 0.0 and out["itn_future"] == 0.0 + assert out["net_future"] == "none" def test_future_nets_removed(self, est): # itn_future == 0 removes nets in the future leg out = _estimate_eir( - dict(input="prevalence", value=0.30, py_only=0.60, res_use=0.30, - itn_future=0.0, **INTV), est)["row"] + mk(input="prevalence", value=0.30, py_only=0.60, res_use=0.30, + itn_future=0.0), est)["row"] assert out["itn_use"] == pytest.approx(0.60) assert out["dn0_future"] == 0.0 and out["itn_future"] == 0.0 def test_ppf_boosts_lsm(self, est): # PPF nets add larviciding to LSM (minte: py_ppf * 0.248) out = _estimate_eir( - dict(input="eir", value=15.0, py_ppf=0.50, res_use=0.30, lsm=0.10, **INTV), est) + mk(input="eir", value=15.0, py_ppf=0.50, res_use=0.30, lsm=0.10), est) assert out["cov"]["lsm"] == pytest.approx(0.50 * 0.248 + 0.10) def test_irs_future_and_routine_are_inputs(self, est): # irs_future and routine are separate scenario inputs, like minte out = _estimate_eir( - dict(input="eir", value=15.0, Q0=0.87, phi=0.82, seasonal=0.0, - irs=0.40, irs_future=0.10, routine=0.25), est)["cov"] + mk(input="eir", value=15.0, irs=0.40, irs_future=0.10, routine=0.25), est)["cov"] assert out["irs_use"] == 0.40 and out["irs_future"] == 0.10 assert out["routine"] == 0.25 def test_irs_future_and_routine_defaults(self, est): - out = _estimate_eir(dict(input="eir", value=15.0, **INTV), est)["cov"] - assert out["irs_future"] == out["irs_use"] # defaults to irs + # irs_future is a static dataclass default (0.0); it does NOT carry irs + # forward automatically, even when irs is nonzero. + out = _estimate_eir(mk(input="eir", value=15.0, irs=0.40), est)["cov"] + assert out["irs_future"] == 0.0 + assert out["irs_use"] == 0.40 assert out["routine"] == 0.0 def test_mosquito_delta_direction(self, est): - up = _estimate_eir(dict(input="prevalence", value=0.30, mosquito_delta=0.25, **INTV), est) - down = _estimate_eir(dict(input="prevalence", value=0.30, mosquito_delta=-0.50, **INTV), est) + up = _estimate_eir(mk(input="prevalence", value=0.30, mosquito_delta=0.25), est) + down = _estimate_eir(mk(input="prevalence", value=0.30, mosquito_delta=-0.50), est) assert up["row"]["eir_final"] > up["row"]["eir_baseline"] assert down["row"]["eir_final"] < down["row"]["eir_baseline"] assert up["row"]["hbr_new"] > up["row"]["hbr_baseline"] def test_covariate_dict_keys(self, est): - out = _estimate_eir(dict(input="eir", value=15.0, lsm=0.3, **INTV), est) + out = _estimate_eir(mk(input="eir", value=15.0, lsm=0.3), est) assert set(out["cov"]) == { "eir", "dn0_use", "dn0_future", "Q0", "phi_bednets", "seasonal", "routine", "itn_use", "irs_use", "itn_future", "irs_future", "lsm", @@ -110,19 +118,19 @@ def test_covariate_dict_keys(self, est): def test_bad_input_raises(self, est): with pytest.raises(ValueError, match="input"): - _estimate_eir(dict(input="nope", value=1.0, **INTV), est) + _estimate_eir(mk(input="nope", value=1.0), est) class TestRunScenariosFullPipeline: def test_end_to_end(self): pytest.importorskip("stateMINT", reason="stateMINT not installed") df = run_scenarios([ - dict(name="prev+delta", input="prevalence", value=0.30, - py_only=0.60, res_use=0.55, net_type_future="pyrethroid_pbo", - itn_future=0.85, res_future=0.55, - Q0=0.90, phi=0.85, seasonal=1, irs=0.40, mosquito_delta=0.60), - dict(name="eir", input="eir", value=20.0, - Q0=0.88, phi=0.78, seasonal=1, irs=0.60), + Scenario(name="prev+delta", input="prevalence", value=0.30, + py_only=0.60, res_use=0.55, net_type_future="pyrethroid_pbo", + itn_future=0.85, + Q0=0.90, phi=0.85, seasonal=1, irs=0.40, mosquito_delta=0.60), + Scenario(name="eir", input="eir", value=20.0, res_use=0.0, + Q0=0.88, phi=0.78, seasonal=1, irs=0.60), ]) assert len(df) == 2 assert {"eir_final", "prev_y9", "prevalence", "cases"} <= set(df.columns) From dda2434001097ac7342f7f3be84e6c49f61fa1ad Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Thu, 25 Jun 2026 21:08:57 +0100 Subject: [PATCH 27/30] bump version to 1.5.0 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6cb5f63..de8d8f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "estimint" -version = "1.4.4" +version = "1.5.0" description = "EIR Estimation using Machine learning interventions " readme = "README.md" license = "MIT" From 346d838b980eef4042ab128f09d2c0d123d4e8f9 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Thu, 25 Jun 2026 21:10:01 +0100 Subject: [PATCH 28/30] fix: update revision to 2 and bump estimint version to 1.5.0 in uv.lock --- uv.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uv.lock b/uv.lock index 64701fe..3c6f75b 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.12" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", @@ -361,7 +361,7 @@ wheels = [ [[package]] name = "estimint" -version = "1.4.4" +version = "1.5.0" source = { editable = "." } dependencies = [ { name = "numpy" }, From 06c57a1ecedc9634289e18ce1227664d3eec7008 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Fri, 26 Jun 2026 08:49:42 +0100 Subject: [PATCH 29/30] refactor: move Scenario and EirTarget dataclasses to types.py and update scenarios to use new structure --- src/estimint/__init__.py | 4 ++- src/estimint/scenarios.py | 57 +++++++++++++-------------------------- src/estimint/types.py | 31 +++++++++++++++++++++ tests/test_scenarios.py | 19 ++++++++----- 4 files changed, 65 insertions(+), 46 deletions(-) create mode 100644 src/estimint/types.py diff --git a/src/estimint/__init__.py b/src/estimint/__init__.py index 7c571bb..0f23b4d 100644 --- a/src/estimint/__init__.py +++ b/src/estimint/__init__.py @@ -56,7 +56,8 @@ from .bednet import calculate_dn0, net_types, DN0Result -from .scenarios import run_scenarios, Scenario +from .scenarios import run_scenarios +from .types import Scenario, EirTarget __all__ = [ # utils @@ -100,4 +101,5 @@ # scenarios "run_scenarios", "Scenario", + "EirTarget", ] diff --git a/src/estimint/scenarios.py b/src/estimint/scenarios.py index 350206f..fd76d88 100644 --- a/src/estimint/scenarios.py +++ b/src/estimint/scenarios.py @@ -11,7 +11,7 @@ from .run import run_xgb_model from .hbr import estimate_eir_with_mosquito_delta from .storage import load_xgb_model -from dataclasses import dataclass +from .types import Scenario HF_REPO = "dide-ic/stateMINT" # 157 windows of 14 days from day 2190; intervention at day 3285. @@ -66,6 +66,9 @@ def _emulators(hf_repo: str) -> Dict[str, Any]: return _EMULATORS[hf_repo] +_EIR_INPUT_COLS = {"prevalence": ("prev_y9", "prevalence"), "hbr": ("hbr_y9", "hbr")} + + def _estimate_eir(scenario: Scenario, eir_models: Dict[str, Any]) -> Dict[str, Any]: """scenario -> EIR + the stateMINT covariate dict.""" cur_nets, net_now, net_next = _bednet(scenario) @@ -82,28 +85,28 @@ def _estimate_eir(scenario: Scenario, eir_models: Dict[str, Any]) -> Dict[str, A lsm = min(ppf * 0.248 + lsm, 1.0) feats = dict(dn0_use=dn0_use, Q0=Q0, phi_bednets=phi, seasonal=seasonal, itn_use=itn_use, irs_use=irs_use) - input_mode, value = scenario.input, scenario.value + # ── EIR by input mode ── + delta = scenario.mosquito_delta + hbr_baseline, hbr_new = np.nan, np.nan + input_mode, input_value = scenario.eir_target.input_mode, scenario.eir_target.input_value + if input_mode == "eir": - eir_base = value - elif input_mode == "prevalence": - eir_base = float( + eir_base = eir_final = input_value + elif delta and input_mode == "prevalence": + r = estimate_eir_with_mosquito_delta(prevalence=input_value, mosquito_delta=delta, **feats) + eir_base, eir_final = r["eir_baseline"], r["eir_new"] + hbr_baseline, hbr_new = r["hbr_baseline"], r["hbr_new"] + elif input_mode in _EIR_INPUT_COLS: + col, model_key = _EIR_INPUT_COLS[input_mode] + eir_base = eir_final = float( run_xgb_model( - pd.DataFrame({**{k: [v] for k, v in feats.items()}, "prev_y9": [value]}), eir_models["prevalence"] + pd.DataFrame({**{k: [v] for k, v in feats.items()}, col: [input_value]}), + eir_models[model_key], )[0] ) - elif input_mode == "hbr": - eir_base = float( - run_xgb_model(pd.DataFrame({**{k: [v] for k, v in feats.items()}, "hbr_y9": [value]}), eir_models["hbr"])[0] - ) else: raise ValueError(f"'input' must be 'prevalence', 'hbr' or 'eir'; got {input_mode!r}") - eir_final, hbr_baseline, hbr_new = eir_base, np.nan, np.nan - delta = scenario.mosquito_delta - if delta and input_mode == "prevalence": - r = estimate_eir_with_mosquito_delta(prevalence=value, mosquito_delta=delta, **feats) - eir_final, hbr_baseline, hbr_new = r["eir_new"], r["hbr_baseline"], r["hbr_new"] - cov = dict( eir=eir_final, dn0_use=dn0_use, @@ -169,25 +172,3 @@ def run_scenarios( for part, p, c in zip(parts, prev, cases) ] ) - - -@dataclass -class Scenario: - name: str - res_use: float - Q0: float - phi: float - seasonal: float - irs: float - value: float - input: str = "prevalence" - py_only: float = 0.0 - py_pbo: float = 0.0 - py_pyrrole: float = 0.0 - py_ppf: float = 0.0 - mosquito_delta: float = 0.0 - itn_future: float = 0.0 - net_type_future: str | None = None - irs_future: float = 0.0 - routine: float = 0.0 - lsm: float = 0.0 diff --git a/src/estimint/types.py b/src/estimint/types.py new file mode 100644 index 0000000..10bc61a --- /dev/null +++ b/src/estimint/types.py @@ -0,0 +1,31 @@ +from typing import Literal +from dataclasses import dataclass + +Input_Mode = Literal["prevalence", "eir", "hbr"] + + +@dataclass +class EirTarget: + input_value: float + input_mode: Input_Mode = "prevalence" + + +@dataclass +class Scenario: + name: str + res_use: float + Q0: float + phi: float + seasonal: float + irs: float + eir_target: EirTarget + py_only: float = 0.0 + py_pbo: float = 0.0 + py_pyrrole: float = 0.0 + py_ppf: float = 0.0 + mosquito_delta: float = 0.0 + itn_future: float = 0.0 + net_type_future: str | None = None + irs_future: float = 0.0 + routine: float = 0.0 + lsm: float = 0.0 diff --git a/tests/test_scenarios.py b/tests/test_scenarios.py index 2971911..bb18c34 100644 --- a/tests/test_scenarios.py +++ b/tests/test_scenarios.py @@ -5,18 +5,23 @@ unless stateMINT is installed. """ +from typing import Any + import numpy as np import pytest -from estimint.scenarios import Scenario, _estimate_eir, _est_models, run_scenarios +from estimint.scenarios import _estimate_eir, _est_models, run_scenarios +from estimint.types import EirTarget, Scenario -INTV = dict(Q0=0.87, phi=0.82, seasonal=0.0, irs=0.0) +INTV: dict[str, Any] = dict(Q0=0.87, phi=0.82, seasonal=0.0, irs=0.0) -def mk(**kwargs) -> Scenario: - defaults = dict(name="t", res_use=0.0, **INTV) +def mk(**kwargs: Any) -> Scenario: + defaults: dict[str, Any] = dict(name="t", res_use=0.0, **INTV) + input_mode = kwargs.pop("input") + input_value = kwargs.pop("value") defaults.update(kwargs) - return Scenario(**defaults) + return Scenario(eir_target=EirTarget(input_value, input_mode), **defaults) @pytest.fixture(scope="module") @@ -125,11 +130,11 @@ class TestRunScenariosFullPipeline: def test_end_to_end(self): pytest.importorskip("stateMINT", reason="stateMINT not installed") df = run_scenarios([ - Scenario(name="prev+delta", input="prevalence", value=0.30, + Scenario(name="prev+delta", eir_target=EirTarget(0.30, "prevalence"), py_only=0.60, res_use=0.55, net_type_future="pyrethroid_pbo", itn_future=0.85, Q0=0.90, phi=0.85, seasonal=1, irs=0.40, mosquito_delta=0.60), - Scenario(name="eir", input="eir", value=20.0, res_use=0.0, + Scenario(name="eir", eir_target=EirTarget(20.0, "eir"), res_use=0.0, Q0=0.88, phi=0.78, seasonal=1, irs=0.60), ]) assert len(df) == 2 From c1219f68b31da8d6de85f1ca89ccf7393b8b3304 Mon Sep 17 00:00:00 2001 From: anmol thapar Date: Fri, 26 Jun 2026 08:50:25 +0100 Subject: [PATCH 30/30] update version --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index de8d8f3..a394c56 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "estimint" -version = "1.5.0" +version = "1.5.2" description = "EIR Estimation using Machine learning interventions " readme = "README.md" license = "MIT" diff --git a/uv.lock b/uv.lock index 3c6f75b..4ec0a6b 100644 --- a/uv.lock +++ b/uv.lock @@ -361,7 +361,7 @@ wheels = [ [[package]] name = "estimint" -version = "1.5.0" +version = "1.5.2" source = { editable = "." } dependencies = [ { name = "numpy" },