From cd9166d63c48ff2e0c1906c705017660ddae1fbb Mon Sep 17 00:00:00 2001 From: Michelle0574 <2170308303@qq.com> Date: Thu, 18 Jun 2026 08:40:19 +0000 Subject: [PATCH] =?UTF-8?q?feat(moe):=20MoE=20+=20MolT5=20LLM=20=E8=9E=8D?= =?UTF-8?q?=E5=90=88=E5=B1=82=E3=80=81=E6=B6=88=E8=9E=8D=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lnp_ml/dataset.py | 1066 +-- lnp_ml/modeling/heads.py | 242 +- lnp_ml/modeling/layers/fusion.py | 263 +- lnp_ml/modeling/layers/llm_prompt.py | 104 + lnp_ml/modeling/layers/set_transformer.py | 123 + lnp_ml/modeling/models.py | 302 +- lnp_ml/modeling/nested_cv_optuna.py | 1954 ++--- lnp_ml/modeling/pretrain.py | 1095 +-- lnp_ml/modeling/trainer_balanced.py | 1074 +-- lnp_ml/utils/seed.py | 19 + .../outer_fold_0/best_params.json | 12 + .../20260617_180556/outer_fold_0/splits.json | 1 + .../outer_fold_0/test_metrics.json | 42 + .../outer_fold_1/best_params.json | 12 + .../20260617_180556/outer_fold_1/splits.json | 1 + .../outer_fold_1/test_metrics.json | 42 + .../outer_fold_2/best_params.json | 12 + .../20260617_180556/outer_fold_2/splits.json | 1 + .../outer_fold_2/test_metrics.json | 42 + .../outer_fold_3/best_params.json | 12 + .../20260617_180556/outer_fold_3/splits.json | 1 + .../outer_fold_3/test_metrics.json | 42 + .../outer_fold_4/best_params.json | 12 + .../20260617_180556/outer_fold_4/splits.json | 1 + .../outer_fold_4/test_metrics.json | 42 + .../repeat_1/outer_fold_0/best_params.json | 12 + .../repeat_1/outer_fold_0/splits.json | 1 + .../repeat_1/outer_fold_0/test_metrics.json | 42 + .../repeat_1/outer_fold_1/best_params.json | 12 + .../repeat_1/outer_fold_1/splits.json | 1 + .../repeat_1/outer_fold_1/test_metrics.json | 42 + .../repeat_1/outer_fold_2/best_params.json | 12 + .../repeat_1/outer_fold_2/splits.json | 1 + .../repeat_1/outer_fold_2/test_metrics.json | 42 + .../repeat_1/outer_fold_3/best_params.json | 12 + .../repeat_1/outer_fold_3/splits.json | 1 + .../repeat_1/outer_fold_3/test_metrics.json | 42 + .../repeat_1/outer_fold_4/best_params.json | 12 + .../repeat_1/outer_fold_4/splits.json | 1 + .../repeat_1/outer_fold_4/test_metrics.json | 42 + .../repeat_2/outer_fold_0/best_params.json | 12 + .../repeat_2/outer_fold_0/splits.json | 1 + .../repeat_2/outer_fold_0/test_metrics.json | 42 + .../repeat_2/outer_fold_1/best_params.json | 12 + .../repeat_2/outer_fold_1/splits.json | 1 + .../repeat_2/outer_fold_1/test_metrics.json | 42 + .../repeat_2/outer_fold_2/best_params.json | 12 + .../repeat_2/outer_fold_2/splits.json | 1 + .../repeat_2/outer_fold_2/test_metrics.json | 42 + .../repeat_2/outer_fold_3/best_params.json | 12 + .../repeat_2/outer_fold_3/splits.json | 1 + .../repeat_2/outer_fold_3/test_metrics.json | 42 + .../repeat_2/outer_fold_4/best_params.json | 12 + .../repeat_2/outer_fold_4/splits.json | 1 + .../repeat_2/outer_fold_4/test_metrics.json | 42 + .../baseline/20260617_180556/strata_info.json | 60 + .../abl/baseline/20260617_180556/summary.json | 932 +++ .../outer_fold_0/best_params.json | 16 + .../20260617_232841/outer_fold_0/splits.json | 1 + .../outer_fold_0/test_metrics.json | 42 + .../outer_fold_1/best_params.json | 16 + .../20260617_232841/outer_fold_1/splits.json | 1 + .../outer_fold_1/test_metrics.json | 42 + .../outer_fold_2/best_params.json | 16 + .../20260617_232841/outer_fold_2/splits.json | 1 + .../outer_fold_2/test_metrics.json | 42 + .../outer_fold_3/best_params.json | 16 + .../20260617_232841/outer_fold_3/splits.json | 1 + .../outer_fold_3/test_metrics.json | 42 + .../outer_fold_4/best_params.json | 16 + .../20260617_232841/outer_fold_4/splits.json | 1 + .../outer_fold_4/test_metrics.json | 42 + .../repeat_1/outer_fold_0/best_params.json | 16 + .../repeat_1/outer_fold_0/splits.json | 1 + .../repeat_1/outer_fold_0/test_metrics.json | 42 + .../repeat_1/outer_fold_1/best_params.json | 16 + .../repeat_1/outer_fold_1/splits.json | 1 + .../repeat_1/outer_fold_1/test_metrics.json | 42 + .../repeat_1/outer_fold_2/best_params.json | 16 + .../repeat_1/outer_fold_2/splits.json | 1 + .../repeat_1/outer_fold_2/test_metrics.json | 42 + .../repeat_1/outer_fold_3/best_params.json | 16 + .../repeat_1/outer_fold_3/splits.json | 1 + .../repeat_1/outer_fold_3/test_metrics.json | 42 + .../repeat_1/outer_fold_4/best_params.json | 16 + .../repeat_1/outer_fold_4/splits.json | 1 + .../repeat_1/outer_fold_4/test_metrics.json | 42 + .../repeat_2/outer_fold_0/best_params.json | 16 + .../repeat_2/outer_fold_0/splits.json | 1 + .../repeat_2/outer_fold_0/test_metrics.json | 42 + .../repeat_2/outer_fold_1/best_params.json | 16 + .../repeat_2/outer_fold_1/splits.json | 1 + .../repeat_2/outer_fold_1/test_metrics.json | 42 + .../repeat_2/outer_fold_2/best_params.json | 16 + .../repeat_2/outer_fold_2/splits.json | 1 + .../repeat_2/outer_fold_2/test_metrics.json | 42 + .../repeat_2/outer_fold_3/best_params.json | 16 + .../repeat_2/outer_fold_3/splits.json | 1 + .../repeat_2/outer_fold_3/test_metrics.json | 42 + .../repeat_2/outer_fold_4/best_params.json | 16 + .../repeat_2/outer_fold_4/splits.json | 1 + .../repeat_2/outer_fold_4/test_metrics.json | 42 + .../abl/both/20260617_232841/strata_info.json | 60 + models/abl/both/20260617_232841/summary.json | 992 +++ .../outer_fold_0/best_params.json | 13 + .../20260617_203747/outer_fold_0/splits.json | 1 + .../outer_fold_0/test_metrics.json | 42 + .../outer_fold_1/best_params.json | 13 + .../20260617_203747/outer_fold_1/splits.json | 1 + .../outer_fold_1/test_metrics.json | 42 + .../outer_fold_2/best_params.json | 13 + .../20260617_203747/outer_fold_2/splits.json | 1 + .../outer_fold_2/test_metrics.json | 42 + .../outer_fold_3/best_params.json | 13 + .../20260617_203747/outer_fold_3/splits.json | 1 + .../outer_fold_3/test_metrics.json | 42 + .../outer_fold_4/best_params.json | 13 + .../20260617_203747/outer_fold_4/splits.json | 1 + .../outer_fold_4/test_metrics.json | 42 + .../repeat_1/outer_fold_0/best_params.json | 13 + .../repeat_1/outer_fold_0/splits.json | 1 + .../repeat_1/outer_fold_0/test_metrics.json | 42 + .../repeat_1/outer_fold_1/best_params.json | 13 + .../repeat_1/outer_fold_1/splits.json | 1 + .../repeat_1/outer_fold_1/test_metrics.json | 42 + .../repeat_1/outer_fold_2/best_params.json | 13 + .../repeat_1/outer_fold_2/splits.json | 1 + .../repeat_1/outer_fold_2/test_metrics.json | 42 + .../repeat_1/outer_fold_3/best_params.json | 13 + .../repeat_1/outer_fold_3/splits.json | 1 + .../repeat_1/outer_fold_3/test_metrics.json | 42 + .../repeat_1/outer_fold_4/best_params.json | 13 + .../repeat_1/outer_fold_4/splits.json | 1 + .../repeat_1/outer_fold_4/test_metrics.json | 42 + .../repeat_2/outer_fold_0/best_params.json | 13 + .../repeat_2/outer_fold_0/splits.json | 1 + .../repeat_2/outer_fold_0/test_metrics.json | 42 + .../repeat_2/outer_fold_1/best_params.json | 13 + .../repeat_2/outer_fold_1/splits.json | 1 + .../repeat_2/outer_fold_1/test_metrics.json | 42 + .../repeat_2/outer_fold_2/best_params.json | 13 + .../repeat_2/outer_fold_2/splits.json | 1 + .../repeat_2/outer_fold_2/test_metrics.json | 42 + .../repeat_2/outer_fold_3/best_params.json | 13 + .../repeat_2/outer_fold_3/splits.json | 1 + .../repeat_2/outer_fold_3/test_metrics.json | 42 + .../repeat_2/outer_fold_4/best_params.json | 13 + .../repeat_2/outer_fold_4/splits.json | 1 + .../repeat_2/outer_fold_4/test_metrics.json | 42 + .../abl/llm/20260617_203747/strata_info.json | 60 + models/abl/llm/20260617_203747/summary.json | 947 +++ .../outer_fold_0/best_params.json | 15 + .../20260617_191948/outer_fold_0/splits.json | 1 + .../outer_fold_0/test_metrics.json | 42 + .../outer_fold_1/best_params.json | 15 + .../20260617_191948/outer_fold_1/splits.json | 1 + .../outer_fold_1/test_metrics.json | 42 + .../outer_fold_2/best_params.json | 15 + .../20260617_191948/outer_fold_2/splits.json | 1 + .../outer_fold_2/test_metrics.json | 42 + .../outer_fold_3/best_params.json | 15 + .../20260617_191948/outer_fold_3/splits.json | 1 + .../outer_fold_3/test_metrics.json | 42 + .../outer_fold_4/best_params.json | 15 + .../20260617_191948/outer_fold_4/splits.json | 1 + .../outer_fold_4/test_metrics.json | 42 + .../repeat_1/outer_fold_0/best_params.json | 15 + .../repeat_1/outer_fold_0/splits.json | 1 + .../repeat_1/outer_fold_0/test_metrics.json | 42 + .../repeat_1/outer_fold_1/best_params.json | 15 + .../repeat_1/outer_fold_1/splits.json | 1 + .../repeat_1/outer_fold_1/test_metrics.json | 42 + .../repeat_1/outer_fold_2/best_params.json | 15 + .../repeat_1/outer_fold_2/splits.json | 1 + .../repeat_1/outer_fold_2/test_metrics.json | 42 + .../repeat_1/outer_fold_3/best_params.json | 15 + .../repeat_1/outer_fold_3/splits.json | 1 + .../repeat_1/outer_fold_3/test_metrics.json | 42 + .../repeat_1/outer_fold_4/best_params.json | 15 + .../repeat_1/outer_fold_4/splits.json | 1 + .../repeat_1/outer_fold_4/test_metrics.json | 42 + .../repeat_2/outer_fold_0/best_params.json | 15 + .../repeat_2/outer_fold_0/splits.json | 1 + .../repeat_2/outer_fold_0/test_metrics.json | 42 + .../repeat_2/outer_fold_1/best_params.json | 15 + .../repeat_2/outer_fold_1/splits.json | 1 + .../repeat_2/outer_fold_1/test_metrics.json | 42 + .../repeat_2/outer_fold_2/best_params.json | 15 + .../repeat_2/outer_fold_2/splits.json | 1 + .../repeat_2/outer_fold_2/test_metrics.json | 42 + .../repeat_2/outer_fold_3/best_params.json | 15 + .../repeat_2/outer_fold_3/splits.json | 1 + .../repeat_2/outer_fold_3/test_metrics.json | 42 + .../repeat_2/outer_fold_4/best_params.json | 15 + .../repeat_2/outer_fold_4/splits.json | 1 + .../repeat_2/outer_fold_4/test_metrics.json | 42 + .../abl/moe/20260617_191948/strata_info.json | 60 + models/abl/moe/20260617_191948/summary.json | 977 +++ .../pretrain/baseline/pretrain_history.json | 278 + models/pretrain/both/pretrain_history.json | 190 + models/pretrain/llm/pretrain_history.json | 166 + models/pretrain/moe/pretrain_history.json | 238 + pixi.lock | 6638 ++++++++--------- pixi.toml | 67 +- pyproject.toml | 64 +- reports/ablation_summary.csv | 5 + requirements.txt | 47 +- scripts/summarize_ablation.py | 66 + scripts_run/run_all.sh | 91 + 209 files changed, 15295 insertions(+), 6305 deletions(-) create mode 100644 lnp_ml/modeling/layers/llm_prompt.py create mode 100644 lnp_ml/modeling/layers/set_transformer.py create mode 100644 lnp_ml/utils/seed.py create mode 100644 models/abl/baseline/20260617_180556/outer_fold_0/best_params.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_0/splits.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_0/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_1/best_params.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_1/splits.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_1/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_2/best_params.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_2/splits.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_2/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_3/best_params.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_3/splits.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_3/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_4/best_params.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_4/splits.json create mode 100644 models/abl/baseline/20260617_180556/outer_fold_4/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/best_params.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/splits.json create mode 100644 models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/test_metrics.json create mode 100644 models/abl/baseline/20260617_180556/strata_info.json create mode 100644 models/abl/baseline/20260617_180556/summary.json create mode 100644 models/abl/both/20260617_232841/outer_fold_0/best_params.json create mode 100644 models/abl/both/20260617_232841/outer_fold_0/splits.json create mode 100644 models/abl/both/20260617_232841/outer_fold_0/test_metrics.json create mode 100644 models/abl/both/20260617_232841/outer_fold_1/best_params.json create mode 100644 models/abl/both/20260617_232841/outer_fold_1/splits.json create mode 100644 models/abl/both/20260617_232841/outer_fold_1/test_metrics.json create mode 100644 models/abl/both/20260617_232841/outer_fold_2/best_params.json create mode 100644 models/abl/both/20260617_232841/outer_fold_2/splits.json create mode 100644 models/abl/both/20260617_232841/outer_fold_2/test_metrics.json create mode 100644 models/abl/both/20260617_232841/outer_fold_3/best_params.json create mode 100644 models/abl/both/20260617_232841/outer_fold_3/splits.json create mode 100644 models/abl/both/20260617_232841/outer_fold_3/test_metrics.json create mode 100644 models/abl/both/20260617_232841/outer_fold_4/best_params.json create mode 100644 models/abl/both/20260617_232841/outer_fold_4/splits.json create mode 100644 models/abl/both/20260617_232841/outer_fold_4/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_0/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_0/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_0/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_1/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_1/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_1/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_2/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_2/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_2/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_3/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_3/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_3/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_4/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_4/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_1/outer_fold_4/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_0/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_0/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_0/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_1/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_1/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_1/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_2/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_2/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_2/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_3/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_3/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_3/test_metrics.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_4/best_params.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_4/splits.json create mode 100644 models/abl/both/20260617_232841/repeat_2/outer_fold_4/test_metrics.json create mode 100644 models/abl/both/20260617_232841/strata_info.json create mode 100644 models/abl/both/20260617_232841/summary.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_0/best_params.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_0/splits.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_0/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_1/best_params.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_1/splits.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_1/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_2/best_params.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_2/splits.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_2/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_3/best_params.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_3/splits.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_3/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_4/best_params.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_4/splits.json create mode 100644 models/abl/llm/20260617_203747/outer_fold_4/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_0/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_0/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_0/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_1/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_1/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_1/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_2/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_2/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_2/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_3/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_3/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_3/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_4/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_4/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_1/outer_fold_4/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_0/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_0/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_0/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_1/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_1/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_1/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_2/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_2/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_2/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_3/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_3/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_3/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_4/best_params.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_4/splits.json create mode 100644 models/abl/llm/20260617_203747/repeat_2/outer_fold_4/test_metrics.json create mode 100644 models/abl/llm/20260617_203747/strata_info.json create mode 100644 models/abl/llm/20260617_203747/summary.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_0/best_params.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_0/splits.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_0/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_1/best_params.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_1/splits.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_1/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_2/best_params.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_2/splits.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_2/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_3/best_params.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_3/splits.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_3/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_4/best_params.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_4/splits.json create mode 100644 models/abl/moe/20260617_191948/outer_fold_4/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_0/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_0/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_0/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_1/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_1/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_1/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_2/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_2/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_2/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_3/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_3/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_3/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_4/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_4/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_1/outer_fold_4/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_0/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_0/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_0/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_1/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_1/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_1/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_2/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_2/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_2/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_3/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_3/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_3/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_4/best_params.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_4/splits.json create mode 100644 models/abl/moe/20260617_191948/repeat_2/outer_fold_4/test_metrics.json create mode 100644 models/abl/moe/20260617_191948/strata_info.json create mode 100644 models/abl/moe/20260617_191948/summary.json create mode 100644 models/pretrain/baseline/pretrain_history.json create mode 100644 models/pretrain/both/pretrain_history.json create mode 100644 models/pretrain/llm/pretrain_history.json create mode 100644 models/pretrain/moe/pretrain_history.json create mode 100644 reports/ablation_summary.csv create mode 100644 scripts/summarize_ablation.py create mode 100644 scripts_run/run_all.sh diff --git a/lnp_ml/dataset.py b/lnp_ml/dataset.py index 2f39943..cdcae50 100644 --- a/lnp_ml/dataset.py +++ b/lnp_ml/dataset.py @@ -1,530 +1,536 @@ -"""数据集处理模块""" - -from pathlib import Path -from typing import Dict, List, Tuple, Optional -from dataclasses import dataclass - -import numpy as np -import pandas as pd -import torch -from torch.utils.data import Dataset - - -# ============ 列名配置 ============ - -# SMILES 列 -SMILES_COL = "smiles" - -# comp token: 配方比例 [5] -COMP_COLS = [ - "Cationic_Lipid_to_mRNA_weight_ratio", - "Cationic_Lipid_Mol_Ratio", - "Phospholipid_Mol_Ratio", - "Cholesterol_Mol_Ratio", - "PEG_Lipid_Mol_Ratio", -] - -# phys token: 物理/实验参数 one-hot [12] -# 需要从原始列生成 one-hot -PHYS_ONEHOT_SPECS = { - "Purity": ["Pure", "Crude"], - "Mix_type": ["Microfluidic", "Pipetting"], - "Cargo_type": ["mRNA", "pDNA", "siRNA"], - "Target_or_delivered_gene": ["FFL", "Peptide_barcode", "hEPO", "FVII", "GFP"], -} - -# help token: Helper lipid one-hot [4] -HELP_COLS = [ - "Helper_lipid_ID_DOPE", - "Helper_lipid_ID_DOTAP", - "Helper_lipid_ID_DSPC", - "Helper_lipid_ID_MDOA", -] - -# exp token: 实验条件 one-hot [32] -EXP_ONEHOT_SPECS = { - "Model_type": ["A549", "BDMC", "BMDM", "HBEC_ALI", "HEK293T", "HeLa", "IGROV1", "Mouse", "RAW264p7"], - "Delivery_target": ["body", "dendritic_cell", "generic_cell", "liver", "lung", "lung_epithelium", "macrophage", "muscle", "spleen"], - "Route_of_administration": ["in_vitro", "intramuscular", "intratracheal", "intravenous"], - "Batch_or_individual_or_barcoded": ["Barcoded", "Individual"], - "Value_name": ["log_luminescence", "luminescence", "FFL_silencing", "Peptide_abundance", "hEPO", "FVII_silencing", "GFP_delivery", "Discretized_luminescence"], -} - -# Target 列 -TARGET_REGRESSION = ["size", "quantified_delivery"] -TARGET_CLASSIFICATION_PDI = ["PDI_0_0to0_2", "PDI_0_2to0_3", "PDI_0_3to0_4", "PDI_0_4to0_5"] -TARGET_CLASSIFICATION_EE = ["Encapsulation_Efficiency_EE<50", "Encapsulation_Efficiency_50<=EE<80", "Encapsulation_Efficiency_80 List[str]: - """生成 one-hot 列名""" - return [f"{prefix}_{v}" for v in values] - - -def process_dataframe(df: pd.DataFrame) -> pd.DataFrame: - """ - 处理原始 DataFrame,生成模型所需的所有列。 - - Args: - df: 原始 DataFrame - - Returns: - 处理后的 DataFrame,包含所有需要的列 - """ - df = df.copy() - - # 1. 处理 phys token 的 one-hot 列(如果不存在则生成) - for col, values in PHYS_ONEHOT_SPECS.items(): - for v in values: - onehot_col = f"{col}_{v}" - if onehot_col not in df.columns: - if col in df.columns: - df[onehot_col] = (df[col] == v).astype(float) - else: - df[onehot_col] = 0.0 - - # 2. 处理 exp token 的 one-hot 列(如果不存在则生成) - for col, values in EXP_ONEHOT_SPECS.items(): - for v in values: - onehot_col = f"{col}_{v}" - if onehot_col not in df.columns: - if col in df.columns: - df[onehot_col] = (df[col] == v).astype(float) - else: - df[onehot_col] = 0.0 - - # 3. 确保 comp 列存在且为 float - for col in COMP_COLS: - if col in df.columns: - df[col] = pd.to_numeric(df[col], errors="coerce").fillna(0.0) - else: - df[col] = 0.0 - - # 4. 确保 help 列存在 - for col in HELP_COLS: - if col not in df.columns: - df[col] = 0.0 - else: - df[col] = df[col].fillna(0.0).astype(float) - - # 5. 处理 target 列 - # size: 已经 log 过,填充缺失值 - if "size" in df.columns: - df["size"] = pd.to_numeric(df["size"], errors="coerce") - - # quantified_delivery: 已经 z-score 过 - if "quantified_delivery" in df.columns: - df["quantified_delivery"] = pd.to_numeric(df["quantified_delivery"], errors="coerce") - - # toxic: 0/1 - if TARGET_TOXIC in df.columns: - df[TARGET_TOXIC] = pd.to_numeric(df[TARGET_TOXIC], errors="coerce").fillna(-1).astype(int) - - # PDI 和 EE 的 one-hot 分类 - for col in TARGET_CLASSIFICATION_PDI + TARGET_CLASSIFICATION_EE: - if col in df.columns: - df[col] = df[col].fillna(0).astype(float) - - # Biodistribution - for col in TARGET_BIODIST: - if col in df.columns: - df[col] = pd.to_numeric(df[col], errors="coerce").fillna(0.0) - - return df - - -def get_phys_cols() -> List[str]: - """获取 phys token 的所有列名""" - cols = [] - for col, values in PHYS_ONEHOT_SPECS.items(): - cols.extend(get_onehot_cols(col, values)) - return cols - - -def get_exp_cols() -> List[str]: - """获取 exp token 的所有列名""" - cols = [] - for col, values in EXP_ONEHOT_SPECS.items(): - cols.extend(get_onehot_cols(col, values)) - return cols - - -@dataclass -class LNPDatasetConfig: - """数据集配置""" - comp_cols: List[str] = None - phys_cols: List[str] = None - help_cols: List[str] = None - exp_cols: List[str] = None - - def __post_init__(self): - self.comp_cols = self.comp_cols or COMP_COLS - self.phys_cols = self.phys_cols or get_phys_cols() - self.help_cols = self.help_cols or HELP_COLS - self.exp_cols = self.exp_cols or get_exp_cols() - - -class LNPDataset(Dataset): - """ - LNP 数据集,用于 PyTorch DataLoader。 - - 返回: - - smiles: str - - tabular: Dict[str, Tensor] with keys "comp", "phys", "help", "exp" - - targets: Dict[str, Tensor] with keys "size", "pdi", "ee", "delivery", "biodist", "toxic" - - mask: Dict[str, Tensor] 标记哪些 target 有效(非缺失) - """ - - def __init__( - self, - df: pd.DataFrame, - config: Optional[LNPDatasetConfig] = None, - ): - self.config = config or LNPDatasetConfig() - self.df = process_dataframe(df) - - # 提取数据 - self.smiles = self.df[SMILES_COL].tolist() - - # Tabular features - self.comp = self.df[self.config.comp_cols].values.astype(np.float32) - self.phys = self.df[self.config.phys_cols].values.astype(np.float32) - self.help = self.df[self.config.help_cols].values.astype(np.float32) - self.exp = self.df[self.config.exp_cols].values.astype(np.float32) - - # Targets - self.size = self.df["size"].values.astype(np.float32) if "size" in self.df.columns else None - self.delivery = self.df["quantified_delivery"].values.astype(np.float32) if "quantified_delivery" in self.df.columns else None - self.toxic = self.df[TARGET_TOXIC].values.astype(np.int64) if TARGET_TOXIC in self.df.columns else None - - # PDI: one-hot -> class index - if all(col in self.df.columns for col in TARGET_CLASSIFICATION_PDI): - pdi_onehot = self.df[TARGET_CLASSIFICATION_PDI].values - self.pdi = np.argmax(pdi_onehot, axis=1).astype(np.int64) - self.pdi_valid = pdi_onehot.sum(axis=1) > 0 - else: - self.pdi = None - self.pdi_valid = None - - # EE: one-hot -> class index - if all(col in self.df.columns for col in TARGET_CLASSIFICATION_EE): - ee_onehot = self.df[TARGET_CLASSIFICATION_EE].values - self.ee = np.argmax(ee_onehot, axis=1).astype(np.int64) - self.ee_valid = ee_onehot.sum(axis=1) > 0 - else: - self.ee = None - self.ee_valid = None - - # Biodistribution - if all(col in self.df.columns for col in TARGET_BIODIST): - self.biodist = self.df[TARGET_BIODIST].values.astype(np.float32) - self.biodist_valid = self.biodist.sum(axis=1) > 0 - else: - self.biodist = None - self.biodist_valid = None - - def __len__(self) -> int: - return len(self.smiles) - - def __getitem__(self, idx: int) -> Dict: - item = { - "smiles": self.smiles[idx], - "tabular": { - "comp": torch.from_numpy(self.comp[idx]), - "phys": torch.from_numpy(self.phys[idx]), - "help": torch.from_numpy(self.help[idx]), - "exp": torch.from_numpy(self.exp[idx]), - }, - "targets": {}, - "mask": {}, - } - - # Targets and masks - if self.size is not None: - item["targets"]["size"] = torch.tensor(self.size[idx], dtype=torch.float32) - item["mask"]["size"] = torch.tensor(not np.isnan(self.size[idx]), dtype=torch.bool) - - if self.delivery is not None: - item["targets"]["delivery"] = torch.tensor(self.delivery[idx], dtype=torch.float32) - item["mask"]["delivery"] = torch.tensor(not np.isnan(self.delivery[idx]), dtype=torch.bool) - - if self.toxic is not None: - item["targets"]["toxic"] = torch.tensor(self.toxic[idx], dtype=torch.long) - item["mask"]["toxic"] = torch.tensor(self.toxic[idx] >= 0, dtype=torch.bool) - - if self.pdi is not None: - item["targets"]["pdi"] = torch.tensor(self.pdi[idx], dtype=torch.long) - item["mask"]["pdi"] = torch.tensor(self.pdi_valid[idx], dtype=torch.bool) - - if self.ee is not None: - item["targets"]["ee"] = torch.tensor(self.ee[idx], dtype=torch.long) - item["mask"]["ee"] = torch.tensor(self.ee_valid[idx], dtype=torch.bool) - - if self.biodist is not None: - item["targets"]["biodist"] = torch.from_numpy(self.biodist[idx]) - item["mask"]["biodist"] = torch.tensor(self.biodist_valid[idx], dtype=torch.bool) - - return item - - -def collate_fn(batch: List[Dict]) -> Dict: - """ - 自定义 collate 函数,用于 DataLoader。 - - Returns: - - smiles: List[str] - - tabular: Dict[str, Tensor] with batched tensors - - targets: Dict[str, Tensor] with batched tensors - - mask: Dict[str, Tensor] with batched masks - """ - smiles = [item["smiles"] for item in batch] - - tabular = { - key: torch.stack([item["tabular"][key] for item in batch]) - for key in batch[0]["tabular"].keys() - } - - targets = {} - mask = {} - for key in batch[0]["targets"].keys(): - targets[key] = torch.stack([item["targets"][key] for item in batch]) - mask[key] = torch.stack([item["mask"][key] for item in batch]) - - return { - "smiles": smiles, - "tabular": tabular, - "targets": targets, - "mask": mask, - } - - -def load_dataset( - path: Path, - train_ratio: float = 0.8, - val_ratio: float = 0.1, - seed: int = 42, -) -> Tuple[LNPDataset, LNPDataset, LNPDataset]: - """ - 加载并划分数据集。 - - Args: - path: CSV 文件路径 - train_ratio: 训练集比例 - val_ratio: 验证集比例 - seed: 随机种子 - - Returns: - (train_dataset, val_dataset, test_dataset) - """ - df = pd.read_csv(path) - - # 随机打乱 - df = df.sample(frac=1, random_state=seed).reset_index(drop=True) - - n = len(df) - n_train = int(n * train_ratio) - n_val = int(n * val_ratio) - - train_df = df.iloc[:n_train] - val_df = df.iloc[n_train:n_train + n_val] - test_df = df.iloc[n_train + n_val:] - - config = LNPDatasetConfig() - - return ( - LNPDataset(train_df, config), - LNPDataset(val_df, config), - LNPDataset(test_df, config), - ) - - -# ============ 外部数据(仅 delivery)处理 ============ - -# 外部数据中 Value_name 的值映射(空格 -> 下划线) -EXTERNAL_VALUE_NAME_MAP = { - "log luminescence": "log_luminescence", - "Luminescence": "luminescence", - "FFL silencing": "FFL_silencing", - "Peptide abundance": "Peptide_abundance", - "hEPO": "hEPO", - "FVII silencing": "FVII_silencing", - "GFP delivery": "GFP_delivery", - "Discretized luminescence": "Discretized_luminescence", -} - -# 外部数据中 Mix_type 的值映射 -EXTERNAL_MIX_TYPE_MAP = { - "Hand": "Pipetting", # 外部数据用 "Hand" 表示 "Pipetting" - "Microfluidic": "Microfluidic", - "Pipetting": "Pipetting", -} - - -def process_external_dataframe(df: pd.DataFrame) -> pd.DataFrame: - """ - 处理外部 LiON 数据的 DataFrame,对齐到模型所需的列格式。 - - 与 process_dataframe 类似,但针对外部数据的列名差异做适配: - - Value_name 值中的空格需要转为下划线 - - Mix_type 中 "Hand" 需要映射为 "Pipetting" - """ - df = df.copy() - - # 1. 预处理:映射 Value_name 和 Mix_type 的值 - if "Value_name" in df.columns: - df["Value_name"] = df["Value_name"].map( - lambda x: EXTERNAL_VALUE_NAME_MAP.get(x, x) if pd.notna(x) else x - ) - - if "Mix_type" in df.columns: - df["Mix_type"] = df["Mix_type"].map( - lambda x: EXTERNAL_MIX_TYPE_MAP.get(x, x) if pd.notna(x) else x - ) - - # 2. 处理 phys token 的 one-hot 列(如果不存在则从原始列生成) - for col, values in PHYS_ONEHOT_SPECS.items(): - for v in values: - onehot_col = f"{col}_{v}" - if onehot_col not in df.columns: - if col in df.columns: - df[onehot_col] = (df[col] == v).astype(float) - else: - df[onehot_col] = 0.0 - - # 3. 处理 exp token 的 one-hot 列 - # 外部数据部分列已存在(如 Model_type_*, Delivery_target_* 等),但可能缺失某些类别 - for col, values in EXP_ONEHOT_SPECS.items(): - for v in values: - onehot_col = f"{col}_{v}" - if onehot_col not in df.columns: - if col in df.columns: - df[onehot_col] = (df[col] == v).astype(float) - else: - df[onehot_col] = 0.0 - else: - # 确保是 float 类型 - df[onehot_col] = df[onehot_col].fillna(0.0).astype(float) - - # 4. 确保 comp 列存在且为 float - for col in COMP_COLS: - if col in df.columns: - df[col] = pd.to_numeric(df[col], errors="coerce").fillna(0.0) - else: - df[col] = 0.0 - - # 5. 确保 help 列存在 - for col in HELP_COLS: - if col not in df.columns: - df[col] = 0.0 - else: - df[col] = df[col].fillna(0.0).astype(float) - - # 6. 处理 quantified_delivery - if "quantified_delivery" in df.columns: - df["quantified_delivery"] = pd.to_numeric(df["quantified_delivery"], errors="coerce") - - return df - - -class ExternalDeliveryDataset(Dataset): - """ - 外部 LiON 数据集,仅用于 delivery 预训练。 - - 返回: - - smiles: str - - tabular: Dict[str, Tensor] with keys "comp", "phys", "help", "exp" - - targets: Dict[str, Tensor] with key "delivery" - - mask: Dict[str, Tensor] with key "delivery" - """ - - def __init__( - self, - df: pd.DataFrame, - config: Optional[LNPDatasetConfig] = None, - ): - self.config = config or LNPDatasetConfig() - self.df = process_external_dataframe(df) - - # 提取数据 - self.smiles = self.df[SMILES_COL].tolist() - - # Tabular features - self.comp = self.df[self.config.comp_cols].values.astype(np.float32) - self.phys = self.df[self.config.phys_cols].values.astype(np.float32) - self.help = self.df[self.config.help_cols].values.astype(np.float32) - self.exp = self.df[self.config.exp_cols].values.astype(np.float32) - - # 只有 delivery 作为 target - self.delivery = self.df["quantified_delivery"].values.astype(np.float32) if "quantified_delivery" in self.df.columns else None - - def __len__(self) -> int: - return len(self.smiles) - - def __getitem__(self, idx: int) -> Dict: - item = { - "smiles": self.smiles[idx], - "tabular": { - "comp": torch.from_numpy(self.comp[idx]), - "phys": torch.from_numpy(self.phys[idx]), - "help": torch.from_numpy(self.help[idx]), - "exp": torch.from_numpy(self.exp[idx]), - }, - "targets": {}, - "mask": {}, - } - - # delivery target and mask - if self.delivery is not None: - item["targets"]["delivery"] = torch.tensor(self.delivery[idx], dtype=torch.float32) - item["mask"]["delivery"] = torch.tensor(not np.isnan(self.delivery[idx]), dtype=torch.bool) - - return item - - -def load_external_dataset( - path: Path, - train_ratio: float = 0.9, - seed: int = 42, -) -> Tuple[ExternalDeliveryDataset, ExternalDeliveryDataset]: - """ - 加载外部 LiON 数据集并划分为 train/val。 - - Args: - path: CSV 文件路径 - train_ratio: 训练集比例(剩余为验证集) - seed: 随机种子 - - Returns: - (train_dataset, val_dataset) - """ - df = pd.read_csv(path) - - # 过滤掉 quantified_delivery 为空的行 - if "quantified_delivery" in df.columns: - df = df[df["quantified_delivery"].notna()].reset_index(drop=True) - - # 随机打乱 - df = df.sample(frac=1, random_state=seed).reset_index(drop=True) - - n = len(df) - n_train = int(n * train_ratio) - - train_df = df.iloc[:n_train] - val_df = df.iloc[n_train:] - - config = LNPDatasetConfig() - - return ( - ExternalDeliveryDataset(train_df, config), - ExternalDeliveryDataset(val_df, config), - ) +"""数据集处理模块""" + +from pathlib import Path +from typing import Dict, List, Tuple, Optional +from dataclasses import dataclass + +import numpy as np +import pandas as pd +import torch +from torch.utils.data import Dataset + + +# ============ 列名配置 ============ + +# SMILES 列 +SMILES_COL = "smiles" + +# comp token: 配方比例 [5] +COMP_COLS = [ + "Cationic_Lipid_to_mRNA_weight_ratio", + "Cationic_Lipid_Mol_Ratio", + "Phospholipid_Mol_Ratio", + "Cholesterol_Mol_Ratio", + "PEG_Lipid_Mol_Ratio", +] + +# phys token: 物理/实验参数 one-hot [12] +# 需要从原始列生成 one-hot +PHYS_ONEHOT_SPECS = { + "Purity": ["Pure", "Crude"], + "Mix_type": ["Microfluidic", "Pipetting"], + "Cargo_type": ["mRNA", "pDNA", "siRNA"], + "Target_or_delivered_gene": ["FFL", "Peptide_barcode", "hEPO", "FVII", "GFP"], +} + +# help token: Helper lipid one-hot [4] +HELP_COLS = [ + "Helper_lipid_ID_DOPE", + "Helper_lipid_ID_DOTAP", + "Helper_lipid_ID_DSPC", + "Helper_lipid_ID_MDOA", +] + +# exp token: 实验条件 one-hot [32] +EXP_ONEHOT_SPECS = { + "Model_type": ["A549", "BDMC", "BMDM", "HBEC_ALI", "HEK293T", "HeLa", "IGROV1", "Mouse", "RAW264p7"], + "Delivery_target": ["body", "dendritic_cell", "generic_cell", "liver", "lung", "lung_epithelium", "macrophage", "muscle", "spleen"], + "Route_of_administration": ["in_vitro", "intramuscular", "intratracheal", "intravenous"], + "Batch_or_individual_or_barcoded": ["Barcoded", "Individual"], + "Value_name": ["log_luminescence", "luminescence", "FFL_silencing", "Peptide_abundance", "hEPO", "FVII_silencing", "GFP_delivery", "Discretized_luminescence"], +} + +# Target 列 +TARGET_REGRESSION = ["size", "quantified_delivery"] +TARGET_CLASSIFICATION_PDI = ["PDI_0_0to0_2", "PDI_0_2to0_3", "PDI_0_3to0_4", "PDI_0_4to0_5"] +TARGET_CLASSIFICATION_EE = ["Encapsulation_Efficiency_EE<50", "Encapsulation_Efficiency_50<=EE<80", "Encapsulation_Efficiency_80 List[str]: + """生成 one-hot 列名""" + return [f"{prefix}_{v}" for v in values] + + +def process_dataframe(df: pd.DataFrame) -> pd.DataFrame: + """ + 处理原始 DataFrame,生成模型所需的所有列。 + + Args: + df: 原始 DataFrame + + Returns: + 处理后的 DataFrame,包含所有需要的列 + """ + df = df.copy() + + # 1. 处理 phys token 的 one-hot 列(如果不存在则生成) + for col, values in PHYS_ONEHOT_SPECS.items(): + for v in values: + onehot_col = f"{col}_{v}" + if onehot_col not in df.columns: + if col in df.columns: + df[onehot_col] = (df[col] == v).astype(float) + else: + df[onehot_col] = 0.0 + + # 2. 处理 exp token 的 one-hot 列(如果不存在则生成) + for col, values in EXP_ONEHOT_SPECS.items(): + for v in values: + onehot_col = f"{col}_{v}" + if onehot_col not in df.columns: + if col in df.columns: + df[onehot_col] = (df[col] == v).astype(float) + else: + df[onehot_col] = 0.0 + + # 3. 确保 comp 列存在且为 float + for col in COMP_COLS: + if col in df.columns: + df[col] = pd.to_numeric(df[col], errors="coerce").fillna(0.0) + else: + df[col] = 0.0 + + # 4. 确保 help 列存在 + for col in HELP_COLS: + if col not in df.columns: + df[col] = 0.0 + else: + df[col] = df[col].fillna(0.0).astype(float) + + # 5. 处理 target 列 + # size: 已经 log 过,填充缺失值 + if "size" in df.columns: + df["size"] = pd.to_numeric(df["size"], errors="coerce") + + # quantified_delivery: 已经 z-score 过 + if "quantified_delivery" in df.columns: + df["quantified_delivery"] = pd.to_numeric(df["quantified_delivery"], errors="coerce") + + # toxic: 0/1 + if TARGET_TOXIC in df.columns: + df[TARGET_TOXIC] = pd.to_numeric(df[TARGET_TOXIC], errors="coerce").fillna(-1).astype(int) + + # PDI 和 EE 的 one-hot 分类 + for col in TARGET_CLASSIFICATION_PDI + TARGET_CLASSIFICATION_EE: + if col in df.columns: + df[col] = df[col].fillna(0).astype(float) + + # Biodistribution + for col in TARGET_BIODIST: + if col in df.columns: + df[col] = pd.to_numeric(df[col], errors="coerce").fillna(0.0) + if all(col in df.columns for col in TARGET_BIODIST): + bd = df[TARGET_BIODIST].values.astype(float) + s = bd.sum(axis=1, keepdims=True) + nz = s.squeeze(-1) > 0 + bd[nz] = bd[nz] / s[nz] + df[TARGET_BIODIST] = bd + + return df + + +def get_phys_cols() -> List[str]: + """获取 phys token 的所有列名""" + cols = [] + for col, values in PHYS_ONEHOT_SPECS.items(): + cols.extend(get_onehot_cols(col, values)) + return cols + + +def get_exp_cols() -> List[str]: + """获取 exp token 的所有列名""" + cols = [] + for col, values in EXP_ONEHOT_SPECS.items(): + cols.extend(get_onehot_cols(col, values)) + return cols + + +@dataclass +class LNPDatasetConfig: + """数据集配置""" + comp_cols: List[str] = None + phys_cols: List[str] = None + help_cols: List[str] = None + exp_cols: List[str] = None + + def __post_init__(self): + self.comp_cols = self.comp_cols or COMP_COLS + self.phys_cols = self.phys_cols or get_phys_cols() + self.help_cols = self.help_cols or HELP_COLS + self.exp_cols = self.exp_cols or get_exp_cols() + + +class LNPDataset(Dataset): + """ + LNP 数据集,用于 PyTorch DataLoader。 + + 返回: + - smiles: str + - tabular: Dict[str, Tensor] with keys "comp", "phys", "help", "exp" + - targets: Dict[str, Tensor] with keys "size", "pdi", "ee", "delivery", "biodist", "toxic" + - mask: Dict[str, Tensor] 标记哪些 target 有效(非缺失) + """ + + def __init__( + self, + df: pd.DataFrame, + config: Optional[LNPDatasetConfig] = None, + ): + self.config = config or LNPDatasetConfig() + self.df = process_dataframe(df) + + # 提取数据 + self.smiles = self.df[SMILES_COL].tolist() + + # Tabular features + self.comp = self.df[self.config.comp_cols].values.astype(np.float32) + self.phys = self.df[self.config.phys_cols].values.astype(np.float32) + self.help = self.df[self.config.help_cols].values.astype(np.float32) + self.exp = self.df[self.config.exp_cols].values.astype(np.float32) + + # Targets + self.size = self.df["size"].values.astype(np.float32) if "size" in self.df.columns else None + self.delivery = self.df["quantified_delivery"].values.astype(np.float32) if "quantified_delivery" in self.df.columns else None + self.toxic = self.df[TARGET_TOXIC].values.astype(np.int64) if TARGET_TOXIC in self.df.columns else None + + # PDI: one-hot -> class index + if all(col in self.df.columns for col in TARGET_CLASSIFICATION_PDI): + pdi_onehot = self.df[TARGET_CLASSIFICATION_PDI].values + self.pdi = np.argmax(pdi_onehot, axis=1).astype(np.int64) + self.pdi_valid = pdi_onehot.sum(axis=1) > 0 + else: + self.pdi = None + self.pdi_valid = None + + # EE: one-hot -> class index + if all(col in self.df.columns for col in TARGET_CLASSIFICATION_EE): + ee_onehot = self.df[TARGET_CLASSIFICATION_EE].values + self.ee = np.argmax(ee_onehot, axis=1).astype(np.int64) + self.ee_valid = ee_onehot.sum(axis=1) > 0 + else: + self.ee = None + self.ee_valid = None + + # Biodistribution + if all(col in self.df.columns for col in TARGET_BIODIST): + self.biodist = self.df[TARGET_BIODIST].values.astype(np.float32) + self.biodist_valid = self.biodist.sum(axis=1) > 0 + else: + self.biodist = None + self.biodist_valid = None + + def __len__(self) -> int: + return len(self.smiles) + + def __getitem__(self, idx: int) -> Dict: + item = { + "smiles": self.smiles[idx], + "tabular": { + "comp": torch.from_numpy(self.comp[idx]), + "phys": torch.from_numpy(self.phys[idx]), + "help": torch.from_numpy(self.help[idx]), + "exp": torch.from_numpy(self.exp[idx]), + }, + "targets": {}, + "mask": {}, + } + + # Targets and masks + if self.size is not None: + item["targets"]["size"] = torch.tensor(self.size[idx], dtype=torch.float32) + item["mask"]["size"] = torch.tensor(not np.isnan(self.size[idx]), dtype=torch.bool) + + if self.delivery is not None: + item["targets"]["delivery"] = torch.tensor(self.delivery[idx], dtype=torch.float32) + item["mask"]["delivery"] = torch.tensor(not np.isnan(self.delivery[idx]), dtype=torch.bool) + + if self.toxic is not None: + item["targets"]["toxic"] = torch.tensor(self.toxic[idx], dtype=torch.long) + item["mask"]["toxic"] = torch.tensor(self.toxic[idx] >= 0, dtype=torch.bool) + + if self.pdi is not None: + item["targets"]["pdi"] = torch.tensor(self.pdi[idx], dtype=torch.long) + item["mask"]["pdi"] = torch.tensor(self.pdi_valid[idx], dtype=torch.bool) + + if self.ee is not None: + item["targets"]["ee"] = torch.tensor(self.ee[idx], dtype=torch.long) + item["mask"]["ee"] = torch.tensor(self.ee_valid[idx], dtype=torch.bool) + + if self.biodist is not None: + item["targets"]["biodist"] = torch.from_numpy(self.biodist[idx]) + item["mask"]["biodist"] = torch.tensor(self.biodist_valid[idx], dtype=torch.bool) + + return item + + +def collate_fn(batch: List[Dict]) -> Dict: + """ + 自定义 collate 函数,用于 DataLoader。 + + Returns: + - smiles: List[str] + - tabular: Dict[str, Tensor] with batched tensors + - targets: Dict[str, Tensor] with batched tensors + - mask: Dict[str, Tensor] with batched masks + """ + smiles = [item["smiles"] for item in batch] + + tabular = { + key: torch.stack([item["tabular"][key] for item in batch]) + for key in batch[0]["tabular"].keys() + } + + targets = {} + mask = {} + for key in batch[0]["targets"].keys(): + targets[key] = torch.stack([item["targets"][key] for item in batch]) + mask[key] = torch.stack([item["mask"][key] for item in batch]) + + return { + "smiles": smiles, + "tabular": tabular, + "targets": targets, + "mask": mask, + } + + +def load_dataset( + path: Path, + train_ratio: float = 0.8, + val_ratio: float = 0.1, + seed: int = 42, +) -> Tuple[LNPDataset, LNPDataset, LNPDataset]: + """ + 加载并划分数据集。 + + Args: + path: CSV 文件路径 + train_ratio: 训练集比例 + val_ratio: 验证集比例 + seed: 随机种子 + + Returns: + (train_dataset, val_dataset, test_dataset) + """ + df = pd.read_csv(path) + + # 随机打乱 + df = df.sample(frac=1, random_state=seed).reset_index(drop=True) + + n = len(df) + n_train = int(n * train_ratio) + n_val = int(n * val_ratio) + + train_df = df.iloc[:n_train] + val_df = df.iloc[n_train:n_train + n_val] + test_df = df.iloc[n_train + n_val:] + + config = LNPDatasetConfig() + + return ( + LNPDataset(train_df, config), + LNPDataset(val_df, config), + LNPDataset(test_df, config), + ) + + +# ============ 外部数据(仅 delivery)处理 ============ + +# 外部数据中 Value_name 的值映射(空格 -> 下划线) +EXTERNAL_VALUE_NAME_MAP = { + "log luminescence": "log_luminescence", + "Luminescence": "luminescence", + "FFL silencing": "FFL_silencing", + "Peptide abundance": "Peptide_abundance", + "hEPO": "hEPO", + "FVII silencing": "FVII_silencing", + "GFP delivery": "GFP_delivery", + "Discretized luminescence": "Discretized_luminescence", +} + +# 外部数据中 Mix_type 的值映射 +EXTERNAL_MIX_TYPE_MAP = { + "Hand": "Pipetting", # 外部数据用 "Hand" 表示 "Pipetting" + "Microfluidic": "Microfluidic", + "Pipetting": "Pipetting", +} + + +def process_external_dataframe(df: pd.DataFrame) -> pd.DataFrame: + """ + 处理外部 LiON 数据的 DataFrame,对齐到模型所需的列格式。 + + 与 process_dataframe 类似,但针对外部数据的列名差异做适配: + - Value_name 值中的空格需要转为下划线 + - Mix_type 中 "Hand" 需要映射为 "Pipetting" + """ + df = df.copy() + + # 1. 预处理:映射 Value_name 和 Mix_type 的值 + if "Value_name" in df.columns: + df["Value_name"] = df["Value_name"].map( + lambda x: EXTERNAL_VALUE_NAME_MAP.get(x, x) if pd.notna(x) else x + ) + + if "Mix_type" in df.columns: + df["Mix_type"] = df["Mix_type"].map( + lambda x: EXTERNAL_MIX_TYPE_MAP.get(x, x) if pd.notna(x) else x + ) + + # 2. 处理 phys token 的 one-hot 列(如果不存在则从原始列生成) + for col, values in PHYS_ONEHOT_SPECS.items(): + for v in values: + onehot_col = f"{col}_{v}" + if onehot_col not in df.columns: + if col in df.columns: + df[onehot_col] = (df[col] == v).astype(float) + else: + df[onehot_col] = 0.0 + + # 3. 处理 exp token 的 one-hot 列 + # 外部数据部分列已存在(如 Model_type_*, Delivery_target_* 等),但可能缺失某些类别 + for col, values in EXP_ONEHOT_SPECS.items(): + for v in values: + onehot_col = f"{col}_{v}" + if onehot_col not in df.columns: + if col in df.columns: + df[onehot_col] = (df[col] == v).astype(float) + else: + df[onehot_col] = 0.0 + else: + # 确保是 float 类型 + df[onehot_col] = df[onehot_col].fillna(0.0).astype(float) + + # 4. 确保 comp 列存在且为 float + for col in COMP_COLS: + if col in df.columns: + df[col] = pd.to_numeric(df[col], errors="coerce").fillna(0.0) + else: + df[col] = 0.0 + + # 5. 确保 help 列存在 + for col in HELP_COLS: + if col not in df.columns: + df[col] = 0.0 + else: + df[col] = df[col].fillna(0.0).astype(float) + + # 6. 处理 quantified_delivery + if "quantified_delivery" in df.columns: + df["quantified_delivery"] = pd.to_numeric(df["quantified_delivery"], errors="coerce") + + return df + + +class ExternalDeliveryDataset(Dataset): + """ + 外部 LiON 数据集,仅用于 delivery 预训练。 + + 返回: + - smiles: str + - tabular: Dict[str, Tensor] with keys "comp", "phys", "help", "exp" + - targets: Dict[str, Tensor] with key "delivery" + - mask: Dict[str, Tensor] with key "delivery" + """ + + def __init__( + self, + df: pd.DataFrame, + config: Optional[LNPDatasetConfig] = None, + ): + self.config = config or LNPDatasetConfig() + self.df = process_external_dataframe(df) + + # 提取数据 + self.smiles = self.df[SMILES_COL].tolist() + + # Tabular features + self.comp = self.df[self.config.comp_cols].values.astype(np.float32) + self.phys = self.df[self.config.phys_cols].values.astype(np.float32) + self.help = self.df[self.config.help_cols].values.astype(np.float32) + self.exp = self.df[self.config.exp_cols].values.astype(np.float32) + + # 只有 delivery 作为 target + self.delivery = self.df["quantified_delivery"].values.astype(np.float32) if "quantified_delivery" in self.df.columns else None + + def __len__(self) -> int: + return len(self.smiles) + + def __getitem__(self, idx: int) -> Dict: + item = { + "smiles": self.smiles[idx], + "tabular": { + "comp": torch.from_numpy(self.comp[idx]), + "phys": torch.from_numpy(self.phys[idx]), + "help": torch.from_numpy(self.help[idx]), + "exp": torch.from_numpy(self.exp[idx]), + }, + "targets": {}, + "mask": {}, + } + + # delivery target and mask + if self.delivery is not None: + item["targets"]["delivery"] = torch.tensor(self.delivery[idx], dtype=torch.float32) + item["mask"]["delivery"] = torch.tensor(not np.isnan(self.delivery[idx]), dtype=torch.bool) + + return item + + +def load_external_dataset( + path: Path, + train_ratio: float = 0.9, + seed: int = 42, +) -> Tuple[ExternalDeliveryDataset, ExternalDeliveryDataset]: + """ + 加载外部 LiON 数据集并划分为 train/val。 + + Args: + path: CSV 文件路径 + train_ratio: 训练集比例(剩余为验证集) + seed: 随机种子 + + Returns: + (train_dataset, val_dataset) + """ + df = pd.read_csv(path) + + # 过滤掉 quantified_delivery 为空的行 + if "quantified_delivery" in df.columns: + df = df[df["quantified_delivery"].notna()].reset_index(drop=True) + + # 随机打乱 + df = df.sample(frac=1, random_state=seed).reset_index(drop=True) + + n = len(df) + n_train = int(n * train_ratio) + + train_df = df.iloc[:n_train] + val_df = df.iloc[n_train:] + + config = LNPDatasetConfig() + + return ( + ExternalDeliveryDataset(train_df, config), + ExternalDeliveryDataset(val_df, config), + ) diff --git a/lnp_ml/modeling/heads.py b/lnp_ml/modeling/heads.py index b0cdb3d..44d2986 100644 --- a/lnp_ml/modeling/heads.py +++ b/lnp_ml/modeling/heads.py @@ -1,118 +1,124 @@ -import torch -import torch.nn as nn -import torch.nn.functional as F -from typing import Dict - - -class RegressionHead(nn.Module): - """回归任务头:输出单个 float 值""" - - def __init__(self, in_dim: int, hidden_dim: int = 128, dropout: float = 0.1) -> None: - super().__init__() - self.net = nn.Sequential( - nn.Linear(in_dim, hidden_dim), - nn.ReLU(), - nn.Dropout(dropout), - nn.Linear(hidden_dim, 1), - ) - - def forward(self, x: torch.Tensor) -> torch.Tensor: - """[B, in_dim] -> [B, 1]""" - return self.net(x) - - -class ClassificationHead(nn.Module): - """分类任务头:输出 logits""" - - def __init__( - self, in_dim: int, num_classes: int, hidden_dim: int = 128, dropout: float = 0.1 - ) -> None: - super().__init__() - self.net = nn.Sequential( - nn.Linear(in_dim, hidden_dim), - nn.ReLU(), - nn.Dropout(dropout), - nn.Linear(hidden_dim, num_classes), - ) - - def forward(self, x: torch.Tensor) -> torch.Tensor: - """[B, in_dim] -> [B, num_classes] (logits)""" - return self.net(x) - - -class DistributionHead(nn.Module): - """分布任务头:输出和为 1 的概率分布(用于 Biodistribution)""" - - def __init__( - self, in_dim: int, num_outputs: int, hidden_dim: int = 128, dropout: float = 0.1 - ) -> None: - super().__init__() - self.net = nn.Sequential( - nn.Linear(in_dim, hidden_dim), - nn.ReLU(), - nn.Dropout(dropout), - nn.Linear(hidden_dim, num_outputs), - ) - - def forward(self, x: torch.Tensor) -> torch.Tensor: - """[B, in_dim] -> [B, num_outputs] (softmax, sum=1)""" - logits = self.net(x) - return F.softmax(logits, dim=-1) - - -class MultiTaskHead(nn.Module): - """ - 多任务预测头,根据任务配置自动创建对应的子头。 - - 输出: - - size: [B, 1] 回归 - - pdi: [B, 4] 分类 logits - - ee: [B, 3] 分类 logits - - delivery: [B, 1] 回归 - - biodist: [B, 7] softmax 分布 - - toxic: [B, 2] 二分类 logits - """ - - def __init__(self, in_dim: int, hidden_dim: int = 128, dropout: float = 0.1) -> None: - super().__init__() - - # size: 回归 (log-transformed) - self.size_head = RegressionHead(in_dim, hidden_dim, dropout) - - # PDI: 4 分类 - self.pdi_head = ClassificationHead(in_dim, num_classes=4, hidden_dim=hidden_dim, dropout=dropout) - - # Encapsulation Efficiency: 3 分类 - self.ee_head = ClassificationHead(in_dim, num_classes=3, hidden_dim=hidden_dim, dropout=dropout) - - # quantified_delivery: 回归 (z-scored) - self.delivery_head = RegressionHead(in_dim, hidden_dim, dropout) - - # Biodistribution: 7 输出,softmax (sum=1) - self.biodist_head = DistributionHead(in_dim, num_outputs=7, hidden_dim=hidden_dim, dropout=dropout) - - # toxic: 二分类 - self.toxic_head = ClassificationHead(in_dim, num_classes=2, hidden_dim=hidden_dim, dropout=dropout) - - def forward(self, x: torch.Tensor) -> Dict[str, torch.Tensor]: - """ - Args: - x: [B, in_dim] fusion 层输出 - - Returns: - Dict with keys: - - "size": [B, 1] - - "pdi": [B, 4] logits - - "ee": [B, 3] logits - - "delivery": [B, 1] - - "biodist": [B, 7] probabilities (sum=1) - - "toxic": [B, 2] logits - """ - return { - "size": self.size_head(x), - "pdi": self.pdi_head(x), - "ee": self.ee_head(x), - "delivery": self.delivery_head(x), - "biodist": self.biodist_head(x), - "toxic": self.toxic_head(x), - } +import torch +import torch.nn as nn +import torch.nn.functional as F +from typing import Dict + + +class RegressionHead(nn.Module): + """回归任务头:输出单个 float 值""" + + def __init__(self, in_dim: int, hidden_dim: int = 128, dropout: float = 0.1) -> None: + super().__init__() + self.net = nn.Sequential( + nn.Linear(in_dim, hidden_dim), + nn.ReLU(), + nn.Dropout(dropout), + nn.Linear(hidden_dim, 1), + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """[B, in_dim] -> [B, 1]""" + return self.net(x) + + +class ClassificationHead(nn.Module): + """分类任务头:输出 logits""" + + def __init__( + self, in_dim: int, num_classes: int, hidden_dim: int = 128, dropout: float = 0.1 + ) -> None: + super().__init__() + self.net = nn.Sequential( + nn.Linear(in_dim, hidden_dim), + nn.ReLU(), + nn.Dropout(dropout), + nn.Linear(hidden_dim, num_classes), + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """[B, in_dim] -> [B, num_classes] (logits)""" + return self.net(x) + + +class DistributionHead(nn.Module): + """分布任务头:输出和为 1 的概率分布(用于 Biodistribution)""" + + def __init__( + self, in_dim: int, num_outputs: int, hidden_dim: int = 128, dropout: float = 0.1 + ) -> None: + super().__init__() + self.net = nn.Sequential( + nn.Linear(in_dim, hidden_dim), + nn.ReLU(), + nn.Dropout(dropout), + nn.Linear(hidden_dim, num_outputs), + ) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """[B, in_dim] -> [B, num_outputs] (softmax, sum=1)""" + logits = self.net(x) + return F.softmax(logits, dim=-1) + + +class MultiTaskHead(nn.Module): + """ + 多任务预测头,根据任务配置自动创建对应的子头。 + + 输出: + - size: [B, 1] 回归 + - pdi: [B, 4] 分类 logits + - ee: [B, 3] 分类 logits + - delivery: [B, 1] 回归 + - biodist: [B, 7] softmax 分布 + - toxic: [B, 2] 二分类 logits + """ + + def __init__(self, in_dim: int, hidden_dim: int = 128, dropout: float = 0.1) -> None: + super().__init__() + + # size: 回归 (log-transformed) + self.size_head = RegressionHead(in_dim, hidden_dim, dropout) + + # PDI: 4 分类 + self.pdi_head = ClassificationHead(in_dim, num_classes=4, hidden_dim=hidden_dim, dropout=dropout) + + # Encapsulation Efficiency: 3 分类 + self.ee_head = ClassificationHead(in_dim, num_classes=3, hidden_dim=hidden_dim, dropout=dropout) + + # quantified_delivery: 回归 (z-scored) + self.delivery_head = RegressionHead(in_dim, hidden_dim, dropout) + + # Biodistribution: 7 输出,softmax (sum=1) + self.biodist_head = DistributionHead(in_dim, num_outputs=7, hidden_dim=hidden_dim, dropout=dropout) + + # toxic: 二分类 + self.toxic_head = ClassificationHead(in_dim, num_classes=2, hidden_dim=hidden_dim, dropout=dropout) + + # 不确定性加权(Kendall 2018):每个任务一个可学习 log σ²,初始 0 + self.log_vars = nn.ParameterDict({ + t: nn.Parameter(torch.zeros(())) + for t in ["size", "delivery", "pdi", "ee", "toxic", "biodist"] + }) + + def forward(self, x: torch.Tensor) -> Dict[str, torch.Tensor]: + """ + Args: + x: [B, in_dim] fusion 层输出 + + Returns: + Dict with keys: + - "size": [B, 1] + - "pdi": [B, 4] logits + - "ee": [B, 3] logits + - "delivery": [B, 1] + - "biodist": [B, 7] probabilities (sum=1) + - "toxic": [B, 2] logits + """ + return { + "size": self.size_head(x), + "pdi": self.pdi_head(x), + "ee": self.ee_head(x), + "delivery": self.delivery_head(x), + "biodist": self.biodist_head(x), + "toxic": self.toxic_head(x), + } diff --git a/lnp_ml/modeling/layers/fusion.py b/lnp_ml/modeling/layers/fusion.py index 82c7636..70ef066 100644 --- a/lnp_ml/modeling/layers/fusion.py +++ b/lnp_ml/modeling/layers/fusion.py @@ -1,111 +1,152 @@ -import torch -import torch.nn as nn -import torch.nn.functional as F -from typing import Dict, Literal, Tuple, Union - - -PoolingStrategy = Literal["concat", "avg", "max", "attention"] - - -class FusionLayer(nn.Module): - """ - 将多个 token 融合成单个向量。 - - 输入: Dict[str, Tensor] 或 [B, n_tokens, d_model] - 输出: [B, fusion_dim] - - 策略: - - concat: [B, n_tokens, d_model] -> [B, n_tokens * d_model] - - avg: [B, n_tokens, d_model] -> [B, d_model] - - max: [B, n_tokens, d_model] -> [B, d_model] - - attention: [B, n_tokens, d_model] -> [B, d_model] (learnable attention pooling) - """ - - def __init__( - self, - d_model: int, - n_tokens: int, - strategy: PoolingStrategy = "attention", - ) -> None: - """ - Args: - d_model: 每个 token 的维度 - n_tokens: token 数量(如 8) - strategy: 融合策略 - """ - super().__init__() - self.d_model = d_model - self.n_tokens = n_tokens - self.strategy = strategy - - if strategy == "concat": - self.fusion_dim = n_tokens * d_model - else: - self.fusion_dim = d_model - - # Attention pooling: learnable query - if strategy == "attention": - self.attn_query = nn.Parameter(torch.randn(1, 1, d_model)) - self.attn_proj = nn.Linear(d_model, d_model) - - def forward( - self, - x: Union[Dict[str, torch.Tensor], torch.Tensor], - return_attn_weights: bool = False, - ) -> Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]: - """ - Args: - x: Dict[str, Tensor] 每个 [B, d_model],或已 stack 的 [B, n_tokens, d_model] - return_attn_weights: 若为 True 且策略为 attention,额外返回 attn_weights [B, n_tokens] - - Returns: - return_attn_weights=False: [B, fusion_dim] - return_attn_weights=True: ([B, fusion_dim], [B, n_tokens]) - """ - if isinstance(x, dict): - x = torch.stack(list(x.values()), dim=1) - - if self.strategy == "concat": - out = x.flatten(start_dim=1) - return (out, None) if return_attn_weights else out - - elif self.strategy == "avg": - out = x.mean(dim=1) - return (out, None) if return_attn_weights else out - - elif self.strategy == "max": - out = x.max(dim=1).values - return (out, None) if return_attn_weights else out - - elif self.strategy == "attention": - return self._attention_pooling(x, return_attn_weights) - - else: - raise ValueError(f"Unknown strategy: {self.strategy}") - - def _attention_pooling( - self, x: torch.Tensor, return_attn_weights: bool = False, - ) -> Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]: - """ - Attention pooling: 用可学习 query 对 tokens 做加权求和 - - Args: - x: [B, n_tokens, d_model] - return_attn_weights: 是否返回权重 - - Returns: - return_attn_weights=False: [B, d_model] - return_attn_weights=True: ([B, d_model], [B, n_tokens]) - """ - B = x.size(0) - query = self.attn_query.expand(B, -1, -1) - - keys = self.attn_proj(x) - scores = torch.bmm(query, keys.transpose(1, 2)) / (self.d_model ** 0.5) - attn_weights = F.softmax(scores, dim=-1) # [B, 1, n_tokens] - - out = torch.bmm(attn_weights, x).squeeze(1) # [B, d_model] - - if return_attn_weights: - return out, attn_weights.squeeze(1) # [B, n_tokens] - return out +import torch +import torch.nn as nn +import torch.nn.functional as F +from typing import Dict, List, Literal, Optional, Tuple, Union + + +PoolingStrategy = Literal["concat", "avg", "max", "attention"] + + +class FusionLayer(nn.Module): + """ + 将多个 token 融合成单个向量。 + + 输入: Dict[str, Tensor] 或 [B, n_tokens, d_model] + 输出: [B, fusion_dim] + + 策略: + - concat: [B, n_tokens, d_model] -> [B, n_tokens * d_model] + - avg: [B, n_tokens, d_model] -> [B, d_model] + - max: [B, n_tokens, d_model] -> [B, d_model] + - attention: [B, n_tokens, d_model] -> [B, d_model] (learnable attention pooling) + """ + + def __init__( + self, + d_model: int, + n_tokens: int, + strategy: PoolingStrategy = "attention", + ) -> None: + """ + Args: + d_model: 每个 token 的维度 + n_tokens: token 数量(如 8) + strategy: 融合策略 + """ + super().__init__() + self.d_model = d_model + self.n_tokens = n_tokens + self.strategy = strategy + + if strategy == "concat": + self.fusion_dim = n_tokens * d_model + else: + self.fusion_dim = d_model + + # Attention pooling: learnable query + if strategy == "attention": + self.attn_query = nn.Parameter(torch.randn(1, 1, d_model)) + self.attn_proj = nn.Linear(d_model, d_model) + + def forward( + self, + x: Union[Dict[str, torch.Tensor], torch.Tensor], + return_attn_weights: bool = False, + ) -> Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]: + """ + Args: + x: Dict[str, Tensor] 每个 [B, d_model],或已 stack 的 [B, n_tokens, d_model] + return_attn_weights: 若为 True 且策略为 attention,额外返回 attn_weights [B, n_tokens] + + Returns: + return_attn_weights=False: [B, fusion_dim] + return_attn_weights=True: ([B, fusion_dim], [B, n_tokens]) + """ + if isinstance(x, dict): + x = torch.stack(list(x.values()), dim=1) + + if self.strategy == "concat": + out = x.flatten(start_dim=1) + return (out, None) if return_attn_weights else out + + elif self.strategy == "avg": + out = x.mean(dim=1) + return (out, None) if return_attn_weights else out + + elif self.strategy == "max": + out = x.max(dim=1).values + return (out, None) if return_attn_weights else out + + elif self.strategy == "attention": + return self._attention_pooling(x, return_attn_weights) + + else: + raise ValueError(f"Unknown strategy: {self.strategy}") + + def _attention_pooling( + self, x: torch.Tensor, return_attn_weights: bool = False, + ) -> Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]: + """ + Attention pooling: 用可学习 query 对 tokens 做加权求和 + + Args: + x: [B, n_tokens, d_model] + return_attn_weights: 是否返回权重 + + Returns: + return_attn_weights=False: [B, d_model] + return_attn_weights=True: ([B, d_model], [B, n_tokens]) + """ + B = x.size(0) + query = self.attn_query.expand(B, -1, -1) + + keys = self.attn_proj(x) + scores = torch.bmm(query, keys.transpose(1, 2)) / (self.d_model ** 0.5) + attn_weights = F.softmax(scores, dim=-1) # [B, 1, n_tokens] + + out = torch.bmm(attn_weights, x).squeeze(1) # [B, d_model] + + if return_attn_weights: + return out, attn_weights.squeeze(1) # [B, n_tokens] + return out + + +class ResidualConcatFusion(nn.Module): + """对真实 token 做 attention pooling,再用零初始化门把 MoE/LLM 旁路以残差方式加入。 + + g_moe / g_llm 初始为 0 → +moe/+llm 起点严格等于 baseline; + 旁路只有确实有用时才会被训练打开,从机制上保证“加了不会更差”。 + """ + + def __init__(self, d_model: int, strategy: PoolingStrategy = "attention") -> None: + super().__init__() + if strategy == "concat": + raise ValueError("ResidualConcatFusion 不支持 concat(token 数随开关变化)") + self.d_model = d_model + self.pool = FusionLayer(d_model=d_model, n_tokens=1, strategy=strategy) + self.fusion_dim = self.pool.fusion_dim + # 零初始化门控(可学习标量),旁路初始不参与 + self.g_moe = nn.Parameter(torch.zeros(())) + self.g_llm = nn.Parameter(torch.zeros(())) + + def forward( + self, + chem: torch.Tensor, + tab: torch.Tensor, + f_moe: Optional[torch.Tensor] = None, + f_llm: Optional[torch.Tensor] = None, + return_attn_weights: bool = False, + ) -> Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]: + # 只对真实 token(chem + tab)做注意力池化,旁路不参与 softmax 竞争 + seq = torch.cat([chem, tab], dim=1) # [B, n_chem + n_cond, d_model] + pooled = self.pool(seq, return_attn_weights=return_attn_weights) + if return_attn_weights: + pooled, attn = pooled + + out = pooled + if f_moe is not None: + out = out + self.g_moe * f_moe # 残差 + 零初始化门 + if f_llm is not None: + out = out + self.g_llm * f_llm + + return (out, attn) if return_attn_weights else out \ No newline at end of file diff --git a/lnp_ml/modeling/layers/llm_prompt.py b/lnp_ml/modeling/layers/llm_prompt.py new file mode 100644 index 0000000..f9e01f4 --- /dev/null +++ b/lnp_ml/modeling/layers/llm_prompt.py @@ -0,0 +1,104 @@ +"""LLM 分子特征分支:用 MolT5 直接编码 SMILES 文本。""" + +import os +from typing import Dict, List, Optional + +import torch +import torch.nn as nn + + +# 权重默认路径,可用环境变量 MOLT5_PATH 覆盖 +DEFAULT_MOLT5_PATH = os.environ.get("MOLT5_PATH", "models/molt5-base") + + +class LLMPromptEncoder(nn.Module): + """用 MolT5 编码 SMILES 文本,输出分子特征 F_llm [B, d_model]。 + + - 冻结 encoder 时:对每个 SMILES 缓存其句向量,避免重复前向,降方差、提速。 + - use_lora=True 时:encoder 可训练(LoRA),不缓存。 + """ + + def __init__( + self, + d_model: int, + n_chem_tokens: int = 4, + n_cond_tokens: int = 4, + model_name_or_path: str = DEFAULT_MOLT5_PATH, + freeze: bool = True, + use_lora: bool = False, + lora_r: int = 8, + lora_alpha: int = 16, + lora_dropout: float = 0.05, + max_length: int = 128, + ) -> None: + super().__init__() + from transformers import AutoTokenizer, T5EncoderModel + + self.use_lora = use_lora + self.max_length = max_length + self.tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) + self.encoder = T5EncoderModel.from_pretrained(model_name_or_path) + self.hidden_size = self.encoder.config.d_model + + if use_lora: + self._apply_lora(lora_r, lora_alpha, lora_dropout) + elif freeze: + for p in self.encoder.parameters(): + p.requires_grad = False + self._frozen = freeze and not use_lora + + self.proj_down = nn.Sequential( + nn.Linear(self.hidden_size, d_model), nn.LayerNorm(d_model) + ) + # 冻结特征缓存:smiles -> [H](CPU) + self._cache: Dict[str, torch.Tensor] = {} + + def _apply_lora(self, r: int, alpha: int, dropout: float) -> None: + from peft import LoraConfig, get_peft_model + + for p in self.encoder.parameters(): + p.requires_grad = False + cfg = LoraConfig( + r=r, lora_alpha=alpha, lora_dropout=dropout, + target_modules=["q", "k", "v", "o"], bias="none", + ) + self.encoder = get_peft_model(self.encoder, cfg) + + def _mean_pool(self, last_hidden: torch.Tensor, mask: torch.Tensor) -> torch.Tensor: + m = mask.unsqueeze(-1).float() # [B, L, 1] + return (last_hidden * m).sum(1) / m.sum(1).clamp(min=1e-6) + + @torch.no_grad() + def _encode_frozen(self, smiles: List[str], device: torch.device) -> torch.Tensor: + missing = [s for s in smiles if s not in self._cache] + if missing: + uniq = list(dict.fromkeys(missing)) + for i in range(0, len(uniq), 256): + chunk = uniq[i:i + 256] + enc = self.tokenizer( + chunk, padding=True, truncation=True, + max_length=self.max_length, return_tensors="pt", + ).to(device) + out = self.encoder(**enc).last_hidden_state + pooled = self._mean_pool(out, enc["attention_mask"]) + for s, v in zip(chunk, pooled): + self._cache[s] = v.cpu() + return torch.stack([self._cache[s] for s in smiles]).to(device) + + def _encode_trainable(self, smiles: List[str], device: torch.device) -> torch.Tensor: + enc = self.tokenizer( + list(smiles), padding=True, truncation=True, + max_length=self.max_length, return_tensors="pt", + ).to(device) + out = self.encoder(**enc).last_hidden_state + return self._mean_pool(out, enc["attention_mask"]) + + def forward(self, smiles: List[str], tab: Optional[torch.Tensor] = None) -> torch.Tensor: + """Args: smiles [B] SMILES 字符串列表。Returns: [B, d_model]。""" + device = self.proj_down[0].weight.device + feat = self._encode_frozen(smiles, device) if self._frozen \ + else self._encode_trainable(smiles, device) + return self.proj_down(feat) + + def clear_cache(self) -> None: + self._cache.clear() \ No newline at end of file diff --git a/lnp_ml/modeling/layers/set_transformer.py b/lnp_ml/modeling/layers/set_transformer.py new file mode 100644 index 0000000..b128bb4 --- /dev/null +++ b/lnp_ml/modeling/layers/set_transformer.py @@ -0,0 +1,123 @@ +"""Set Transformer 集合编码器。 +输入/输出形状均为 [B, n_tokens, d_model], +n_tokens 可变(支持 3 或 4)。 +""" + +import torch +import torch.nn as nn + + +class MAB(nn.Module): + """多头注意力块:MAB(Q, K) = LN(H + FFN(H)),H = LN(Q + MultiHeadAttn(Q, K, K))。""" + + def __init__(self, d_model: int, num_heads: int, dropout: float = 0.1, ln: bool = True) -> None: + super().__init__() + assert d_model % num_heads == 0, "d_model 必须能被 num_heads 整除" + self.attn = nn.MultiheadAttention( + d_model, num_heads, dropout=dropout, batch_first=True + ) + self.norm1 = nn.LayerNorm(d_model) if ln else nn.Identity() + self.norm2 = nn.LayerNorm(d_model) if ln else nn.Identity() + self.ffn = nn.Sequential( + nn.Linear(d_model, d_model * 4), + nn.GELU(), + nn.Dropout(dropout), + nn.Linear(d_model * 4, d_model), + nn.Dropout(dropout), + ) + + def forward(self, q: torch.Tensor, k: torch.Tensor) -> torch.Tensor: + """ + Args: + q: [B, n_q, d_model] + k: [B, n_k, d_model] + + Returns: + [B, n_q, d_model] + """ + attn_out, _ = self.attn(q, k, k) + h = self.norm1(q + attn_out) + return self.norm2(h + self.ffn(h)) + + +class SAB(nn.Module): + """集合自注意力块:SAB(X) = MAB(X, X)。""" + + def __init__(self, d_model: int, num_heads: int, dropout: float = 0.1, ln: bool = True) -> None: + super().__init__() + self.mab = MAB(d_model, num_heads, dropout, ln) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """[B, n, d_model] -> [B, n, d_model]""" + return self.mab(x, x) + + +class ISAB(nn.Module): + """诱导点集合注意力块:用 m 个可学习诱导点降低大集合的注意力复杂度。""" + + def __init__( + self, + d_model: int, + num_heads: int, + num_inducing: int = 16, + dropout: float = 0.1, + ln: bool = True, + ) -> None: + super().__init__() + # 可学习诱导点 + self.inducing = nn.Parameter(torch.empty(1, num_inducing, d_model)) + nn.init.xavier_uniform_(self.inducing) + self.mab_in = MAB(d_model, num_heads, dropout, ln) + self.mab_out = MAB(d_model, num_heads, dropout, ln) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """[B, n, d_model] -> [B, n, d_model]""" + inducing = self.inducing.expand(x.size(0), -1, -1) # [B, m, d_model] + h = self.mab_in(inducing, x) # [B, m, d_model] + return self.mab_out(x, h) # [B, n, d_model] + + +class SetTransformer(nn.Module): + """对化学 token 集合做 N 层集合自注意力,形状保持 [B, n_tokens, d_model]。""" + + def __init__( + self, + d_model: int, + num_heads: int = 8, + n_layers: int = 4, + dropout: float = 0.1, + block: str = "sab", + num_inducing: int = 16, + ln: bool = True, + ) -> None: + """ + Args: + d_model: token 维度 + num_heads: 注意力头数,d_head = d_model / num_heads + n_layers: 集合注意力层数 + dropout: dropout 比例 + block: 注意力块类型,"sab"(全自注意力)或 "isab"(诱导点) + num_inducing: ISAB 的诱导点数量(block="isab" 时生效) + ln: 是否使用 LayerNorm + """ + super().__init__() + self.block_type = block + + self.layers = nn.ModuleList() + for _ in range(n_layers): + if block == "isab": + self.layers.append(ISAB(d_model, num_heads, num_inducing, dropout, ln)) + else: + self.layers.append(SAB(d_model, num_heads, dropout, ln)) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """ + Args: + x: [B, n_tokens, d_model] 化学 token 集合 + + Returns: + [B, n_tokens, d_model] 集合编码后的 token + """ + for layer in self.layers: + x = layer(x) + return x \ No newline at end of file diff --git a/lnp_ml/modeling/models.py b/lnp_ml/modeling/models.py index e680a52..188ef49 100644 --- a/lnp_ml/modeling/models.py +++ b/lnp_ml/modeling/models.py @@ -5,14 +5,21 @@ import torch.nn as nn from typing import Dict, List, Optional, Literal from lnp_ml.modeling.encoders import CachedRDKitEncoder, CachedMPNNEncoder -from lnp_ml.modeling.layers import TokenProjector, CrossModalAttention, FusionLayer, MoEBlock +from lnp_ml.modeling.layers import ( + TokenProjector, + SetTransformer, + ResidualConcatFusion, + MoEBlock, + LLMPromptEncoder, +) +from lnp_ml.modeling.layers.llm_prompt import DEFAULT_MOLT5_PATH from lnp_ml.modeling.heads import MultiTaskHead -PoolingStrategy = Literal["concat", "avg", "max", "attention"] +PoolingStrategy = Literal["attention", "avg", "max"] -# Token 维度配置(根据 ARCHITECTURE.md) +# Token 维度配置 DEFAULT_INPUT_DIMS = { # Channel A: 化学特征 "mpnn": 600, # D-MPNN embedding @@ -26,8 +33,21 @@ DEFAULT_INPUT_DIMS = { "exp": 32, # 实验条件 one-hot } -# Token 顺序(前 4 个为 Channel A,后 4 个为 Channel B) -TOKEN_ORDER = ["mpnn", "morgan", "maccs", "desc", "comp", "phys", "help", "exp"] +# 化学 / 配方 token 的键顺序 +CHEM_KEYS_WITH_MPNN = ["mpnn", "morgan", "maccs", "desc"] +CHEM_KEYS_NO_MPNN = ["morgan", "maccs", "desc"] +TAB_KEYS = ["comp", "phys", "help", "exp"] + +# backbone 权重前缀(用于预训练加载与导出) +BACKBONE_PREFIXES = ( + "token_projector.", + "set_transformer.", + "fusion.", + "moe.", + "llm_prompt.", +) +# 冻结的 MolT5 encoder 权重前缀,不纳入 backbone(由本地权重加载,不进 checkpoint) +LLM_FROZEN_PREFIX = "llm_prompt.encoder." class LNPModel(nn.Module): @@ -37,37 +57,47 @@ class LNPModel(nn.Module): 架构流程: 1. Encoders: SMILES -> 化学特征; tabular -> 配方/实验特征 2. TokenProjector: 统一到 d_model - 3. Stack: [B, 8, d_model] - 4. CrossModalAttention: Channel A (化学) <-> Channel B (配方/实验) - 5. FusionLayer: [B, 8, d_model] -> [B, fusion_dim] - 6. MultiTaskHead: 多任务预测 + 3. SetTransformer: 对化学 token 集合做置换等变编码 -> chem' + 4. MoE (可选): router 看 tab,expert 吃 chem' -> F_moe + 5. LLM (可选): chem'/tab 注入 MolT5 prompt -> F_llm + 6. ResidualConcatFusion: 拼接 chem'/tab/F_moe/F_llm -> attention pooling + 7. MultiTaskHead: 多任务预测 """ def __init__( self, # 模型维度 d_model: int = 256, - # Cross attention + # Set Transformer num_heads: int = 8, n_attn_layers: int = 4, + set_transformer_block: str = "sab", # Fusion fusion_strategy: PoolingStrategy = "attention", # Head head_hidden_dim: int = 128, # Dropout dropout: float = 0.1, - # MPNN encoder (可选,如果不用 MPNN 可以设为 None) + # MPNN encoder mpnn_checkpoint: Optional[str] = None, mpnn_ensemble_paths: Optional[List[str]] = None, mpnn_device: str = "cpu", # 输入维度配置 input_dims: Optional[Dict[str, int]] = None, - # ============ MoE 相关(新增) ============ + # ============ MoE 相关 ============ use_moe: bool = False, moe_n_experts: int = 4, moe_top_k: int = 2, moe_expert_hidden_mult: int = 2, moe_jitter_noise: float = 0.0, + # ============ LLM 相关 ============ + use_llm: bool = False, + llm_model_path: str = DEFAULT_MOLT5_PATH, + llm_freeze: bool = True, + llm_use_lora: bool = False, + llm_lora_r: int = 8, + llm_lora_alpha: int = 16, + llm_lora_dropout: float = 0.05, ) -> None: super().__init__() @@ -76,10 +106,7 @@ class LNPModel(nn.Module): self.use_mpnn = mpnn_checkpoint is not None or mpnn_ensemble_paths is not None # ============ Encoders ============ - # RDKit encoder (always used) self.rdkit_encoder = CachedRDKitEncoder() - - # MPNN encoder (optional) if self.use_mpnn: self.mpnn_encoder = CachedMPNNEncoder( checkpoint_path=mpnn_checkpoint, @@ -90,27 +117,28 @@ class LNPModel(nn.Module): self.mpnn_encoder = None # ============ Token Projector ============ - # 根据是否使用 MPNN 调整输入维度 proj_input_dims = {k: v for k, v in self.input_dims.items()} if not self.use_mpnn: proj_input_dims.pop("mpnn", None) - self.token_projector = TokenProjector( input_dims=proj_input_dims, d_model=d_model, dropout=dropout, ) - # ============ Cross Modal Attention ============ - n_tokens = 8 if self.use_mpnn else 7 - split_idx = 4 if self.use_mpnn else 3 # Channel A 的 token 数量 + # token 顺序与化学侧 token 数 + self.chem_keys = CHEM_KEYS_WITH_MPNN if self.use_mpnn else CHEM_KEYS_NO_MPNN + self.tab_keys = TAB_KEYS + self.token_order = self.chem_keys + self.tab_keys + self.split_idx = len(self.chem_keys) - self.cross_attention = CrossModalAttention( + # ============ Set Transformer ============ + self.set_transformer = SetTransformer( d_model=d_model, num_heads=num_heads, n_layers=n_attn_layers, - split_idx=split_idx, dropout=dropout, + block=set_transformer_block, ) # ============ MoE Block (可选) ============ @@ -119,24 +147,35 @@ class LNPModel(nn.Module): if use_moe: self.moe = MoEBlock( d_model=d_model, - n_chem_tokens=split_idx, + n_chem_tokens=self.split_idx, n_experts=moe_n_experts, top_k=moe_top_k, expert_hidden_mult=moe_expert_hidden_mult, dropout=dropout, jitter_noise=moe_jitter_noise, ) - n_fusion_tokens = n_tokens + 1 # 多一个 F_moe token else: self.moe = None - n_fusion_tokens = n_tokens - # ============ Fusion Layer ============ - self.fusion = FusionLayer( - d_model=d_model, - n_tokens=n_fusion_tokens, - strategy=fusion_strategy, - ) + # ============ LLM Prompt (可选) ============ + self.use_llm = use_llm + if use_llm: + self.llm_prompt = LLMPromptEncoder( + d_model=d_model, + n_chem_tokens=self.split_idx, + n_cond_tokens=len(self.tab_keys), + model_name_or_path=llm_model_path, + freeze=llm_freeze, + use_lora=llm_use_lora, + lora_r=llm_lora_r, + lora_alpha=llm_lora_alpha, + lora_dropout=llm_lora_dropout, + ) + else: + self.llm_prompt = None + + # ============ Residual Concat + Fusion ============ + self.fusion = ResidualConcatFusion(d_model=d_model, strategy=fusion_strategy) # ============ Multi-Task Head ============ self.head = MultiTaskHead( @@ -151,70 +190,51 @@ class LNPModel(nn.Module): tabular: Dict[str, torch.Tensor], ) -> torch.Tensor: """ - 内部方法:编码 SMILES 和 tabular,返回 stacked tokens。 - + 编码 SMILES 和 tabular,返回 stacked tokens。 + Returns: - stacked: [B, n_tokens, d_model] + stacked: [B, n_tokens, d_model],顺序为 chem 在前、tab 在后 """ - # 获取目标设备(从 tabular 数据推断) device = tabular["comp"].device - - # 1. Encode SMILES - rdkit_features = self.rdkit_encoder(smiles) # {"morgan", "maccs", "desc"} - # 2. 合并所有特征 + rdkit_features = self.rdkit_encoder(smiles) + all_features: Dict[str, torch.Tensor] = {} - - # MPNN 特征(如果启用) if self.use_mpnn: mpnn_features = self.mpnn_encoder(smiles) all_features["mpnn"] = mpnn_features["mpnn"].to(device) - - # RDKit 特征(移到正确设备) all_features["morgan"] = rdkit_features["morgan"].to(device) all_features["maccs"] = rdkit_features["maccs"].to(device) all_features["desc"] = rdkit_features["desc"].to(device) - - # Tabular 特征(已在正确设备上) all_features["comp"] = tabular["comp"] all_features["phys"] = tabular["phys"] all_features["help"] = tabular["help"] all_features["exp"] = tabular["exp"] - # 3. Token Projector: 统一维度 - projected = self.token_projector(all_features) # Dict[str, [B, d_model]] - - # 4. Stack tokens: [B, n_tokens, d_model] - if self.use_mpnn: - token_order = ["mpnn", "morgan", "maccs", "desc", "comp", "phys", "help", "exp"] - else: - token_order = ["morgan", "maccs", "desc", "comp", "phys", "help", "exp"] - - stacked = torch.stack([projected[k] for k in token_order], dim=1) + projected = self.token_projector(all_features) + stacked = torch.stack([projected[k] for k in self.token_order], dim=1) return stacked - def _attended_with_moe(self, stacked: torch.Tensor) -> torch.Tensor: - """ - Cross-attention + 可选 MoE 旁路 → fusion 输入序列。 + def _backbone_from_stacked( + self, stacked: torch.Tensor, smiles: Optional[List[str]] = None + ) -> torch.Tensor: + chem = stacked[:, : self.split_idx, :] + tab = stacked[:, self.split_idx :, :] - - 不启用 MoE 时:返回 [B, n_tokens, d],与原行为一致。 - - 启用 MoE 时:在最后追加一个 F_moe token,返回 [B, n_tokens + 1, d]。 + chem = self.set_transformer(chem) # chem' - 副作用: - 把本次 forward 的 MoE 副产物(aux loss / gates / probs)写到 - self._last_moe_extras,trainer 端通过 get_last_moe_extras() 读取。 - """ - attended = self.cross_attention(stacked) + f_moe = None if self.moe is not None: - split = self.cross_attention.split_idx - chem_prime = attended[:, :split, :] - tab_prime = attended[:, split:, :] - F_moe, extras = self.moe(chem_prime, tab_prime) + f_moe, extras = self.moe(chem, tab) self._last_moe_extras = extras - attended = torch.cat([attended, F_moe.unsqueeze(1)], dim=1) else: self._last_moe_extras = None - return attended + + f_llm = None + if self.llm_prompt is not None and smiles is not None: + f_llm = self.llm_prompt(smiles) + + return self.fusion(chem, tab, f_moe=f_moe, f_llm=f_llm) def forward_from_projected( self, @@ -225,15 +245,13 @@ class LNPModel(nn.Module): 从已投影的 stacked tokens 开始 forward,用于 Captum 归因。 Args: - stacked: [B, n_tokens, d_model] TokenProjector 输出后 stack 的张量。 - task: 指定单任务名 ("size", "pdi", "ee", "delivery", "biodist", "toxic")。 - 若为 None,返回 delivery head 的标量输出。 + stacked: [B, n_tokens, d_model] + task: 单任务名;None 时返回 delivery head 输出。 Returns: - [B, 1] 或 [B, num_classes] 对应任务的预测输出。 + 对应任务的预测输出。 """ - attended = self._attended_with_moe(stacked) - fused = self.fusion(attended) + fused = self._backbone_from_stacked(stacked) if task is None: task = "delivery" @@ -259,19 +277,10 @@ class LNPModel(nn.Module): 用原始特征替换 base_projected 中指定 token 的投影,然后 forward。 用于对单个 token 内部特征做 Captum 归因(如 desc 的 210 维)。 - - Args: - raw_feature: [B, input_dim] 某个 token 的原始特征 - feature_key: token 名称,如 "desc" - base_projected: [B, n_tokens, d_model] 其他 token 已投影好的张量 - task: 任务名 - - Returns: - 对应任务的预测输出 """ projected = self.token_projector.projectors[feature_key](raw_feature) gate = torch.sigmoid(self.token_projector.weights[feature_key]) - projected = projected * gate # [B, d_model] + projected = projected * gate token_order = list(self.token_projector.keys) token_idx = token_order.index(feature_key) @@ -286,38 +295,16 @@ class LNPModel(nn.Module): smiles: List[str], tabular: Dict[str, torch.Tensor], ) -> torch.Tensor: - """ - Backbone forward:编码 -> 投影 -> 注意力 -> (可选 MoE) -> 融合,不经过任务头。 - - 用于 pretrain 阶段或需要提取特征的场景。 - - Args: - smiles: SMILES 字符串列表,长度为 B - tabular: Dict[str, Tensor] - - Returns: - fused: [B, fusion_dim] 融合后的特征向量 - """ + """Backbone forward:编码 -> 投影 -> set transformer -> (MoE/LLM) -> 融合。""" stacked = self._encode_and_project(smiles, tabular) - attended = self._attended_with_moe(stacked) - fused = self.fusion(attended) - return fused + return self._backbone_from_stacked(stacked, smiles=smiles) def forward_delivery( self, smiles: List[str], tabular: Dict[str, torch.Tensor], ) -> torch.Tensor: - """ - 仅预测 delivery(用于 pretrain)。 - - Args: - smiles: SMILES 字符串列表,长度为 B - tabular: Dict[str, Tensor] - - Returns: - delivery: [B, 1] 预测的 delivery 值 - """ + """仅预测 delivery(用于 pretrain)。返回 [B, 1]。""" fused = self.forward_backbone(smiles, tabular) return self.head.delivery_head(fused) @@ -328,53 +315,34 @@ class LNPModel(nn.Module): ) -> Dict[str, torch.Tensor]: """ 完整的多任务 forward。 - - Args: - smiles: SMILES 字符串列表,长度为 B - tabular: Dict[str, Tensor],包含: - - "comp": [B, 5] 配方比例 - - "phys": [B, 12] 物理参数 - - "help": [B, 4] Helper lipid - - "exp": [B, 32] 实验条件 Returns: - Dict[str, Tensor]: - - "size": [B, 1] - - "pdi": [B, 4] - - "ee": [B, 3] - - "delivery": [B, 1] - - "biodist": [B, 7] - - "toxic": [B, 2] + Dict[str, Tensor]: size [B,1], pdi [B,4], ee [B,3], + delivery [B,1], biodist [B,7], toxic [B,2] """ fused = self.forward_backbone(smiles, tabular) - outputs = self.head(fused) - return outputs + return self.head(fused) def clear_cache(self) -> None: """清空所有 encoder 的缓存""" self.rdkit_encoder.clear_cache() if self.mpnn_encoder is not None: self.mpnn_encoder.clear_cache() + if self.llm_prompt is not None and hasattr(self.llm_prompt, "clear_cache"): + self.llm_prompt.clear_cache() def get_last_moe_extras(self) -> Optional[Dict[str, torch.Tensor]]: - """返回最近一次 forward 中 MoE 模块的副产物(aux loss、gates、probs)。 - - 若未启用 MoE 或还未调用过 forward,返回 None。 - """ + """返回最近一次 forward 中 MoE 模块的副产物(aux loss、gates、probs)。""" return self._last_moe_extras def get_backbone_state_dict(self) -> Dict[str, torch.Tensor]: """ - 获取 backbone 部分的 state_dict(不含任务头)。 - - 包含: token_projector, cross_attention, fusion,以及(启用时)moe。 + 获取 backbone 部分的 state_dict(不含任务头,且排除冻结的 MolT5 encoder)。 """ - backbone_prefixes = ("token_projector.", "cross_attention.", "fusion.", "moe.") - backbone_keys = [ - name for name in self.state_dict().keys() - if name.startswith(backbone_prefixes) - ] - return {k: v for k, v in self.state_dict().items() if k in backbone_keys} + return { + k: v for k, v in self.state_dict().items() + if k.startswith(BACKBONE_PREFIXES) and not k.startswith(LLM_FROZEN_PREFIX) + } def get_delivery_head_state_dict(self) -> Dict[str, torch.Tensor]: """获取 delivery head 的 state_dict""" @@ -392,16 +360,11 @@ class LNPModel(nn.Module): """ 从预训练 checkpoint 加载 backbone 和(可选)delivery head 权重。 - Args: - pretrain_state_dict: 预训练模型的 state_dict - load_delivery_head: 是否加载 delivery head 权重 - strict: 是否严格匹配(默认 False,允许缺失/多余的键) + 冻结的 MolT5 encoder 权重不在加载范围内。 """ - backbone_prefixes = ("token_projector.", "cross_attention.", "fusion.", "moe.") - keys_to_load = [] for name in pretrain_state_dict.keys(): - if name.startswith(backbone_prefixes): + if name.startswith(BACKBONE_PREFIXES) and not name.startswith(LLM_FROZEN_PREFIX): keys_to_load.append(name) elif load_delivery_head and name.startswith("head.delivery_head."): keys_to_load.append(name) @@ -410,45 +373,49 @@ class LNPModel(nn.Module): k: v for k, v in pretrain_state_dict.items() if k in keys_to_load } - missing, unexpected = [], [] + unexpected = [] model_state = self.state_dict() for k, v in filtered_state_dict.items(): - if k in model_state: - if model_state[k].shape == v.shape: - model_state[k] = v - else: - unexpected.append( - f"{k} (shape mismatch: {model_state[k].shape} vs {v.shape})" - ) + if k in model_state and model_state[k].shape == v.shape: + model_state[k] = v else: unexpected.append(k) + self.load_state_dict(model_state, strict=False) - if strict and (missing or unexpected): - raise RuntimeError(f"Missing keys: {missing}, Unexpected keys: {unexpected}") + if strict and unexpected: + raise RuntimeError(f"Unexpected keys: {unexpected}") class LNPModelWithoutMPNN(LNPModel): - """不使用 MPNN 的简化版本""" + """不使用 MPNN 的简化版本(化学 token 为 3 个)""" def __init__( self, d_model: int = 256, num_heads: int = 8, n_attn_layers: int = 4, + set_transformer_block: str = "sab", fusion_strategy: PoolingStrategy = "attention", head_hidden_dim: int = 128, dropout: float = 0.1, input_dims: Optional[Dict[str, int]] = None, - # ============ MoE 相关(新增) ============ + # ============ MoE 相关 ============ use_moe: bool = False, moe_n_experts: int = 4, moe_top_k: int = 2, moe_expert_hidden_mult: int = 2, moe_jitter_noise: float = 0.0, + # ============ LLM 相关 ============ + use_llm: bool = False, + llm_model_path: str = DEFAULT_MOLT5_PATH, + llm_freeze: bool = True, + llm_use_lora: bool = False, + llm_lora_r: int = 8, + llm_lora_alpha: int = 16, + llm_lora_dropout: float = 0.05, ) -> None: - # 移除 mpnn 维度 dims = input_dims or DEFAULT_INPUT_DIMS.copy() dims.pop("mpnn", None) @@ -456,6 +423,7 @@ class LNPModelWithoutMPNN(LNPModel): d_model=d_model, num_heads=num_heads, n_attn_layers=n_attn_layers, + set_transformer_block=set_transformer_block, fusion_strategy=fusion_strategy, head_hidden_dim=head_hidden_dim, dropout=dropout, @@ -467,5 +435,11 @@ class LNPModelWithoutMPNN(LNPModel): moe_top_k=moe_top_k, moe_expert_hidden_mult=moe_expert_hidden_mult, moe_jitter_noise=moe_jitter_noise, - ) - + use_llm=use_llm, + llm_model_path=llm_model_path, + llm_freeze=llm_freeze, + llm_use_lora=llm_use_lora, + llm_lora_r=llm_lora_r, + llm_lora_alpha=llm_lora_alpha, + llm_lora_dropout=llm_lora_dropout, + ) \ No newline at end of file diff --git a/lnp_ml/modeling/nested_cv_optuna.py b/lnp_ml/modeling/nested_cv_optuna.py index 0fc546a..fb805de 100644 --- a/lnp_ml/modeling/nested_cv_optuna.py +++ b/lnp_ml/modeling/nested_cv_optuna.py @@ -1,933 +1,1021 @@ -""" -嵌套交叉验证 + Optuna 超参调优 - -外层 5-fold StratifiedKFold(20% test / 80% train) -内层 3-fold StratifiedKFold(在 80% 上做 Optuna 超参搜索) - -使用方法: - python -m lnp_ml.modeling.nested_cv_optuna - -或通过 Makefile: - make nested_cv_tune DEVICE=cuda -""" - -import json -import math -from datetime import datetime -from pathlib import Path -from typing import Dict, List, Optional, Tuple, Union - -import numpy as np -import pandas as pd -import torch -from torch.utils.data import DataLoader, Subset -from sklearn.model_selection import StratifiedKFold -from loguru import logger -import typer - -try: - import optuna - from optuna.samplers import TPESampler -except ImportError: - optuna = None - TPESampler = None - -from lnp_ml.config import MODELS_DIR, INTERIM_DATA_DIR -from lnp_ml.dataset import ( - LNPDataset, - collate_fn, - process_dataframe, - TARGET_CLASSIFICATION_PDI, - TARGET_CLASSIFICATION_EE, - TARGET_TOXIC, -) -from tqdm import tqdm - -from lnp_ml.modeling.models import LNPModel, LNPModelWithoutMPNN -from lnp_ml.modeling.encoders.rdkit_encoder import CachedRDKitEncoder -from lnp_ml.modeling.trainer_balanced import ( - ClassWeights, - LossWeightsBalanced, - compute_class_weights_from_loader, - train_with_early_stopping, - train_fixed_epochs, - validate_balanced, -) - -# MPNN ensemble 默认路径 -DEFAULT_MPNN_ENSEMBLE_DIR = MODELS_DIR / "mpnn" / "all_amine_split_for_LiON" - -app = typer.Typer() - - -# ============ CompositeStrata 复合分层标签 ============ - -def build_composite_strata( - df: pd.DataFrame, - min_stratum_count: int = 5, -) -> Tuple[np.ndarray, Dict]: - """ - 构建复合分层标签(toxic × PDI × EE)。 - - Args: - df: 处理后的 DataFrame - min_stratum_count: 每个 stratum 最少样本数,低于此值合并为 RARE - - Returns: - (strata_array, strata_info) - - strata_array: 每个样本的 stratum 编码(整数) - - strata_info: 统计信息 - """ - n = len(df) - strata_labels = [] - - for i in range(n): - # Toxic stratum - if TARGET_TOXIC in df.columns: - toxic_val = df[TARGET_TOXIC].iloc[i] - if pd.notna(toxic_val) and toxic_val >= 0: - toxic_str = str(int(toxic_val)) - else: - toxic_str = "NA" - else: - toxic_str = "NA" - - # PDI stratum - if all(col in df.columns for col in TARGET_CLASSIFICATION_PDI): - pdi_vals = df[TARGET_CLASSIFICATION_PDI].iloc[i].values - if pdi_vals.sum() > 0: - pdi_str = str(int(np.argmax(pdi_vals))) - else: - pdi_str = "NA" - else: - pdi_str = "NA" - - # EE stratum - if all(col in df.columns for col in TARGET_CLASSIFICATION_EE): - ee_vals = df[TARGET_CLASSIFICATION_EE].iloc[i].values - if ee_vals.sum() > 0: - ee_str = str(int(np.argmax(ee_vals))) - else: - ee_str = "NA" - else: - ee_str = "NA" - - strata_labels.append(f"T{toxic_str}|P{pdi_str}|E{ee_str}") - - # 统计各 stratum 的样本数 - unique_strata, counts = np.unique(strata_labels, return_counts=True) - strata_counts = dict(zip(unique_strata, counts)) - - # 将稀疏 strata 合并为 RARE - rare_strata = [s for s, c in strata_counts.items() if c < min_stratum_count] - - final_labels = [] - for label in strata_labels: - if label in rare_strata: - final_labels.append("RARE") - else: - final_labels.append(label) - - # 编码为整数 - unique_final, encoded = np.unique(final_labels, return_inverse=True) - - strata_info = { - "original_strata_counts": strata_counts, - "rare_strata": rare_strata, - "final_strata": list(unique_final), - "final_strata_counts": dict(zip(*np.unique(final_labels, return_counts=True))), - "n_rare_merged": sum(strata_counts[s] for s in rare_strata) if rare_strata else 0, - } - - logger.info(f"Built composite strata: {len(unique_final)} unique strata") - logger.info(f" Rare strata merged: {len(rare_strata)} types, {strata_info['n_rare_merged']} samples") - - return encoded.astype(np.int64), strata_info - - -# ============ RDKit 缓存预热 ============ - -def warmup_rdkit_cache(smiles_list: List[str], batch_size: int = 256) -> Dict: - """预热 RDKit 特征缓存,返回可跨模型共享的缓存字典。""" - encoder = CachedRDKitEncoder() - unique_smiles = list(set(smiles_list)) - logger.info(f"Warming up RDKit cache for {len(unique_smiles)} unique SMILES...") - for i in tqdm(range(0, len(unique_smiles), batch_size), desc="Cache warmup"): - batch = unique_smiles[i:i + batch_size] - encoder(batch) - logger.success(f"Cache warmup complete. Cached {len(encoder._cache)} SMILES.") - return encoder._cache - - -# ============ 模型创建 ============ - -def find_mpnn_ensemble_paths(base_dir: Path = DEFAULT_MPNN_ENSEMBLE_DIR) -> List[str]: - """自动查找 MPNN ensemble 的 model.pt 文件。""" - model_paths = sorted(base_dir.glob("cv_*/fold_*/model_*/model.pt")) - if not model_paths: - raise FileNotFoundError(f"No model.pt files found in {base_dir}") - return [str(p) for p in model_paths] - - -def create_model( - d_model: int = 256, - num_heads: int = 8, - n_attn_layers: int = 4, - fusion_strategy: str = "attention", - head_hidden_dim: int = 128, - dropout: float = 0.1, - use_mpnn: bool = False, - mpnn_device: str = "cpu", - use_moe: bool = False, - moe_n_experts: int = 4, - moe_top_k: int = 2, - moe_expert_hidden_mult: int = 2, - moe_jitter_noise: float = 0.0, -) -> Union[LNPModel, LNPModelWithoutMPNN]: - """创建模型""" - moe_kwargs = dict( - use_moe=use_moe, - moe_n_experts=moe_n_experts, - moe_top_k=moe_top_k, - moe_expert_hidden_mult=moe_expert_hidden_mult, - moe_jitter_noise=moe_jitter_noise, - ) - - if use_mpnn: - ensemble_paths = find_mpnn_ensemble_paths() - return LNPModel( - d_model=d_model, - num_heads=num_heads, - n_attn_layers=n_attn_layers, - fusion_strategy=fusion_strategy, - head_hidden_dim=head_hidden_dim, - dropout=dropout, - mpnn_ensemble_paths=ensemble_paths, - mpnn_device=mpnn_device, - **moe_kwargs, - ) - else: - return LNPModelWithoutMPNN( - d_model=d_model, - num_heads=num_heads, - n_attn_layers=n_attn_layers, - fusion_strategy=fusion_strategy, - head_hidden_dim=head_hidden_dim, - dropout=dropout, - **moe_kwargs, - ) - - -# ============ 评估指标 ============ - -def evaluate_on_test( - model: torch.nn.Module, - test_loader: DataLoader, - device: torch.device, -) -> Dict: - """在测试集上评估模型""" - from scipy.special import rel_entr - from sklearn.metrics import ( - mean_squared_error, - mean_absolute_error, - r2_score, - accuracy_score, - precision_score, - recall_score, - f1_score, - ) - - model.eval() - - preds = { - "size": [], "delivery": [], "pdi": [], "ee": [], "toxic": [], "biodist": [] - } - targets = { - "size": [], "delivery": [], "pdi": [], "ee": [], "toxic": [], "biodist": [] - } - - with torch.no_grad(): - for batch in test_loader: - smiles = batch["smiles"] - tabular = {k: v.to(device) for k, v in batch["tabular"].items()} - tgts = batch["targets"] - masks = batch["mask"] - - outputs = model(smiles, tabular) - - # 收集预测和真实值 - for task in ["size", "delivery"]: - if task in masks and masks[task].any(): - m = masks[task] - key = task if task == "size" else "delivery" - preds[task].extend(outputs[key].squeeze(-1)[m].cpu().numpy().tolist()) - targets[task].extend(tgts[key][m].cpu().numpy().tolist()) - - for task in ["pdi", "ee", "toxic"]: - if task in masks and masks[task].any(): - m = masks[task] - preds[task].extend(outputs[task][m].argmax(dim=-1).cpu().numpy().tolist()) - targets[task].extend(tgts[task][m].cpu().numpy().tolist()) - - if "biodist" in masks and masks["biodist"].any(): - m = masks["biodist"] - preds["biodist"].extend(outputs["biodist"][m].cpu().numpy().tolist()) - targets["biodist"].extend(tgts["biodist"][m].cpu().numpy().tolist()) - - # 计算指标 - results = {} - - # 回归任务 - for task in ["size", "delivery"]: - if preds[task]: - p = np.array(preds[task]) - t = np.array(targets[task]) - results[task] = { - "n_samples": len(p), - "mse": float(mean_squared_error(t, p)), - "rmse": float(np.sqrt(mean_squared_error(t, p))), - "mae": float(mean_absolute_error(t, p)), - "r2": float(r2_score(t, p)), - } - - # 分类任务 - for task in ["pdi", "ee", "toxic"]: - if preds[task]: - p = np.array(preds[task]) - t = np.array(targets[task]) - results[task] = { - "n_samples": len(p), - "accuracy": float(accuracy_score(t, p)), - "precision": float(precision_score(t, p, average="macro", zero_division=0)), - "recall": float(recall_score(t, p, average="macro", zero_division=0)), - "f1": float(f1_score(t, p, average="macro", zero_division=0)), - } - - # 分布任务 - if preds["biodist"]: - p = np.array(preds["biodist"]) - t = np.array(targets["biodist"]) - - def kl_divergence(p_arr, q_arr, eps=1e-10): - p_arr = np.clip(p_arr, eps, 1.0) - q_arr = np.clip(q_arr, eps, 1.0) - return float(np.sum(rel_entr(p_arr, q_arr), axis=-1).mean()) - - def js_divergence(p_arr, q_arr, eps=1e-10): - p_arr = np.clip(p_arr, eps, 1.0) - q_arr = np.clip(q_arr, eps, 1.0) - m = 0.5 * (p_arr + q_arr) - return float(0.5 * (np.sum(rel_entr(p_arr, m), axis=-1) + np.sum(rel_entr(q_arr, m), axis=-1)).mean()) - - results["biodist"] = { - "n_samples": len(p), - "kl_divergence": kl_divergence(t, p), - "js_divergence": js_divergence(t, p), - } - - return results - - -# ============ 预训练权重加载 ============ - -def load_pretrain_weights_to_model( - model: Union[LNPModel, LNPModelWithoutMPNN], - pretrain_state_dict: Dict, - d_model: int, - pretrain_config: Dict, - load_delivery_head: bool = True, -) -> bool: - """ - 加载预训练权重到模型。 - - Returns: - 是否成功加载 - """ - if pretrain_config.get("d_model") != d_model: - logger.warning( - f"d_model mismatch: pretrain={pretrain_config.get('d_model')}, " - f"current={d_model}. Skipping pretrain loading." - ) - return False - - model.load_pretrain_weights( - pretrain_state_dict=pretrain_state_dict, - load_delivery_head=load_delivery_head, - strict=False, - ) - return True - - -# ============ 内层 Optuna 调参 ============ -def run_inner_optuna( - full_dataset: LNPDataset, - inner_train_indices: np.ndarray, - strata: np.ndarray, - device: torch.device, - n_trials: int = 20, - epochs_per_trial: int = 30, - patience: int = 10, - batch_size: int = 32, - n_inner_folds: int = 3, - use_mpnn: bool = False, - seed: int = 42, - study_path: Optional[Path] = None, - pretrain_state_dict: Optional[Dict] = None, - pretrain_config: Optional[Dict] = None, - load_delivery_head: bool = True, - rdkit_cache: Optional[Dict] = None, - use_moe: bool = False, - moe_n_experts: int = 4, - moe_top_k: int = 2, - moe_expert_hidden_mult: int = 2, - moe_jitter_noise: float = 0.0, -) -> Tuple[Dict, int, optuna.Study]: - """ - 在内层数据上运行 Optuna 超参搜索。 - - Args: - full_dataset: 完整数据集 - inner_train_indices: 内层训练数据的索引(相对于 full_dataset) - strata: 每个样本的分层标签 - device: 设备 - n_trials: Optuna 试验数 - epochs_per_trial: 每个试验的最大 epoch - patience: 早停耐心值 - batch_size: 批次大小 - n_inner_folds: 内层折数 - use_mpnn: 是否使用 MPNN - seed: 随机种子 - study_path: 可选的 study 持久化路径 - pretrain_state_dict: 预训练权重 - pretrain_config: 预训练配置 - load_delivery_head: 是否加载 delivery head 权重 - - Returns: - (best_params, epoch_mean, study) - """ - if optuna is None: - raise ImportError("Optuna not installed. Run: pip install optuna") - - inner_strata = strata[inner_train_indices] - - # 固定架构参数(与预训练一致,确保权重完整加载) - _cfg = pretrain_config or {} - fixed_d_model = _cfg.get("d_model", 256) - fixed_num_heads = _cfg.get("num_heads", 8) - fixed_n_attn_layers = _cfg.get("n_attn_layers", 4) - fixed_fusion_strategy = _cfg.get("fusion_strategy", "attention") - fixed_head_hidden_dim = _cfg.get("head_hidden_dim", 128) - logger.info( - f"Fixed architecture params: d_model={fixed_d_model}, num_heads={fixed_num_heads}, " - f"n_attn_layers={fixed_n_attn_layers}, fusion={fixed_fusion_strategy}, " - f"head_hidden_dim={fixed_head_hidden_dim}" - ) - - def objective(trial: optuna.Trial) -> float: - d_model = fixed_d_model - num_heads = fixed_num_heads - n_attn_layers = fixed_n_attn_layers - fusion_strategy = fixed_fusion_strategy - head_hidden_dim = fixed_head_hidden_dim - - # 搜索训练超参数 - dropout = trial.suggest_float("dropout", 0.1, 0.5) - lr = trial.suggest_float("lr", 1e-5, 1e-3, log=True) - weight_decay = trial.suggest_float("weight_decay", 1e-5, 1e-1, log=True) - backbone_lr_ratio = trial.suggest_float("backbone_lr_ratio", 0.01, 1.0, log=True) - - # 内层 3-fold CV - inner_cv = StratifiedKFold( - n_splits=n_inner_folds, shuffle=True, random_state=seed - ) - - fold_val_losses = [] - fold_best_epochs = [] - - for inner_fold, (inner_train_idx, inner_val_idx) in enumerate( - inner_cv.split(inner_train_indices, inner_strata) - ): - # 获取实际的数据集索引 - actual_train_idx = inner_train_indices[inner_train_idx] - actual_val_idx = inner_train_indices[inner_val_idx] - - # 创建 DataLoader - train_subset = Subset(full_dataset, actual_train_idx.tolist()) - val_subset = Subset(full_dataset, actual_val_idx.tolist()) - - train_loader = DataLoader( - train_subset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn - ) - val_loader = DataLoader( - val_subset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn - ) - - # 计算类权重 - class_weights = compute_class_weights_from_loader(train_loader) - - # 创建模型 - model = create_model( - d_model=d_model, - num_heads=num_heads, - n_attn_layers=n_attn_layers, - fusion_strategy=fusion_strategy, - head_hidden_dim=head_hidden_dim, - dropout=dropout, - use_mpnn=use_mpnn, - mpnn_device=device.type, - use_moe=use_moe, - moe_n_experts=moe_n_experts, - moe_top_k=moe_top_k, - moe_expert_hidden_mult=moe_expert_hidden_mult, - moe_jitter_noise=moe_jitter_noise, - ) - if rdkit_cache is not None: - model.rdkit_encoder._cache = rdkit_cache - - # 加载预训练权重 - if pretrain_state_dict is not None and pretrain_config is not None: - load_pretrain_weights_to_model( - model, pretrain_state_dict, d_model, pretrain_config, load_delivery_head - ) - - # 训练(带早停) - result = train_with_early_stopping( - model=model, - train_loader=train_loader, - val_loader=val_loader, - device=device, - lr=lr, - weight_decay=weight_decay, - epochs=epochs_per_trial, - patience=patience, - class_weights=class_weights, - backbone_lr_ratio=backbone_lr_ratio, - ) - - fold_val_losses.append(result["best_val_loss"]) - fold_best_epochs.append(result["best_epoch"]) - - # 记录 epoch_mean 到 trial - epoch_mean = int(round(np.mean(fold_best_epochs))) - trial.set_user_attr("epoch_mean", epoch_mean) - trial.set_user_attr("fold_best_epochs", fold_best_epochs) - - return np.mean(fold_val_losses) - - # 创建 study - storage = None - if study_path is not None: - storage = f"sqlite:///{study_path}" - - study = optuna.create_study( - direction="minimize", - sampler=TPESampler(seed=seed), - storage=storage, - study_name="inner_optuna", - load_if_exists=True, - ) - - study.optimize(objective, n_trials=n_trials, show_progress_bar=True) - - best_params = dict(study.best_trial.params) - best_params.update({ - "d_model": fixed_d_model, - "num_heads": fixed_num_heads, - "n_attn_layers": fixed_n_attn_layers, - "fusion_strategy": fixed_fusion_strategy, - "head_hidden_dim": fixed_head_hidden_dim, - }) - epoch_mean = study.best_trial.user_attrs.get("epoch_mean", epochs_per_trial) - - logger.info(f"Best trial: {study.best_trial.number}") - logger.info(f"Best val_loss: {study.best_trial.value:.4f}") - logger.info(f"Best params: {best_params}") - logger.info(f"Epoch mean: {epoch_mean}") - - return best_params, epoch_mean, study - - -# ============ 单 fold 执行(可跨进程调用) ============ -def _run_single_outer_fold( - outer_fold: int, - outer_train_idx: np.ndarray, - outer_test_idx: np.ndarray, - df: pd.DataFrame, - strata: np.ndarray, - fold_dir: Path, - n_trials: int, - epochs_per_trial: int, - inner_patience: int, - batch_size: int, - n_inner_folds: int, - use_mpnn: bool, - seed: int, - pretrain_state_dict: Optional[Dict], - pretrain_config: Optional[Dict], - load_delivery_head: bool, - device_str: str, - use_moe: bool = False, - moe_n_experts: int = 4, - moe_top_k: int = 2, - moe_expert_hidden_mult: int = 2, - moe_jitter_noise: float = 0.0, -) -> Dict: - """ - 执行单个外层 fold 的完整流程(内层调参 + 外层训练 + 评估)。 - - 所有参数均为可序列化类型,以支持 spawn 多进程。 - """ - device = torch.device(device_str) - fold_dir = Path(fold_dir) - fold_dir.mkdir(parents=True, exist_ok=True) - - full_dataset = LNPDataset(df) - - logger.info(f"\n{'='*60}") - logger.info(f"OUTER FOLD {outer_fold}") - logger.info(f"{'='*60}") - logger.info(f"Train: {len(outer_train_idx)}, Test: {len(outer_test_idx)}") - - # 预热 RDKit 缓存(在整个 fold 内共享) - rdkit_cache = warmup_rdkit_cache(full_dataset.smiles) - - # 保存 split indices - with open(fold_dir / "splits.json", "w") as f: - json.dump({ - "outer_train_idx": outer_train_idx.tolist(), - "outer_test_idx": outer_test_idx.tolist(), - }, f) - - # 内层 Optuna 调参 - logger.info(f"\nRunning inner Optuna with {n_trials} trials...") - study_path = fold_dir / "optuna_study.sqlite3" - - best_params, epoch_mean, study = run_inner_optuna( - full_dataset=full_dataset, - inner_train_indices=outer_train_idx, - strata=strata, - device=device, - n_trials=n_trials, - epochs_per_trial=epochs_per_trial, - patience=inner_patience, - batch_size=batch_size, - n_inner_folds=n_inner_folds, - use_mpnn=use_mpnn, - seed=seed + outer_fold, - study_path=study_path, - pretrain_state_dict=pretrain_state_dict, - pretrain_config=pretrain_config, - load_delivery_head=load_delivery_head, - rdkit_cache=rdkit_cache, - use_moe=use_moe, - moe_n_experts=moe_n_experts, - moe_top_k=moe_top_k, - moe_expert_hidden_mult=moe_expert_hidden_mult, - moe_jitter_noise=moe_jitter_noise, - ) - - # 保存最佳参数 - with open(fold_dir / "best_params.json", "w") as f: - json.dump(best_params, f, indent=2) - - with open(fold_dir / "epoch_mean.json", "w") as f: - json.dump({"epoch_mean": epoch_mean}, f) - - # 外层训练(使用最优超参,固定 epoch 数,不 early-stop) - logger.info(f"\nTraining outer fold with best params, epochs={epoch_mean}...") - - train_subset = Subset(full_dataset, outer_train_idx.tolist()) - test_subset = Subset(full_dataset, outer_test_idx.tolist()) - - train_loader = DataLoader( - train_subset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn - ) - test_loader = DataLoader( - test_subset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn - ) - - class_weights = compute_class_weights_from_loader(train_loader) - - model = create_model( - d_model=best_params["d_model"], - num_heads=best_params["num_heads"], - n_attn_layers=best_params["n_attn_layers"], - fusion_strategy=best_params["fusion_strategy"], - head_hidden_dim=best_params["head_hidden_dim"], - dropout=best_params["dropout"], - use_mpnn=use_mpnn, - mpnn_device=device.type, - use_moe=use_moe, - moe_n_experts=moe_n_experts, - moe_top_k=moe_top_k, - moe_expert_hidden_mult=moe_expert_hidden_mult, - moe_jitter_noise=moe_jitter_noise, - ) - model.rdkit_encoder._cache = rdkit_cache - - if pretrain_state_dict is not None and pretrain_config is not None: - loaded = load_pretrain_weights_to_model( - model, pretrain_state_dict, best_params["d_model"], - pretrain_config, load_delivery_head - ) - if loaded: - logger.info(f"Loaded pretrain weights for outer fold {outer_fold}") - - train_result = train_fixed_epochs( - model=model, - train_loader=train_loader, - val_loader=None, - device=device, - lr=best_params["lr"], - weight_decay=best_params["weight_decay"], - epochs=epoch_mean, - class_weights=class_weights, - use_cosine_annealing=True, - backbone_lr_ratio=best_params.get("backbone_lr_ratio", 1.0), - ) - - model.load_state_dict(train_result["final_state"]) - model = model.to(device) - - config = { - "d_model": best_params["d_model"], - "num_heads": best_params["num_heads"], - "n_attn_layers": best_params["n_attn_layers"], - "fusion_strategy": best_params["fusion_strategy"], - "head_hidden_dim": best_params["head_hidden_dim"], - "dropout": best_params["dropout"], - "use_mpnn": use_mpnn, - "use_moe": use_moe, - "moe_n_experts": moe_n_experts, - "moe_top_k": moe_top_k, - "moe_expert_hidden_mult": moe_expert_hidden_mult, - "moe_jitter_noise": moe_jitter_noise, - } - - torch.save({ - "model_state_dict": train_result["final_state"], - "config": config, - "epoch_mean": epoch_mean, - "best_params": best_params, - }, fold_dir / "model.pt") - - with open(fold_dir / "history.json", "w") as f: - json.dump(train_result["history"], f, indent=2) - - # 在测试集上评估 - logger.info("Evaluating on outer test set...") - test_metrics = evaluate_on_test(model, test_loader, device) - - with open(fold_dir / "test_metrics.json", "w") as f: - json.dump(test_metrics, f, indent=2) - - logger.info(f"\nOuter Fold {outer_fold} Test Results:") - for task, metrics in test_metrics.items(): - if "rmse" in metrics: - logger.info(f" {task}: RMSE={metrics['rmse']:.4f}, R²={metrics['r2']:.4f}") - elif "accuracy" in metrics: - logger.info(f" {task}: Acc={metrics['accuracy']:.4f}, F1={metrics['f1']:.4f}") - elif "kl_divergence" in metrics: - logger.info(f" {task}: KL={metrics['kl_divergence']:.4f}, JS={metrics['js_divergence']:.4f}") - - return { - "fold": outer_fold, - "best_params": best_params, - "epoch_mean": epoch_mean, - "test_metrics": test_metrics, - } - - -# ============ 主流程 ============ -@app.command() -def main( - input_path: Path = INTERIM_DATA_DIR / "internal.csv", - output_dir: Path = MODELS_DIR / "nested_cv", - # CV 参数 - n_outer_folds: int = 5, - n_inner_folds: int = 3, - min_stratum_count: int = 5, - seed: int = 42, - # Optuna 参数 - n_trials: int = 20, - epochs_per_trial: int = 30, - inner_patience: int = 10, - # 训练参数 - batch_size: int = 32, - # 预训练权重 - init_from_pretrain: Optional[Path] = None, - load_delivery_head: bool = False, - # MPNN - use_mpnn: bool = False, - # MoE(新增) - use_moe: bool = False, - moe_n_experts: int = 4, - moe_top_k: int = 2, - moe_expert_hidden_mult: int = 2, - moe_jitter_noise: float = 0.0, - # 并行 - parallel: bool = False, - # 设备 - device: str = "cuda" if torch.cuda.is_available() else "cpu", -): - """ - 嵌套交叉验证 + Optuna 超参调优。 - - 外层 5-fold(20% test / 80% train),内层 3-fold Optuna 调参。 - 外层训练不使用 early-stopping,epoch 数使用内层 best trial 的 epoch_mean。 - - 使用 --init-from-pretrain 从预训练 checkpoint 初始化模型权重。 - 使用 --parallel 同时运行所有外层 fold(需要足够 GPU 显存)。 - """ - if optuna is None: - logger.error("Optuna not installed. Run: pip install optuna") - raise typer.Exit(1) - - logger.info(f"Using device: {device}") - device = torch.device(device) - - # 加载预训练权重(如果指定) - pretrain_state_dict = None - pretrain_config = None - if init_from_pretrain is not None: - if init_from_pretrain.exists(): - logger.info(f"Loading pretrain weights from {init_from_pretrain}") - checkpoint = torch.load(init_from_pretrain, map_location="cpu", weights_only=False) - pretrain_state_dict = checkpoint["model_state_dict"] - pretrain_config = checkpoint.get("config", {}) - logger.success(f"Loaded pretrain checkpoint (d_model={pretrain_config.get('d_model')})") - else: - logger.warning(f"Pretrain checkpoint not found: {init_from_pretrain}, skipping") - - # 创建输出目录(带时间戳) - run_name = datetime.now().strftime("%Y%m%d_%H%M%S") - run_dir = output_dir / run_name - run_dir.mkdir(parents=True, exist_ok=True) - logger.info(f"Output directory: {run_dir}") - - # 加载数据 - logger.info(f"Loading data from {input_path}") - df = pd.read_csv(input_path) - logger.info(f"Loaded {len(df)} samples") - - # 处理数据 - logger.info("Processing dataframe...") - df = process_dataframe(df) - - # 构建复合分层标签 - logger.info("Building composite strata...") - strata, strata_info = build_composite_strata(df, min_stratum_count) - - # 保存 strata 信息 - with open(run_dir / "strata_info.json", "w") as f: - json.dump(strata_info, f, indent=2, default=str) - - # 创建完整数据集(仅用于获取样本数做 split) - n_samples = len(LNPDataset(df)) - - # 外层 CV split - outer_cv = StratifiedKFold( - n_splits=n_outer_folds, shuffle=True, random_state=seed - ) - - device_str = str(device) - fold_args = [] - for outer_fold, (outer_train_idx, outer_test_idx) in enumerate( - outer_cv.split(np.arange(n_samples), strata) - ): - fold_args.append(dict( - outer_fold=outer_fold, - outer_train_idx=outer_train_idx, - outer_test_idx=outer_test_idx, - df=df, - strata=strata, - fold_dir=run_dir / f"outer_fold_{outer_fold}", - n_trials=n_trials, - epochs_per_trial=epochs_per_trial, - inner_patience=inner_patience, - batch_size=batch_size, - n_inner_folds=n_inner_folds, - use_mpnn=use_mpnn, - seed=seed, - pretrain_state_dict=pretrain_state_dict, - pretrain_config=pretrain_config, - load_delivery_head=load_delivery_head, - device_str=device_str, - use_moe=use_moe, - moe_n_experts=moe_n_experts, - moe_top_k=moe_top_k, - moe_expert_hidden_mult=moe_expert_hidden_mult, - moe_jitter_noise=moe_jitter_noise, - )) - - if parallel: - import multiprocessing as mp - from concurrent.futures import ProcessPoolExecutor - - ctx = mp.get_context("spawn") - logger.info(f"Running {n_outer_folds} outer folds in PARALLEL (spawn)") - with ProcessPoolExecutor(max_workers=n_outer_folds, mp_context=ctx) as executor: - futures = [executor.submit(_run_single_outer_fold, **args) for args in fold_args] - outer_results = [f.result() for f in futures] - outer_results.sort(key=lambda r: r["fold"]) - else: - logger.info(f"Running {n_outer_folds} outer folds SEQUENTIALLY") - outer_results = [] - for args in fold_args: - result = _run_single_outer_fold(**args) - outer_results.append(result) - - # 汇总结果 - logger.info("\n" + "=" * 60) - logger.info("NESTED CV COMPLETE") - logger.info("=" * 60) - - # 计算汇总统计 - summary = {"fold_results": outer_results} - - # 对每个任务计算均值和标准差 - tasks_with_metrics = {} - for result in outer_results: - for task, metrics in result["test_metrics"].items(): - if task not in tasks_with_metrics: - tasks_with_metrics[task] = {k: [] for k in metrics.keys() if k != "n_samples"} - for k, v in metrics.items(): - if k != "n_samples": - tasks_with_metrics[task][k].append(v) - - summary["summary_stats"] = {} - for task, metrics_dict in tasks_with_metrics.items(): - summary["summary_stats"][task] = {} - for metric_name, values in metrics_dict.items(): - summary["summary_stats"][task][f"{metric_name}_mean"] = float(np.mean(values)) - summary["summary_stats"][task][f"{metric_name}_std"] = float(np.std(values)) - - # 打印汇总 - logger.info("\n[Summary Statistics]") - for task, stats in summary["summary_stats"].items(): - if "rmse_mean" in stats: - logger.info( - f" {task}: RMSE={stats['rmse_mean']:.4f}±{stats['rmse_std']:.4f}, " - f"R²={stats['r2_mean']:.4f}±{stats['r2_std']:.4f}" - ) - elif "accuracy_mean" in stats: - logger.info( - f" {task}: Acc={stats['accuracy_mean']:.4f}±{stats['accuracy_std']:.4f}, " - f"F1={stats['f1_mean']:.4f}±{stats['f1_std']:.4f}" - ) - elif "kl_divergence_mean" in stats: - logger.info( - f" {task}: KL={stats['kl_divergence_mean']:.4f}±{stats['kl_divergence_std']:.4f}, " - f"JS={stats['js_divergence_mean']:.4f}±{stats['js_divergence_std']:.4f}" - ) - - # 保存汇总 - with open(run_dir / "summary.json", "w") as f: - json.dump(summary, f, indent=2) - - logger.success(f"\nAll results saved to {run_dir}") - - -if __name__ == "__main__": - app() - +""" +嵌套交叉验证 + Optuna 超参调优 + +外层 5-fold StratifiedKFold(20% test / 80% train) +内层 3-fold StratifiedKFold(在 80% 上做 Optuna 超参搜索) + +使用方法: + python -m lnp_ml.modeling.nested_cv_optuna + +或通过 Makefile: + make nested_cv_tune DEVICE=cuda +""" + +import json +import math +from datetime import datetime +from pathlib import Path +from typing import Dict, List, Optional, Tuple, Union + +import numpy as np +import pandas as pd +import torch +from torch.utils.data import DataLoader, Subset +from sklearn.model_selection import StratifiedKFold +from loguru import logger +import typer + +try: + import optuna + from optuna.samplers import TPESampler +except ImportError: + optuna = None + TPESampler = None + +from lnp_ml.config import MODELS_DIR, INTERIM_DATA_DIR +from lnp_ml.dataset import ( + LNPDataset, + collate_fn, + process_dataframe, + TARGET_CLASSIFICATION_PDI, + TARGET_CLASSIFICATION_EE, + TARGET_TOXIC, +) +from tqdm import tqdm + +from lnp_ml.modeling.models import LNPModel, LNPModelWithoutMPNN +from lnp_ml.modeling.layers.llm_prompt import DEFAULT_MOLT5_PATH +from lnp_ml.utils.seed import set_global_seed +from lnp_ml.modeling.encoders.rdkit_encoder import CachedRDKitEncoder +from lnp_ml.modeling.trainer_balanced import ( + ClassWeights, + LossWeightsBalanced, + compute_class_weights_from_loader, + train_with_early_stopping, + train_fixed_epochs, + validate_balanced, +) + +# MPNN ensemble 默认路径 +DEFAULT_MPNN_ENSEMBLE_DIR = MODELS_DIR / "mpnn" / "all_amine_split_for_LiON" + +app = typer.Typer() + + +# ============ CompositeStrata 复合分层标签 ============ + +def build_composite_strata( + df: pd.DataFrame, + min_stratum_count: int = 5, +) -> Tuple[np.ndarray, Dict]: + """ + 构建复合分层标签(toxic × PDI × EE)。 + + Args: + df: 处理后的 DataFrame + min_stratum_count: 每个 stratum 最少样本数,低于此值合并为 RARE + + Returns: + (strata_array, strata_info) + - strata_array: 每个样本的 stratum 编码(整数) + - strata_info: 统计信息 + """ + n = len(df) + strata_labels = [] + + for i in range(n): + # Toxic stratum + if TARGET_TOXIC in df.columns: + toxic_val = df[TARGET_TOXIC].iloc[i] + if pd.notna(toxic_val) and toxic_val >= 0: + toxic_str = str(int(toxic_val)) + else: + toxic_str = "NA" + else: + toxic_str = "NA" + + # PDI stratum + if all(col in df.columns for col in TARGET_CLASSIFICATION_PDI): + pdi_vals = df[TARGET_CLASSIFICATION_PDI].iloc[i].values + if pdi_vals.sum() > 0: + pdi_str = str(int(np.argmax(pdi_vals))) + else: + pdi_str = "NA" + else: + pdi_str = "NA" + + # EE stratum + if all(col in df.columns for col in TARGET_CLASSIFICATION_EE): + ee_vals = df[TARGET_CLASSIFICATION_EE].iloc[i].values + if ee_vals.sum() > 0: + ee_str = str(int(np.argmax(ee_vals))) + else: + ee_str = "NA" + else: + ee_str = "NA" + + strata_labels.append(f"T{toxic_str}|P{pdi_str}|E{ee_str}") + + # 统计各 stratum 的样本数 + unique_strata, counts = np.unique(strata_labels, return_counts=True) + strata_counts = dict(zip(unique_strata, counts)) + + # 将稀疏 strata 合并为 RARE + rare_strata = [s for s, c in strata_counts.items() if c < min_stratum_count] + + final_labels = [] + for label in strata_labels: + if label in rare_strata: + final_labels.append("RARE") + else: + final_labels.append(label) + + # 编码为整数 + unique_final, encoded = np.unique(final_labels, return_inverse=True) + + strata_info = { + "original_strata_counts": strata_counts, + "rare_strata": rare_strata, + "final_strata": list(unique_final), + "final_strata_counts": dict(zip(*np.unique(final_labels, return_counts=True))), + "n_rare_merged": sum(strata_counts[s] for s in rare_strata) if rare_strata else 0, + } + + logger.info(f"Built composite strata: {len(unique_final)} unique strata") + logger.info(f" Rare strata merged: {len(rare_strata)} types, {strata_info['n_rare_merged']} samples") + + return encoded.astype(np.int64), strata_info + + +# ============ RDKit 缓存预热 ============ + +def warmup_rdkit_cache(smiles_list: List[str], batch_size: int = 256) -> Dict: + """预热 RDKit 特征缓存,返回可跨模型共享的缓存字典。""" + encoder = CachedRDKitEncoder() + unique_smiles = list(set(smiles_list)) + logger.info(f"Warming up RDKit cache for {len(unique_smiles)} unique SMILES...") + for i in tqdm(range(0, len(unique_smiles), batch_size), desc="Cache warmup"): + batch = unique_smiles[i:i + batch_size] + encoder(batch) + logger.success(f"Cache warmup complete. Cached {len(encoder._cache)} SMILES.") + return encoder._cache + + +# ============ 模型创建 ============ + +def find_mpnn_ensemble_paths(base_dir: Path = DEFAULT_MPNN_ENSEMBLE_DIR) -> List[str]: + """自动查找 MPNN ensemble 的 model.pt 文件。""" + model_paths = sorted(base_dir.glob("cv_*/fold_*/model_*/model.pt")) + if not model_paths: + raise FileNotFoundError(f"No model.pt files found in {base_dir}") + return [str(p) for p in model_paths] + + +def create_model( + d_model: int = 256, + num_heads: int = 8, + n_attn_layers: int = 4, + fusion_strategy: str = "attention", + head_hidden_dim: int = 128, + dropout: float = 0.1, + use_mpnn: bool = False, + mpnn_device: str = "cpu", + set_transformer_block: str = "sab", + # MoE + use_moe: bool = False, + moe_n_experts: int = 4, + moe_top_k: int = 2, + moe_expert_hidden_mult: int = 2, + moe_jitter_noise: float = 0.0, + # LLM(打包成 dict 以减少多进程参数传递) + llm_kwargs: Optional[Dict] = None, +) -> Union[LNPModel, LNPModelWithoutMPNN]: + """创建模型。llm_kwargs 含 use_llm / llm_model_path / llm_freeze / llm_use_lora / llm_lora_*。""" + extra_kwargs = dict( + set_transformer_block=set_transformer_block, + use_moe=use_moe, + moe_n_experts=moe_n_experts, + moe_top_k=moe_top_k, + moe_expert_hidden_mult=moe_expert_hidden_mult, + moe_jitter_noise=moe_jitter_noise, + **(llm_kwargs or {}), + ) + + if use_mpnn: + ensemble_paths = find_mpnn_ensemble_paths() + return LNPModel( + d_model=d_model, + num_heads=num_heads, + n_attn_layers=n_attn_layers, + fusion_strategy=fusion_strategy, + head_hidden_dim=head_hidden_dim, + dropout=dropout, + mpnn_ensemble_paths=ensemble_paths, + mpnn_device=mpnn_device, + **extra_kwargs, + ) + else: + return LNPModelWithoutMPNN( + d_model=d_model, + num_heads=num_heads, + n_attn_layers=n_attn_layers, + fusion_strategy=fusion_strategy, + head_hidden_dim=head_hidden_dim, + dropout=dropout, + **extra_kwargs, + ) + + +# ============ 评估指标 ============ + +def evaluate_on_test( + model: torch.nn.Module, + test_loader: DataLoader, + device: torch.device, +) -> Dict: + """在测试集上评估模型""" + from scipy.special import rel_entr + from sklearn.metrics import ( + mean_squared_error, + mean_absolute_error, + r2_score, + accuracy_score, + precision_score, + recall_score, + f1_score, + ) + + model.eval() + + preds = { + "size": [], "delivery": [], "pdi": [], "ee": [], "toxic": [], "biodist": [] + } + targets = { + "size": [], "delivery": [], "pdi": [], "ee": [], "toxic": [], "biodist": [] + } + + with torch.no_grad(): + for batch in test_loader: + smiles = batch["smiles"] + tabular = {k: v.to(device) for k, v in batch["tabular"].items()} + tgts = batch["targets"] + masks = batch["mask"] + + outputs = model(smiles, tabular) + + # 收集预测和真实值 + for task in ["size", "delivery"]: + if task in masks and masks[task].any(): + m = masks[task] + key = task if task == "size" else "delivery" + preds[task].extend(outputs[key].squeeze(-1)[m].cpu().numpy().tolist()) + targets[task].extend(tgts[key][m].cpu().numpy().tolist()) + + for task in ["pdi", "ee", "toxic"]: + if task in masks and masks[task].any(): + m = masks[task] + preds[task].extend(outputs[task][m].argmax(dim=-1).cpu().numpy().tolist()) + targets[task].extend(tgts[task][m].cpu().numpy().tolist()) + + if "biodist" in masks and masks["biodist"].any(): + m = masks["biodist"] + preds["biodist"].extend(outputs["biodist"][m].cpu().numpy().tolist()) + targets["biodist"].extend(tgts["biodist"][m].cpu().numpy().tolist()) + + # 计算指标 + results = {} + + # 回归任务 + for task in ["size", "delivery"]: + if preds[task]: + p = np.array(preds[task]) + t = np.array(targets[task]) + results[task] = { + "n_samples": len(p), + "mse": float(mean_squared_error(t, p)), + "rmse": float(np.sqrt(mean_squared_error(t, p))), + "mae": float(mean_absolute_error(t, p)), + "r2": float(r2_score(t, p)), + } + + # 分类任务 + for task in ["pdi", "ee", "toxic"]: + if preds[task]: + p = np.array(preds[task]) + t = np.array(targets[task]) + results[task] = { + "n_samples": len(p), + "accuracy": float(accuracy_score(t, p)), + "precision": float(precision_score(t, p, average="macro", zero_division=0)), + "recall": float(recall_score(t, p, average="macro", zero_division=0)), + "f1": float(f1_score(t, p, average="macro", zero_division=0)), + } + + # 分布任务 + if preds["biodist"]: + p = np.array(preds["biodist"]) + t = np.array(targets["biodist"]) + + def kl_divergence(p_arr, q_arr, eps=1e-10): + p_arr = np.clip(p_arr, eps, 1.0) + q_arr = np.clip(q_arr, eps, 1.0) + return float(np.sum(rel_entr(p_arr, q_arr), axis=-1).mean()) + + def js_divergence(p_arr, q_arr, eps=1e-10): + p_arr = np.clip(p_arr, eps, 1.0) + q_arr = np.clip(q_arr, eps, 1.0) + m = 0.5 * (p_arr + q_arr) + return float(0.5 * (np.sum(rel_entr(p_arr, m), axis=-1) + np.sum(rel_entr(q_arr, m), axis=-1)).mean()) + + results["biodist"] = { + "n_samples": len(p), + "kl_divergence": kl_divergence(t, p), + "js_divergence": js_divergence(t, p), + } + + return results + + +# ============ 预训练权重加载 ============ + +def load_pretrain_weights_to_model( + model: Union[LNPModel, LNPModelWithoutMPNN], + pretrain_state_dict: Dict, + d_model: int, + pretrain_config: Dict, + load_delivery_head: bool = True, +) -> bool: + """ + 加载预训练权重到模型。 + + Returns: + 是否成功加载 + """ + if pretrain_config.get("d_model") != d_model: + logger.warning( + f"d_model mismatch: pretrain={pretrain_config.get('d_model')}, " + f"current={d_model}. Skipping pretrain loading." + ) + return False + + model.load_pretrain_weights( + pretrain_state_dict=pretrain_state_dict, + load_delivery_head=load_delivery_head, + strict=False, + ) + return True + + +# ============ 内层 Optuna 调参 ============ +def run_inner_optuna( + full_dataset: LNPDataset, + inner_train_indices: np.ndarray, + strata: np.ndarray, + device: torch.device, + n_trials: int = 20, + epochs_per_trial: int = 30, + patience: int = 10, + batch_size: int = 32, + n_inner_folds: int = 3, + use_mpnn: bool = False, + seed: int = 42, + study_path: Optional[Path] = None, + pretrain_state_dict: Optional[Dict] = None, + pretrain_config: Optional[Dict] = None, + load_delivery_head: bool = True, + rdkit_cache: Optional[Dict] = None, + use_moe: bool = False, + moe_n_experts: int = 4, + moe_top_k: int = 2, + moe_expert_hidden_mult: int = 2, + moe_jitter_noise: float = 0.0, + set_transformer_block: str = "sab", + llm_kwargs: Optional[Dict] = None, +) -> Tuple[Dict, int, optuna.Study]: + """ + 在内层数据上运行 Optuna 超参搜索。 + + Args: + full_dataset: 完整数据集 + inner_train_indices: 内层训练数据的索引(相对于 full_dataset) + strata: 每个样本的分层标签 + device: 设备 + n_trials: Optuna 试验数 + epochs_per_trial: 每个试验的最大 epoch + patience: 早停耐心值 + batch_size: 批次大小 + n_inner_folds: 内层折数 + use_mpnn: 是否使用 MPNN + seed: 随机种子 + study_path: 可选的 study 持久化路径 + pretrain_state_dict: 预训练权重 + pretrain_config: 预训练配置 + load_delivery_head: 是否加载 delivery head 权重 + + Returns: + (best_params, epoch_mean, study) + """ + if optuna is None: + raise ImportError("Optuna not installed. Run: pip install optuna") + + inner_strata = strata[inner_train_indices] + + # 固定架构参数(与预训练一致,确保权重完整加载) + _cfg = pretrain_config or {} + fixed_d_model = _cfg.get("d_model", 256) + fixed_num_heads = _cfg.get("num_heads", 8) + fixed_n_attn_layers = _cfg.get("n_attn_layers", 4) + fixed_fusion_strategy = _cfg.get("fusion_strategy", "attention") + fixed_head_hidden_dim = _cfg.get("head_hidden_dim", 128) + logger.info( + f"Fixed architecture params: d_model={fixed_d_model}, num_heads={fixed_num_heads}, " + f"n_attn_layers={fixed_n_attn_layers}, fusion={fixed_fusion_strategy}, " + f"head_hidden_dim={fixed_head_hidden_dim}" + ) + + def objective(trial: optuna.Trial) -> float: + d_model = fixed_d_model + num_heads = fixed_num_heads + n_attn_layers = fixed_n_attn_layers + fusion_strategy = fixed_fusion_strategy + head_hidden_dim = fixed_head_hidden_dim + + # 搜索训练超参数 + dropout = trial.suggest_float("dropout", 0.1, 0.5) + lr = trial.suggest_float("lr", 1e-5, 1e-3, log=True) + weight_decay = trial.suggest_float("weight_decay", 1e-5, 1e-1, log=True) + backbone_lr_ratio = trial.suggest_float("backbone_lr_ratio", 0.01, 1.0, log=True) + + # MoE / LLM + use_llm = bool(llm_kwargs.get("use_llm", False)) + moe_ne_t = trial.suggest_categorical("moe_n_experts", [2, 4]) if use_moe else moe_n_experts + moe_tk_t = trial.suggest_int("moe_top_k", 1, 2) if use_moe else moe_top_k + moe_hm_t = trial.suggest_categorical("moe_expert_hidden_mult", [1, 2]) if use_moe else moe_expert_hidden_mult + llm_kwargs_t = dict(llm_kwargs) + if use_llm: + llm_kwargs_t["llm_use_lora"] = True + llm_kwargs_t["llm_lora_r"] = trial.suggest_categorical("llm_lora_r", [8, 16, 32]) + + # 内层 3-fold CV + inner_cv = StratifiedKFold( + n_splits=n_inner_folds, shuffle=True, random_state=seed + ) + + fold_val_losses = [] + fold_best_epochs = [] + + for inner_fold, (inner_train_idx, inner_val_idx) in enumerate( + inner_cv.split(inner_train_indices, inner_strata) + ): + # 获取实际的数据集索引 + actual_train_idx = inner_train_indices[inner_train_idx] + actual_val_idx = inner_train_indices[inner_val_idx] + + # 创建 DataLoader + train_subset = Subset(full_dataset, actual_train_idx.tolist()) + val_subset = Subset(full_dataset, actual_val_idx.tolist()) + + train_loader = DataLoader( + train_subset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn + ) + val_loader = DataLoader( + val_subset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn + ) + + # 计算类权重 + class_weights = compute_class_weights_from_loader(train_loader) + + # 创建模型 + model = create_model( + d_model=d_model, + num_heads=num_heads, + n_attn_layers=n_attn_layers, + fusion_strategy=fusion_strategy, + head_hidden_dim=head_hidden_dim, + dropout=dropout, + use_mpnn=use_mpnn, + mpnn_device=device.type, + use_moe=use_moe, + moe_n_experts=moe_ne_t, + moe_top_k=moe_tk_t, + moe_expert_hidden_mult=moe_hm_t, + moe_jitter_noise=moe_jitter_noise, + set_transformer_block=set_transformer_block, + llm_kwargs=llm_kwargs_t, + ) + if rdkit_cache is not None: + model.rdkit_encoder._cache = rdkit_cache + + # 加载预训练权重 + if pretrain_state_dict is not None and pretrain_config is not None: + load_pretrain_weights_to_model( + model, pretrain_state_dict, d_model, pretrain_config, load_delivery_head + ) + + # 训练(带早停) + result = train_with_early_stopping( + model=model, + train_loader=train_loader, + val_loader=val_loader, + device=device, + lr=lr, + weight_decay=weight_decay, + epochs=epochs_per_trial, + patience=patience, + class_weights=class_weights, + backbone_lr_ratio=backbone_lr_ratio, + ) + + fold_val_losses.append(result["best_val_loss"]) + fold_best_epochs.append(result["best_epoch"]) + + # 记录 epoch_mean 到 trial + epoch_mean = int(round(np.mean(fold_best_epochs))) + trial.set_user_attr("epoch_mean", epoch_mean) + trial.set_user_attr("fold_best_epochs", fold_best_epochs) + + return np.mean(fold_val_losses) + + # 创建 study + storage = None + if study_path is not None: + storage = f"sqlite:///{study_path}" + + study = optuna.create_study( + direction="minimize", + sampler=TPESampler(seed=seed), + storage=storage, + study_name="inner_optuna", + load_if_exists=True, + ) + + study.optimize(objective, n_trials=n_trials, show_progress_bar=True) + + best_params = dict(study.best_trial.params) + best_params.update({ + "d_model": fixed_d_model, + "num_heads": fixed_num_heads, + "n_attn_layers": fixed_n_attn_layers, + "fusion_strategy": fixed_fusion_strategy, + "head_hidden_dim": fixed_head_hidden_dim, + "set_transformer_block": set_transformer_block, + }) + epoch_mean = study.best_trial.user_attrs.get("epoch_mean", epochs_per_trial) + + logger.info(f"Best trial: {study.best_trial.number}") + logger.info(f"Best val_loss: {study.best_trial.value:.4f}") + logger.info(f"Best params: {best_params}") + logger.info(f"Epoch mean: {epoch_mean}") + + return best_params, epoch_mean, study + + +# ============ 单 fold 执行(可跨进程调用) ============ +def _run_single_outer_fold( + outer_fold: int, + outer_train_idx: np.ndarray, + outer_test_idx: np.ndarray, + df: pd.DataFrame, + strata: np.ndarray, + fold_dir: Path, + n_trials: int, + epochs_per_trial: int, + inner_patience: int, + batch_size: int, + n_inner_folds: int, + use_mpnn: bool, + seed: int, + pretrain_state_dict: Optional[Dict], + pretrain_config: Optional[Dict], + load_delivery_head: bool, + device_str: str, + use_moe: bool = False, + moe_n_experts: int = 4, + moe_top_k: int = 2, + moe_expert_hidden_mult: int = 2, + moe_jitter_noise: float = 0.0, + set_transformer_block: str = "sab", + llm_kwargs: Optional[Dict] = None, + precomputed_best_params: Optional[Dict] = None, + precomputed_epoch_mean: Optional[int] = None, +) -> Dict: + """ + 执行单个外层 fold 的完整流程(内层调参 + 外层训练 + 评估)。 + + 所有参数均为可序列化类型,以支持 spawn 多进程。 + """ + device = torch.device(device_str) + set_global_seed(seed + outer_fold) + fold_dir = Path(fold_dir) + fold_dir.mkdir(parents=True, exist_ok=True) + + full_dataset = LNPDataset(df) + + logger.info(f"\n{'='*60}") + logger.info(f"OUTER FOLD {outer_fold}") + logger.info(f"{'='*60}") + logger.info(f"Train: {len(outer_train_idx)}, Test: {len(outer_test_idx)}") + + # 预热 RDKit 缓存(在整个 fold 内共享) + rdkit_cache = warmup_rdkit_cache(full_dataset.smiles) + + # 保存 split indices + with open(fold_dir / "splits.json", "w") as f: + json.dump({ + "outer_train_idx": outer_train_idx.tolist(), + "outer_test_idx": outer_test_idx.tolist(), + }, f) + + # 内层 Optuna 调参(方式 B:已有超参则跳过,直接复用) + if precomputed_best_params is not None and precomputed_epoch_mean is not None: + logger.info("Reusing precomputed best_params (skip inner Optuna).") + best_params = dict(precomputed_best_params) + epoch_mean = int(precomputed_epoch_mean) + else: + logger.info(f"\nRunning inner Optuna with {n_trials} trials...") + study_path = fold_dir / "optuna_study.sqlite3" + best_params, epoch_mean, study = run_inner_optuna( + full_dataset=full_dataset, + inner_train_indices=outer_train_idx, + strata=strata, + device=device, + n_trials=n_trials, + epochs_per_trial=epochs_per_trial, + patience=inner_patience, + batch_size=batch_size, + n_inner_folds=n_inner_folds, + use_mpnn=use_mpnn, + seed=seed + outer_fold, + study_path=study_path, + pretrain_state_dict=pretrain_state_dict, + pretrain_config=pretrain_config, + load_delivery_head=load_delivery_head, + rdkit_cache=rdkit_cache, + use_moe=use_moe, + moe_n_experts=moe_n_experts, + moe_top_k=moe_top_k, + moe_expert_hidden_mult=moe_expert_hidden_mult, + moe_jitter_noise=moe_jitter_noise, + set_transformer_block=set_transformer_block, + llm_kwargs=llm_kwargs, + ) + + # 保存最佳参数 + with open(fold_dir / "best_params.json", "w") as f: + json.dump(best_params, f, indent=2) + with open(fold_dir / "epoch_mean.json", "w") as f: + json.dump({"epoch_mean": epoch_mean}, f) + + # 外层训练(使用最优超参,固定 epoch 数,不 early-stop) + logger.info(f"\nTraining outer fold with best params, epochs={epoch_mean}...") + + # 从 outer_train 再切 10% 作为"监控用 val"(只画曲线、看 gap,不参与选模型/早停) + _rng = np.random.RandomState(seed + outer_fold) + _perm = _rng.permutation(len(outer_train_idx)) + _n_val = max(1, int(0.1 * len(outer_train_idx))) + fit_idx = outer_train_idx[_perm[_n_val:]] + monitor_idx = outer_train_idx[_perm[:_n_val]] + + train_subset = Subset(full_dataset, fit_idx.tolist()) + monitor_subset = Subset(full_dataset, monitor_idx.tolist()) + test_subset = Subset(full_dataset, outer_test_idx.tolist()) + + train_loader = DataLoader( + train_subset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn + ) + monitor_loader = DataLoader( + monitor_subset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn + ) + test_loader = DataLoader( + test_subset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn + ) + + class_weights = compute_class_weights_from_loader(train_loader) + + model = create_model( + d_model=best_params["d_model"], + num_heads=best_params["num_heads"], + n_attn_layers=best_params["n_attn_layers"], + fusion_strategy=best_params["fusion_strategy"], + head_hidden_dim=best_params["head_hidden_dim"], + dropout=best_params["dropout"], + use_mpnn=use_mpnn, + mpnn_device=device.type, + use_moe=use_moe, + moe_n_experts=best_params.get("moe_n_experts", moe_n_experts), + moe_top_k=best_params.get("moe_top_k", moe_top_k), + moe_expert_hidden_mult=best_params.get("moe_expert_hidden_mult", moe_expert_hidden_mult), + moe_jitter_noise=moe_jitter_noise, + set_transformer_block=best_params.get("set_transformer_block", "sab"), + llm_kwargs={**llm_kwargs, **({"llm_use_lora": True, "llm_lora_r": best_params["llm_lora_r"]} + if (llm_kwargs.get("use_llm", False) and "llm_lora_r" in best_params) else {})}, + ) + model.rdkit_encoder._cache = rdkit_cache + + if pretrain_state_dict is not None and pretrain_config is not None: + loaded = load_pretrain_weights_to_model( + model, pretrain_state_dict, best_params["d_model"], + pretrain_config, load_delivery_head + ) + if loaded: + logger.info(f"Loaded pretrain weights for outer fold {outer_fold}") + + train_result = train_fixed_epochs( + model=model, + train_loader=train_loader, + val_loader=monitor_loader, + device=device, + lr=best_params["lr"], + weight_decay=best_params["weight_decay"], + epochs=epoch_mean, + class_weights=class_weights, + use_cosine_annealing=True, + backbone_lr_ratio=best_params.get("backbone_lr_ratio", 1.0), + freeze_backbone_epochs=3, + ) + + model.load_state_dict(train_result["final_state"]) + model = model.to(device) + + config = { + "d_model": best_params["d_model"], + "num_heads": best_params["num_heads"], + "n_attn_layers": best_params["n_attn_layers"], + "fusion_strategy": best_params["fusion_strategy"], + "head_hidden_dim": best_params["head_hidden_dim"], + "set_transformer_block": best_params.get("set_transformer_block", "sab"), + "dropout": best_params["dropout"], + "use_mpnn": use_mpnn, + "use_moe": use_moe, + "moe_n_experts": moe_n_experts, + "moe_top_k": moe_top_k, + "moe_expert_hidden_mult": moe_expert_hidden_mult, + "moe_jitter_noise": moe_jitter_noise, + **(llm_kwargs or {}), + } + + torch.save({ + "model_state_dict": train_result["final_state"], + "config": config, + "epoch_mean": epoch_mean, + "best_params": best_params, + }, fold_dir / "model.pt") + + with open(fold_dir / "history.json", "w") as f: + json.dump(train_result["history"], f, indent=2) + + # 在测试集上评估 + logger.info("Evaluating on outer test set...") + test_metrics = evaluate_on_test(model, test_loader, device) + + with open(fold_dir / "test_metrics.json", "w") as f: + json.dump(test_metrics, f, indent=2) + + logger.info(f"\nOuter Fold {outer_fold} Test Results:") + for task, metrics in test_metrics.items(): + if "rmse" in metrics: + logger.info(f" {task}: RMSE={metrics['rmse']:.4f}, R²={metrics['r2']:.4f}") + elif "accuracy" in metrics: + logger.info(f" {task}: Acc={metrics['accuracy']:.4f}, F1={metrics['f1']:.4f}") + elif "kl_divergence" in metrics: + logger.info(f" {task}: KL={metrics['kl_divergence']:.4f}, JS={metrics['js_divergence']:.4f}") + + return { + "fold": outer_fold, + "best_params": best_params, + "epoch_mean": epoch_mean, + "test_metrics": test_metrics, + } + + +# ============ 主流程 ============ +@app.command() +def main( + input_path: Path = INTERIM_DATA_DIR / "internal.csv", + output_dir: Path = MODELS_DIR / "nested_cv", + # CV 参数 + n_outer_folds: int = 5, + n_inner_folds: int = 3, + min_stratum_count: int = 5, + seed: int = 42, + # Optuna 参数 + n_trials: int = 20, + epochs_per_trial: int = 30, + inner_patience: int = 10, + # 训练参数 + batch_size: int = 32, + # 预训练权重 + init_from_pretrain: Optional[Path] = None, + load_delivery_head: bool = False, + # MPNN + use_mpnn: bool = False, + n_repeats: int = 1, + repeat_seed_step: int = 1000, + # MoE(消融开关) + use_moe: bool = False, + moe_n_experts: int = 4, + moe_top_k: int = 2, + moe_expert_hidden_mult: int = 2, + moe_jitter_noise: float = 0.0, + # Set Transformer + set_transformer_block: str = "sab", + # LLM(消融开关) + use_llm: bool = False, + llm_model_path: str = DEFAULT_MOLT5_PATH, + llm_freeze: bool = True, + llm_use_lora: bool = False, + llm_lora_r: int = 8, + llm_lora_alpha: int = 16, + llm_lora_dropout: float = 0.05, + # 并行 + parallel: bool = False, + # 设备 + device: str = "cuda" if torch.cuda.is_available() else "cpu", +): + """ + 嵌套交叉验证 + Optuna 超参调优。 + + 外层 5-fold(20% test / 80% train),内层 3-fold Optuna 调参。 + 外层训练不使用 early-stopping,epoch 数使用内层 best trial 的 epoch_mean。 + + 使用 --init-from-pretrain 从预训练 checkpoint 初始化模型权重。 + 使用 --parallel 同时运行所有外层 fold(需要足够 GPU 显存)。 + """ + if optuna is None: + logger.error("Optuna not installed. Run: pip install optuna") + raise typer.Exit(1) + + logger.info(f"Using device: {device}") + device = torch.device(device) + set_global_seed(seed) + + llm_kwargs = dict( + use_llm=use_llm, + llm_model_path=llm_model_path, + llm_freeze=llm_freeze, + llm_use_lora=llm_use_lora, + llm_lora_r=llm_lora_r, + llm_lora_alpha=llm_lora_alpha, + llm_lora_dropout=llm_lora_dropout, + ) + + # 加载预训练权重(如果指定) + pretrain_state_dict = None + pretrain_config = None + if init_from_pretrain is not None: + if init_from_pretrain.exists(): + logger.info(f"Loading pretrain weights from {init_from_pretrain}") + checkpoint = torch.load(init_from_pretrain, map_location="cpu", weights_only=False) + pretrain_state_dict = checkpoint["model_state_dict"] + pretrain_config = checkpoint.get("config", {}) + logger.success(f"Loaded pretrain checkpoint (d_model={pretrain_config.get('d_model')})") + else: + logger.warning(f"Pretrain checkpoint not found: {init_from_pretrain}, skipping") + + # 创建输出目录(带时间戳) + run_name = datetime.now().strftime("%Y%m%d_%H%M%S") + run_dir = output_dir / run_name + run_dir.mkdir(parents=True, exist_ok=True) + logger.info(f"Output directory: {run_dir}") + + # 加载数据 + logger.info(f"Loading data from {input_path}") + df = pd.read_csv(input_path) + logger.info(f"Loaded {len(df)} samples") + + # 处理数据 + logger.info("Processing dataframe...") + df = process_dataframe(df) + + # 构建复合分层标签 + logger.info("Building composite strata...") + strata, strata_info = build_composite_strata(df, min_stratum_count) + + # 保存 strata 信息 + with open(run_dir / "strata_info.json", "w") as f: + json.dump(strata_info, f, indent=2, default=str) + + # 创建完整数据集(仅用于获取样本数做 split) + n_samples = len(LNPDataset(df)) + + # 外层 CV split + outer_cv = StratifiedKFold( + n_splits=n_outer_folds, shuffle=True, random_state=seed + ) + + device_str = str(device) + fold_args = [] + for outer_fold, (outer_train_idx, outer_test_idx) in enumerate( + outer_cv.split(np.arange(n_samples), strata) + ): + fold_args.append(dict( + outer_fold=outer_fold, + outer_train_idx=outer_train_idx, + outer_test_idx=outer_test_idx, + df=df, + strata=strata, + fold_dir=run_dir / f"outer_fold_{outer_fold}", + n_trials=n_trials, + epochs_per_trial=epochs_per_trial, + inner_patience=inner_patience, + batch_size=batch_size, + n_inner_folds=n_inner_folds, + use_mpnn=use_mpnn, + seed=seed, + pretrain_state_dict=pretrain_state_dict, + pretrain_config=pretrain_config, + load_delivery_head=load_delivery_head, + device_str=device_str, + use_moe=use_moe, + moe_n_experts=moe_n_experts, + moe_top_k=moe_top_k, + moe_expert_hidden_mult=moe_expert_hidden_mult, + moe_jitter_noise=moe_jitter_noise, + set_transformer_block=set_transformer_block, + llm_kwargs=llm_kwargs, + )) + + if parallel: + import multiprocessing as mp + from concurrent.futures import ProcessPoolExecutor + + ctx = mp.get_context("spawn") + logger.info(f"Running {n_outer_folds} outer folds in PARALLEL (spawn)") + with ProcessPoolExecutor(max_workers=n_outer_folds, mp_context=ctx) as executor: + futures = [executor.submit(_run_single_outer_fold, **args) for args in fold_args] + outer_results = [f.result() for f in futures] + outer_results.sort(key=lambda r: r["fold"]) + else: + logger.info(f"Running {n_outer_folds} outer folds SEQUENTIALLY") + outer_results = [] + per_fold_params = {} + for args in fold_args: + result = _run_single_outer_fold(**args) + outer_results.append(result) + per_fold_params[result["fold"]] = (result["best_params"], result["epoch_mean"]) + + for rep in range(1, n_repeats): + logger.info(f"\n===== Repeat {rep}/{n_repeats - 1} (reuse hyperparams) =====") + for args in fold_args: + bp, em = per_fold_params[args["outer_fold"]] + rep_args = dict(args) + rep_args["seed"] = seed + rep * repeat_seed_step + rep_args["fold_dir"] = run_dir / f"repeat_{rep}" / f"outer_fold_{args['outer_fold']}" + rep_args["precomputed_best_params"] = bp + rep_args["precomputed_epoch_mean"] = em + outer_results.append(_run_single_outer_fold(**rep_args)) + + # 汇总结果 + logger.info("\n" + "=" * 60) + logger.info("NESTED CV COMPLETE") + logger.info("=" * 60) + + # 计算汇总统计 + summary = {"fold_results": outer_results} + + # 对每个任务计算均值和标准差 + tasks_with_metrics = {} + for result in outer_results: + for task, metrics in result["test_metrics"].items(): + if task not in tasks_with_metrics: + tasks_with_metrics[task] = {k: [] for k in metrics.keys() if k != "n_samples"} + for k, v in metrics.items(): + if k != "n_samples": + tasks_with_metrics[task][k].append(v) + + summary["summary_stats"] = {} + for task, metrics_dict in tasks_with_metrics.items(): + summary["summary_stats"][task] = {} + for metric_name, values in metrics_dict.items(): + summary["summary_stats"][task][f"{metric_name}_mean"] = float(np.mean(values)) + summary["summary_stats"][task][f"{metric_name}_std"] = float(np.std(values)) + + # 打印汇总 + logger.info("\n[Summary Statistics]") + for task, stats in summary["summary_stats"].items(): + if "rmse_mean" in stats: + logger.info( + f" {task}: RMSE={stats['rmse_mean']:.4f}±{stats['rmse_std']:.4f}, " + f"R²={stats['r2_mean']:.4f}±{stats['r2_std']:.4f}" + ) + elif "accuracy_mean" in stats: + logger.info( + f" {task}: Acc={stats['accuracy_mean']:.4f}±{stats['accuracy_std']:.4f}, " + f"F1={stats['f1_mean']:.4f}±{stats['f1_std']:.4f}" + ) + elif "kl_divergence_mean" in stats: + logger.info( + f" {task}: KL={stats['kl_divergence_mean']:.4f}±{stats['kl_divergence_std']:.4f}, " + f"JS={stats['js_divergence_mean']:.4f}±{stats['js_divergence_std']:.4f}" + ) + + # 保存汇总 + with open(run_dir / "summary.json", "w") as f: + json.dump(summary, f, indent=2) + + logger.success(f"\nAll results saved to {run_dir}") + + +if __name__ == "__main__": + app() + diff --git a/lnp_ml/modeling/pretrain.py b/lnp_ml/modeling/pretrain.py index b7d9d66..54a39ea 100644 --- a/lnp_ml/modeling/pretrain.py +++ b/lnp_ml/modeling/pretrain.py @@ -1,521 +1,574 @@ -"""预训练脚本:在外部 LiON 数据上预训练 backbone + delivery head""" - -import json -from pathlib import Path -from typing import Dict, List, Optional - -import pandas as pd -import torch -import torch.nn as nn -from torch.utils.data import DataLoader -from loguru import logger -from tqdm import tqdm -import typer - -from lnp_ml.config import MODELS_DIR, PROCESSED_DATA_DIR -from lnp_ml.dataset import ExternalDeliveryDataset, collate_fn -from lnp_ml.modeling.visualization import plot_loss_curves - -# MPNN ensemble 默认路径 -DEFAULT_MPNN_ENSEMBLE_DIR = MODELS_DIR / "mpnn" / "all_amine_split_for_LiON" - - -def find_mpnn_ensemble_paths(base_dir: Path = DEFAULT_MPNN_ENSEMBLE_DIR) -> List[str]: - """ - 自动查找 MPNN ensemble 的 model.pt 文件。 - - 在 base_dir 下查找所有 cv_*/fold_*/model_*/model.pt 文件。 - """ - model_paths = sorted(base_dir.glob("cv_*/fold_*/model_*/model.pt")) - if not model_paths: - raise FileNotFoundError(f"No model.pt files found in {base_dir}") - return [str(p) for p in model_paths] -from lnp_ml.modeling.models import LNPModel, LNPModelWithoutMPNN - - -app = typer.Typer() - - -class EarlyStopping: - """早停机制""" - - def __init__(self, patience: int = 10, min_delta: float = 0.0): - self.patience = patience - self.min_delta = min_delta - self.counter = 0 - self.best_loss = float("inf") - - def __call__(self, val_loss: float) -> bool: - if val_loss < self.best_loss - self.min_delta: - self.best_loss = val_loss - self.counter = 0 - return False - self.counter += 1 - return self.counter >= self.patience - - -def warmup_cache(model: nn.Module, smiles_list: List[str], batch_size: int = 256) -> None: - """ - 预热 RDKit 特征缓存,避免训练时计算阻塞。 - """ - unique_smiles = list(set(smiles_list)) - logger.info(f"Warming up RDKit cache for {len(unique_smiles)} unique SMILES...") - - for i in tqdm(range(0, len(unique_smiles), batch_size), desc="Cache warmup"): - batch = unique_smiles[i:i + batch_size] - model.rdkit_encoder(batch) - - logger.success(f"Cache warmup complete. Cached {len(model.rdkit_encoder._cache)} SMILES.") - - -def train_epoch_delivery( - model: nn.Module, - loader: DataLoader, - optimizer: torch.optim.Optimizer, - device: torch.device, - epoch: int = 0, -) -> Dict[str, float]: - """ - 单个 epoch 的预训练(仅 delivery 任务)。 - """ - model.train() - total_loss = 0.0 - n_samples = 0 - - pbar = tqdm(loader, desc=f"Epoch {epoch+1} [Train]", leave=False) - for batch in pbar: - smiles = batch["smiles"] - tabular = {k: v.to(device) for k, v in batch["tabular"].items()} - targets = batch["targets"]["delivery"].to(device) - mask = batch["mask"]["delivery"].to(device) - - optimizer.zero_grad() - - # Forward: 只预测 delivery - pred = model.forward_delivery(smiles, tabular) # [B, 1] - pred = pred.squeeze(-1) # [B] - - # 计算损失(仅对有效样本) - if mask.any(): - loss = nn.functional.mse_loss(pred[mask], targets[mask]) - loss.backward() - optimizer.step() - total_loss += loss.item() * mask.sum().item() - n_samples += mask.sum().item() - - pbar.set_postfix({"loss": total_loss / max(n_samples, 1)}) - - avg_loss = total_loss / max(n_samples, 1) - return {"loss": avg_loss, "n_samples": n_samples} - - -@torch.no_grad() -def validate_delivery( - model: nn.Module, - loader: DataLoader, - device: torch.device, -) -> Dict[str, float]: - """ - 验证(仅 delivery 任务)。 - """ - model.eval() - total_loss = 0.0 - n_samples = 0 - - for batch in loader: - smiles = batch["smiles"] - tabular = {k: v.to(device) for k, v in batch["tabular"].items()} - targets = batch["targets"]["delivery"].to(device) - mask = batch["mask"]["delivery"].to(device) - - pred = model.forward_delivery(smiles, tabular).squeeze(-1) - - if mask.any(): - loss = nn.functional.mse_loss(pred[mask], targets[mask]) - total_loss += loss.item() * mask.sum().item() - n_samples += mask.sum().item() - - avg_loss = total_loss / max(n_samples, 1) - return {"loss": avg_loss, "n_samples": n_samples} - - -def pretrain( - train_loader: DataLoader, - val_loader: DataLoader, - model: nn.Module, - device: torch.device, - lr: float = 1e-4, - weight_decay: float = 1e-5, - epochs: int = 50, - patience: int = 10, -) -> dict: - """ - 预训练循环。 - - Returns: - 训练历史和最佳验证损失 - """ - model = model.to(device) - optimizer = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=weight_decay) - scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( - optimizer, mode="min", factor=0.5, patience=5 - ) - early_stopping = EarlyStopping(patience=patience) - - history = {"train": [], "val": []} - best_val_loss = float("inf") - best_state = None - - for epoch in range(epochs): - # Train - train_metrics = train_epoch_delivery(model, train_loader, optimizer, device, epoch) - - # Validate - val_metrics = validate_delivery(model, val_loader, device) - - # Log - logger.info( - f"Epoch {epoch + 1}/{epochs} | " - f"Train Loss: {train_metrics['loss']:.4f} | " - f"Val Loss: {val_metrics['loss']:.4f}" - ) - - history["train"].append(train_metrics) - history["val"].append(val_metrics) - - # Learning rate scheduling - scheduler.step(val_metrics["loss"]) - - # Save best model - if val_metrics["loss"] < best_val_loss: - best_val_loss = val_metrics["loss"] - best_state = {k: v.cpu().clone() for k, v in model.state_dict().items()} - logger.info(f" -> New best model (val_loss={best_val_loss:.4f})") - - # Early stopping - if early_stopping(val_metrics["loss"]): - logger.info(f"Early stopping at epoch {epoch + 1}") - break - - # Restore best model - if best_state is not None: - model.load_state_dict(best_state) - - return { - "history": history, - "best_val_loss": best_val_loss, - } - - -@app.command() -def main( - # 数据路径(已处理的 parquet 文件) - train_path: Path = PROCESSED_DATA_DIR / "train_pretrain.parquet", - val_path: Path = PROCESSED_DATA_DIR / "val_pretrain.parquet", - output_dir: Path = MODELS_DIR, - # 模型参数 - d_model: int = 256, - num_heads: int = 8, - n_attn_layers: int = 4, - fusion_strategy: str = "attention", - head_hidden_dim: int = 128, - dropout: float = 0.1, - # MPNN 参数(可选) - use_mpnn: bool = False, # 启用 MPNN,自动从默认路径加载 ensemble - mpnn_checkpoint: Optional[str] = None, - mpnn_ensemble_paths: Optional[str] = None, # 逗号分隔的路径列表 - mpnn_device: str = "cpu", - # 训练参数 - batch_size: int = 64, - lr: float = 1e-4, - weight_decay: float = 1e-5, - epochs: int = 50, - patience: int = 10, - # 设备 - device: str = "cuda" if torch.cuda.is_available() else "cpu", -): - """ - 在外部 LiON 数据上预训练 backbone + delivery head。 - - 需要先运行 `make data_pretrain` 生成 parquet 文件。 - - 使用 --use-mpnn 启用 MPNN encoder(自动从 models/mpnn/all_amine_split_for_LiON 加载)。 - - 产出: - - models/pretrain_delivery.pt: 包含 backbone + delivery head 权重 - - models/pretrain_history.json: 训练历史 - """ - logger.info(f"Using device: {device}") - device_obj = torch.device(device) - - # 加载已处理的 parquet 文件 - logger.info(f"Loading train data from {train_path}") - train_df = pd.read_parquet(train_path) - train_dataset = ExternalDeliveryDataset(train_df) - - logger.info(f"Loading val data from {val_path}") - val_df = pd.read_parquet(val_path) - val_dataset = ExternalDeliveryDataset(val_df) - - logger.info(f"Train samples: {len(train_dataset)}, Val samples: {len(val_dataset)}") - - train_loader = DataLoader( - train_dataset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn - ) - val_loader = DataLoader( - val_dataset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn - ) - - # 解析 MPNN 配置 - # 优先级:mpnn_checkpoint > mpnn_ensemble_paths > use_mpnn(自动查找) - ensemble_paths_list = None - if mpnn_ensemble_paths: - ensemble_paths_list = mpnn_ensemble_paths.split(",") - elif use_mpnn and mpnn_checkpoint is None: - # --use-mpnn 但没有指定具体路径,自动查找 - logger.info(f"Auto-detecting MPNN ensemble from {DEFAULT_MPNN_ENSEMBLE_DIR}") - ensemble_paths_list = find_mpnn_ensemble_paths() - logger.info(f"Found {len(ensemble_paths_list)} MPNN models") - - enable_mpnn = mpnn_checkpoint is not None or ensemble_paths_list is not None - - # 创建模型 - logger.info(f"Creating model (use_mpnn={enable_mpnn})...") - if enable_mpnn: - model = LNPModel( - d_model=d_model, - num_heads=num_heads, - n_attn_layers=n_attn_layers, - fusion_strategy=fusion_strategy, - head_hidden_dim=head_hidden_dim, - dropout=dropout, - mpnn_checkpoint=mpnn_checkpoint, - mpnn_ensemble_paths=ensemble_paths_list, - mpnn_device=mpnn_device, - ) - else: - model = LNPModelWithoutMPNN( - d_model=d_model, - num_heads=num_heads, - n_attn_layers=n_attn_layers, - fusion_strategy=fusion_strategy, - head_hidden_dim=head_hidden_dim, - dropout=dropout, - ) - - n_params_total = sum(p.numel() for p in model.parameters()) - n_params_trainable = sum(p.numel() for p in model.parameters() if p.requires_grad) - logger.info(f"Model parameters: {n_params_total:,} total, {n_params_trainable:,} trainable") - - # 预热 RDKit 缓存(避免训练时阻塞) - all_smiles = train_df["smiles"].tolist() + val_df["smiles"].tolist() - warmup_cache(model, all_smiles, batch_size=256) - - # 预训练 - logger.info("Starting pretraining on external data (delivery only)...") - result = pretrain( - train_loader=train_loader, - val_loader=val_loader, - model=model, - device=device_obj, - lr=lr, - weight_decay=weight_decay, - epochs=epochs, - patience=patience, - ) - - # 保存预训练 checkpoint - output_dir.mkdir(parents=True, exist_ok=True) - checkpoint_path = output_dir / "pretrain_delivery.pt" - torch.save( - { - "model_state_dict": model.state_dict(), - "backbone_state_dict": model.get_backbone_state_dict(), - "delivery_head_state_dict": model.get_delivery_head_state_dict(), - "config": { - "d_model": d_model, - "num_heads": num_heads, - "n_attn_layers": n_attn_layers, - "fusion_strategy": fusion_strategy, - "head_hidden_dim": head_hidden_dim, - "dropout": dropout, - "use_mpnn": enable_mpnn, - }, - "best_val_loss": result["best_val_loss"], - }, - checkpoint_path, - ) - logger.success(f"Saved pretrain checkpoint to {checkpoint_path}") - - # 保存训练历史 - history_path = output_dir / "pretrain_history.json" - with open(history_path, "w") as f: - json.dump(result["history"], f, indent=2) - logger.success(f"Saved pretrain history to {history_path}") - - # 绘制 loss 曲线图 - loss_plot_path = output_dir / "pretrain_loss_curves.png" - plot_loss_curves( - history=result["history"], - output_path=loss_plot_path, - title="Pretrain Loss Curves (Delivery)", - ) - logger.success(f"Saved loss curves plot to {loss_plot_path}") - - logger.success( - f"Pretraining complete! Best val_loss: {result['best_val_loss']:.4f}" - ) - - -@app.command() -def test( - # 数据路径 - val_path: Path = PROCESSED_DATA_DIR / "val_pretrain.parquet", - model_path: Path = MODELS_DIR / "pretrain_delivery.pt", - output_path: Path = MODELS_DIR / "pretrain_test_results.json", - # MPNN 参数 - use_mpnn: bool = False, - mpnn_device: str = "cpu", - # 其他参数 - batch_size: int = 64, - device: str = "cuda" if torch.cuda.is_available() else "cpu", -): - """ - 评估 pretrain 模型在外部数据上的 delivery 预测性能。 - - 输出详细指标:MSE, RMSE, MAE, R² - """ - import numpy as np - from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score - - logger.info(f"Using device: {device}") - device_obj = torch.device(device) - - # 加载模型 - logger.info(f"Loading pretrain model from {model_path}") - checkpoint = torch.load(model_path, map_location=device_obj, weights_only=False) - config = checkpoint["config"] - - # 解析 MPNN 配置 - enable_mpnn = config.get("use_mpnn", False) - if enable_mpnn or use_mpnn: - logger.info(f"Auto-detecting MPNN ensemble from {DEFAULT_MPNN_ENSEMBLE_DIR}") - ensemble_paths = find_mpnn_ensemble_paths() - logger.info(f"Found {len(ensemble_paths)} MPNN models") - - model = LNPModel( - d_model=config["d_model"], - num_heads=config["num_heads"], - n_attn_layers=config["n_attn_layers"], - fusion_strategy=config["fusion_strategy"], - head_hidden_dim=config["head_hidden_dim"], - dropout=config["dropout"], - mpnn_ensemble_paths=ensemble_paths, - mpnn_device=mpnn_device, - ) - else: - model = LNPModelWithoutMPNN( - d_model=config["d_model"], - num_heads=config["num_heads"], - n_attn_layers=config["n_attn_layers"], - fusion_strategy=config["fusion_strategy"], - head_hidden_dim=config["head_hidden_dim"], - dropout=config["dropout"], - ) - - model.load_state_dict(checkpoint["model_state_dict"]) - model.to(device_obj) - model.eval() - - logger.info(f"Model config: {config}") - logger.info(f"Best val_loss from training: {checkpoint.get('best_val_loss', 'N/A')}") - - # 加载数据 - logger.info(f"Loading validation data from {val_path}") - val_df = pd.read_parquet(val_path) - val_dataset = ExternalDeliveryDataset(val_df) - val_loader = DataLoader( - val_dataset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn - ) - logger.info(f"Validation samples: {len(val_dataset)}") - - # 预测 - logger.info("Running predictions...") - all_preds = [] - all_targets = [] - all_masks = [] - - with torch.no_grad(): - for batch in tqdm(val_loader, desc="Predicting"): - smiles = batch["smiles"] - tabular = {k: v.to(device_obj) for k, v in batch["tabular"].items()} - targets = batch["targets"]["delivery"].numpy() - mask = batch["mask"]["delivery"].numpy() - - pred = model.forward_delivery(smiles, tabular).squeeze(-1).cpu().numpy() - - all_preds.extend(pred) - all_targets.extend(targets) - all_masks.extend(mask) - - # 转为数组 - all_preds = np.array(all_preds) - all_targets = np.array(all_targets) - all_masks = np.array(all_masks, dtype=bool) - - # 只计算有效样本 - y_pred = all_preds[all_masks] - y_true = all_targets[all_masks] - - # 计算指标 - mse = float(mean_squared_error(y_true, y_pred)) - rmse = float(np.sqrt(mse)) - mae = float(mean_absolute_error(y_true, y_pred)) - r2 = float(r2_score(y_true, y_pred)) - - # 额外统计 - correlation = float(np.corrcoef(y_true, y_pred)[0, 1]) - - results = { - "model_path": str(model_path), - "val_path": str(val_path), - "n_samples": int(all_masks.sum()), - "metrics": { - "mse": mse, - "rmse": rmse, - "mae": mae, - "r2": r2, - "correlation": correlation, - }, - "statistics": { - "y_true_mean": float(y_true.mean()), - "y_true_std": float(y_true.std()), - "y_pred_mean": float(y_pred.mean()), - "y_pred_std": float(y_pred.std()), - } - } - - # 打印结果 - logger.info("\n" + "=" * 50) - logger.info("PRETRAIN MODEL EVALUATION (Delivery)") - logger.info("=" * 50) - logger.info(f"Samples: {results['n_samples']}") - logger.info("\n[Metrics]") - logger.info(f" MSE: {mse:.4f}") - logger.info(f" RMSE: {rmse:.4f}") - logger.info(f" MAE: {mae:.4f}") - logger.info(f" R²: {r2:.4f}") - logger.info(f" Correlation: {correlation:.4f}") - logger.info("\n[Statistics]") - logger.info(f" True: mean={y_true.mean():.4f}, std={y_true.std():.4f}") - logger.info(f" Pred: mean={y_pred.mean():.4f}, std={y_pred.std():.4f}") - - # 保存结果 - with open(output_path, "w") as f: - json.dump(results, f, indent=2) - logger.success(f"\nSaved results to {output_path}") - - -if __name__ == "__main__": - app() - +"""预训练脚本:在外部 LiON 数据上预训练 backbone + delivery head""" + +import json +from pathlib import Path +from typing import Dict, List, Optional + +import pandas as pd +import torch +import torch.nn as nn +from torch.utils.data import DataLoader +from loguru import logger +from tqdm import tqdm +import typer + +from lnp_ml.config import MODELS_DIR, PROCESSED_DATA_DIR +from lnp_ml.dataset import ExternalDeliveryDataset, collate_fn +from lnp_ml.modeling.visualization import plot_loss_curves + +# MPNN ensemble 默认路径 +DEFAULT_MPNN_ENSEMBLE_DIR = MODELS_DIR / "mpnn" / "all_amine_split_for_LiON" + + +def find_mpnn_ensemble_paths(base_dir: Path = DEFAULT_MPNN_ENSEMBLE_DIR) -> List[str]: + """ + 自动查找 MPNN ensemble 的 model.pt 文件。 + + 在 base_dir 下查找所有 cv_*/fold_*/model_*/model.pt 文件。 + """ + model_paths = sorted(base_dir.glob("cv_*/fold_*/model_*/model.pt")) + if not model_paths: + raise FileNotFoundError(f"No model.pt files found in {base_dir}") + return [str(p) for p in model_paths] +from lnp_ml.modeling.models import LNPModel, LNPModelWithoutMPNN +from lnp_ml.modeling.layers.llm_prompt import DEFAULT_MOLT5_PATH +from lnp_ml.utils.seed import set_global_seed + + +app = typer.Typer() + + +class EarlyStopping: + """早停机制""" + + def __init__(self, patience: int = 10, min_delta: float = 0.0): + self.patience = patience + self.min_delta = min_delta + self.counter = 0 + self.best_loss = float("inf") + + def __call__(self, val_loss: float) -> bool: + if val_loss < self.best_loss - self.min_delta: + self.best_loss = val_loss + self.counter = 0 + return False + self.counter += 1 + return self.counter >= self.patience + + +def warmup_cache(model: nn.Module, smiles_list: List[str], batch_size: int = 256) -> None: + """ + 预热 RDKit 特征缓存,避免训练时计算阻塞。 + """ + unique_smiles = list(set(smiles_list)) + logger.info(f"Warming up RDKit cache for {len(unique_smiles)} unique SMILES...") + + for i in tqdm(range(0, len(unique_smiles), batch_size), desc="Cache warmup"): + batch = unique_smiles[i:i + batch_size] + model.rdkit_encoder(batch) + + logger.success(f"Cache warmup complete. Cached {len(model.rdkit_encoder._cache)} SMILES.") + + +def train_epoch_delivery( + model: nn.Module, + loader: DataLoader, + optimizer: torch.optim.Optimizer, + device: torch.device, + epoch: int = 0, +) -> Dict[str, float]: + """ + 单个 epoch 的预训练(仅 delivery 任务)。 + """ + model.train() + total_loss = 0.0 + n_samples = 0 + + pbar = tqdm(loader, desc=f"Epoch {epoch+1} [Train]", leave=False) + for batch in pbar: + smiles = batch["smiles"] + tabular = {k: v.to(device) for k, v in batch["tabular"].items()} + targets = batch["targets"]["delivery"].to(device) + mask = batch["mask"]["delivery"].to(device) + + optimizer.zero_grad() + + # Forward: 只预测 delivery + pred = model.forward_delivery(smiles, tabular) # [B, 1] + pred = pred.squeeze(-1) # [B] + + # 计算损失(仅对有效样本) + if mask.any(): + loss = nn.functional.mse_loss(pred[mask], targets[mask]) + loss.backward() + optimizer.step() + total_loss += loss.item() * mask.sum().item() + n_samples += mask.sum().item() + + pbar.set_postfix({"loss": total_loss / max(n_samples, 1)}) + + avg_loss = total_loss / max(n_samples, 1) + return {"loss": avg_loss, "n_samples": n_samples} + + +@torch.no_grad() +def validate_delivery( + model: nn.Module, + loader: DataLoader, + device: torch.device, +) -> Dict[str, float]: + """ + 验证(仅 delivery 任务)。 + """ + model.eval() + total_loss = 0.0 + n_samples = 0 + + for batch in loader: + smiles = batch["smiles"] + tabular = {k: v.to(device) for k, v in batch["tabular"].items()} + targets = batch["targets"]["delivery"].to(device) + mask = batch["mask"]["delivery"].to(device) + + pred = model.forward_delivery(smiles, tabular).squeeze(-1) + + if mask.any(): + loss = nn.functional.mse_loss(pred[mask], targets[mask]) + total_loss += loss.item() * mask.sum().item() + n_samples += mask.sum().item() + + avg_loss = total_loss / max(n_samples, 1) + return {"loss": avg_loss, "n_samples": n_samples} + + +def pretrain( + train_loader: DataLoader, + val_loader: DataLoader, + model: nn.Module, + device: torch.device, + lr: float = 1e-4, + weight_decay: float = 1e-5, + epochs: int = 50, + patience: int = 10, +) -> dict: + """ + 预训练循环。 + + Returns: + 训练历史和最佳验证损失 + """ + model = model.to(device) + trainable_params = [p for p in model.parameters() if p.requires_grad] + optimizer = torch.optim.AdamW(trainable_params, lr=lr, weight_decay=weight_decay) + scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + optimizer, mode="min", factor=0.5, patience=5 + ) + early_stopping = EarlyStopping(patience=patience) + + history = {"train": [], "val": []} + best_val_loss = float("inf") + best_state = None + + for epoch in range(epochs): + # Train + train_metrics = train_epoch_delivery(model, train_loader, optimizer, device, epoch) + + # Validate + val_metrics = validate_delivery(model, val_loader, device) + + # Log + logger.info( + f"Epoch {epoch + 1}/{epochs} | " + f"Train Loss: {train_metrics['loss']:.4f} | " + f"Val Loss: {val_metrics['loss']:.4f}" + ) + + history["train"].append(train_metrics) + history["val"].append(val_metrics) + + # Learning rate scheduling + scheduler.step(val_metrics["loss"]) + + # Save best model + if val_metrics["loss"] < best_val_loss: + best_val_loss = val_metrics["loss"] + best_state = {k: v.cpu().clone() for k, v in model.state_dict().items()} + logger.info(f" -> New best model (val_loss={best_val_loss:.4f})") + + # Early stopping + if early_stopping(val_metrics["loss"]): + logger.info(f"Early stopping at epoch {epoch + 1}") + break + + # Restore best model + if best_state is not None: + model.load_state_dict(best_state) + + return { + "history": history, + "best_val_loss": best_val_loss, + } + + +@app.command() +def main( + # 数据路径(已处理的 parquet 文件) + train_path: Path = PROCESSED_DATA_DIR / "train_pretrain.parquet", + val_path: Path = PROCESSED_DATA_DIR / "val_pretrain.parquet", + output_dir: Path = MODELS_DIR, + # 模型参数 + d_model: int = 256, + num_heads: int = 8, + n_attn_layers: int = 4, + set_transformer_block: str = "sab", # "sab" | "isab" + fusion_strategy: str = "attention", + head_hidden_dim: int = 128, + dropout: float = 0.1, + # MoE 参数(消融开关) + use_moe: bool = False, + moe_n_experts: int = 4, + moe_top_k: int = 2, + moe_expert_hidden_mult: int = 2, + moe_jitter_noise: float = 0.0, + # LLM 参数(消融开关) + use_llm: bool = False, + llm_model_path: str = DEFAULT_MOLT5_PATH, + llm_freeze: bool = True, + llm_use_lora: bool = False, + llm_lora_r: int = 8, + llm_lora_alpha: int = 16, + llm_lora_dropout: float = 0.05, + # MPNN 参数(可选) + use_mpnn: bool = False, # 启用 MPNN,自动从默认路径加载 ensemble + mpnn_checkpoint: Optional[str] = None, + mpnn_ensemble_paths: Optional[str] = None, + mpnn_device: str = "cpu", + # 训练参数 + batch_size: int = 64, + lr: float = 1e-4, + weight_decay: float = 1e-5, + epochs: int = 50, + patience: int = 10, + # 随机种子 + seed: int = 42, + # 设备 + device: str = "cuda" if torch.cuda.is_available() else "cpu", +): + """ + 在外部 LiON 数据上预训练 backbone + delivery head。 + + 需要先运行 `make data_pretrain` 生成 parquet 文件。 + + 使用 --use-mpnn 启用 MPNN encoder(自动从 models/mpnn/all_amine_split_for_LiON 加载)。 + + 产出: + - models/pretrain_delivery.pt: 包含 backbone + delivery head 权重 + - models/pretrain_history.json: 训练历史 + """ + set_global_seed(seed) + logger.info(f"Using device: {device} | seed: {seed}") + device_obj = torch.device(device) + + # 加载已处理的 parquet 文件 + logger.info(f"Loading train data from {train_path}") + train_df = pd.read_parquet(train_path) + train_dataset = ExternalDeliveryDataset(train_df) + + logger.info(f"Loading val data from {val_path}") + val_df = pd.read_parquet(val_path) + val_dataset = ExternalDeliveryDataset(val_df) + + logger.info(f"Train samples: {len(train_dataset)}, Val samples: {len(val_dataset)}") + + train_loader = DataLoader( + train_dataset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn + ) + val_loader = DataLoader( + val_dataset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn + ) + + # 解析 MPNN 配置 + # 优先级:mpnn_checkpoint > mpnn_ensemble_paths > use_mpnn(自动查找) + ensemble_paths_list = None + if mpnn_ensemble_paths: + ensemble_paths_list = mpnn_ensemble_paths.split(",") + elif use_mpnn and mpnn_checkpoint is None: + # --use-mpnn 但没有指定具体路径,自动查找 + logger.info(f"Auto-detecting MPNN ensemble from {DEFAULT_MPNN_ENSEMBLE_DIR}") + ensemble_paths_list = find_mpnn_ensemble_paths() + logger.info(f"Found {len(ensemble_paths_list)} MPNN models") + + enable_mpnn = mpnn_checkpoint is not None or ensemble_paths_list is not None + + # 创建模型 + logger.info( + f"Creating model (use_mpnn={enable_mpnn}, use_moe={use_moe}, use_llm={use_llm})..." + ) + common_kwargs = dict( + d_model=d_model, + num_heads=num_heads, + n_attn_layers=n_attn_layers, + set_transformer_block=set_transformer_block, + fusion_strategy=fusion_strategy, + head_hidden_dim=head_hidden_dim, + dropout=dropout, + use_moe=use_moe, + moe_n_experts=moe_n_experts, + moe_top_k=moe_top_k, + moe_expert_hidden_mult=moe_expert_hidden_mult, + moe_jitter_noise=moe_jitter_noise, + use_llm=use_llm, + llm_model_path=llm_model_path, + llm_freeze=llm_freeze, + llm_use_lora=llm_use_lora, + llm_lora_r=llm_lora_r, + llm_lora_alpha=llm_lora_alpha, + llm_lora_dropout=llm_lora_dropout, + ) + if enable_mpnn: + model = LNPModel( + mpnn_checkpoint=mpnn_checkpoint, + mpnn_ensemble_paths=ensemble_paths_list, + mpnn_device=mpnn_device, + **common_kwargs, + ) + else: + model = LNPModelWithoutMPNN(**common_kwargs) + + n_params_total = sum(p.numel() for p in model.parameters()) + n_params_trainable = sum(p.numel() for p in model.parameters() if p.requires_grad) + logger.info(f"Model parameters: {n_params_total:,} total, {n_params_trainable:,} trainable") + + # 预热 RDKit 缓存(避免训练时阻塞) + all_smiles = train_df["smiles"].tolist() + val_df["smiles"].tolist() + warmup_cache(model, all_smiles, batch_size=256) + + # 预训练 + logger.info("Starting pretraining on external data (delivery only)...") + result = pretrain( + train_loader=train_loader, + val_loader=val_loader, + model=model, + device=device_obj, + lr=lr, + weight_decay=weight_decay, + epochs=epochs, + patience=patience, + ) + + # 保存预训练 checkpoint + output_dir.mkdir(parents=True, exist_ok=True) + checkpoint_path = output_dir / "pretrain_delivery.pt" + torch.save( + { + "model_state_dict": model.state_dict(), + "backbone_state_dict": model.get_backbone_state_dict(), + "delivery_head_state_dict": model.get_delivery_head_state_dict(), + "config": { + "d_model": d_model, + "num_heads": num_heads, + "n_attn_layers": n_attn_layers, + "set_transformer_block": set_transformer_block, + "fusion_strategy": fusion_strategy, + "head_hidden_dim": head_hidden_dim, + "dropout": dropout, + "use_mpnn": enable_mpnn, + "use_moe": use_moe, + "moe_n_experts": moe_n_experts, + "moe_top_k": moe_top_k, + "moe_expert_hidden_mult": moe_expert_hidden_mult, + "moe_jitter_noise": moe_jitter_noise, + "use_llm": use_llm, + "llm_model_path": llm_model_path, + "llm_freeze": llm_freeze, + "llm_use_lora": llm_use_lora, + "llm_lora_r": llm_lora_r, + "llm_lora_alpha": llm_lora_alpha, + "llm_lora_dropout": llm_lora_dropout, + }, + "best_val_loss": result["best_val_loss"], + }, + checkpoint_path, + ) + logger.success(f"Saved pretrain checkpoint to {checkpoint_path}") + + # 保存训练历史 + history_path = output_dir / "pretrain_history.json" + with open(history_path, "w") as f: + json.dump(result["history"], f, indent=2) + logger.success(f"Saved pretrain history to {history_path}") + + # 绘制 loss 曲线图 + loss_plot_path = output_dir / "pretrain_loss_curves.png" + plot_loss_curves( + history=result["history"], + output_path=loss_plot_path, + title="Pretrain Loss Curves (Delivery)", + ) + logger.success(f"Saved loss curves plot to {loss_plot_path}") + + logger.success( + f"Pretraining complete! Best val_loss: {result['best_val_loss']:.4f}" + ) + + +@app.command() +def test( + # 数据路径 + val_path: Path = PROCESSED_DATA_DIR / "val_pretrain.parquet", + model_path: Path = MODELS_DIR / "pretrain_delivery.pt", + output_path: Path = MODELS_DIR / "pretrain_test_results.json", + # MPNN 参数 + use_mpnn: bool = False, + mpnn_device: str = "cpu", + # 其他参数 + batch_size: int = 64, + device: str = "cuda" if torch.cuda.is_available() else "cpu", +): + """ + 评估 pretrain 模型在外部数据上的 delivery 预测性能。 + + 输出详细指标:MSE, RMSE, MAE, R² + """ + import numpy as np + from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score + + logger.info(f"Using device: {device}") + device_obj = torch.device(device) + + # 加载模型 + logger.info(f"Loading pretrain model from {model_path}") + checkpoint = torch.load(model_path, map_location=device_obj, weights_only=False) + config = checkpoint["config"] + + # 解析 MPNN 配置 + enable_mpnn = config.get("use_mpnn", False) + common_kwargs = dict( + d_model=config["d_model"], + num_heads=config["num_heads"], + n_attn_layers=config["n_attn_layers"], + set_transformer_block=config.get("set_transformer_block", "sab"), + fusion_strategy=config["fusion_strategy"], + head_hidden_dim=config["head_hidden_dim"], + dropout=config["dropout"], + use_moe=config.get("use_moe", False), + moe_n_experts=config.get("moe_n_experts", 4), + moe_top_k=config.get("moe_top_k", 2), + moe_expert_hidden_mult=config.get("moe_expert_hidden_mult", 2), + moe_jitter_noise=config.get("moe_jitter_noise", 0.0), + use_llm=config.get("use_llm", False), + llm_model_path=config.get("llm_model_path", DEFAULT_MOLT5_PATH), + llm_freeze=config.get("llm_freeze", True), + llm_use_lora=config.get("llm_use_lora", False), + llm_lora_r=config.get("llm_lora_r", 8), + llm_lora_alpha=config.get("llm_lora_alpha", 16), + llm_lora_dropout=config.get("llm_lora_dropout", 0.05), + ) + if enable_mpnn or use_mpnn: + logger.info(f"Auto-detecting MPNN ensemble from {DEFAULT_MPNN_ENSEMBLE_DIR}") + ensemble_paths = find_mpnn_ensemble_paths() + logger.info(f"Found {len(ensemble_paths)} MPNN models") + model = LNPModel( + mpnn_ensemble_paths=ensemble_paths, + mpnn_device=mpnn_device, + **common_kwargs, + ) + else: + model = LNPModelWithoutMPNN(**common_kwargs) + + model.load_state_dict(checkpoint["model_state_dict"], strict=False) + model.to(device_obj) + model.eval() + + logger.info(f"Model config: {config}") + logger.info(f"Best val_loss from training: {checkpoint.get('best_val_loss', 'N/A')}") + + # 加载数据 + logger.info(f"Loading validation data from {val_path}") + val_df = pd.read_parquet(val_path) + val_dataset = ExternalDeliveryDataset(val_df) + val_loader = DataLoader( + val_dataset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn + ) + logger.info(f"Validation samples: {len(val_dataset)}") + + # 预测 + logger.info("Running predictions...") + all_preds = [] + all_targets = [] + all_masks = [] + + with torch.no_grad(): + for batch in tqdm(val_loader, desc="Predicting"): + smiles = batch["smiles"] + tabular = {k: v.to(device_obj) for k, v in batch["tabular"].items()} + targets = batch["targets"]["delivery"].numpy() + mask = batch["mask"]["delivery"].numpy() + + pred = model.forward_delivery(smiles, tabular).squeeze(-1).cpu().numpy() + + all_preds.extend(pred) + all_targets.extend(targets) + all_masks.extend(mask) + + # 转为数组 + all_preds = np.array(all_preds) + all_targets = np.array(all_targets) + all_masks = np.array(all_masks, dtype=bool) + + # 只计算有效样本 + y_pred = all_preds[all_masks] + y_true = all_targets[all_masks] + + # 计算指标 + mse = float(mean_squared_error(y_true, y_pred)) + rmse = float(np.sqrt(mse)) + mae = float(mean_absolute_error(y_true, y_pred)) + r2 = float(r2_score(y_true, y_pred)) + + # 额外统计 + correlation = float(np.corrcoef(y_true, y_pred)[0, 1]) + + results = { + "model_path": str(model_path), + "val_path": str(val_path), + "n_samples": int(all_masks.sum()), + "metrics": { + "mse": mse, + "rmse": rmse, + "mae": mae, + "r2": r2, + "correlation": correlation, + }, + "statistics": { + "y_true_mean": float(y_true.mean()), + "y_true_std": float(y_true.std()), + "y_pred_mean": float(y_pred.mean()), + "y_pred_std": float(y_pred.std()), + } + } + + # 打印结果 + logger.info("\n" + "=" * 50) + logger.info("PRETRAIN MODEL EVALUATION (Delivery)") + logger.info("=" * 50) + logger.info(f"Samples: {results['n_samples']}") + logger.info("\n[Metrics]") + logger.info(f" MSE: {mse:.4f}") + logger.info(f" RMSE: {rmse:.4f}") + logger.info(f" MAE: {mae:.4f}") + logger.info(f" R²: {r2:.4f}") + logger.info(f" Correlation: {correlation:.4f}") + logger.info("\n[Statistics]") + logger.info(f" True: mean={y_true.mean():.4f}, std={y_true.std():.4f}") + logger.info(f" Pred: mean={y_pred.mean():.4f}, std={y_pred.std():.4f}") + + # 保存结果 + with open(output_path, "w") as f: + json.dump(results, f, indent=2) + logger.success(f"\nSaved results to {output_path}") + + +if __name__ == "__main__": + app() + diff --git a/lnp_ml/modeling/trainer_balanced.py b/lnp_ml/modeling/trainer_balanced.py index 147cd5f..d873a4a 100644 --- a/lnp_ml/modeling/trainer_balanced.py +++ b/lnp_ml/modeling/trainer_balanced.py @@ -1,523 +1,551 @@ -"""带类权重的训练器:处理分类任务的数据不均衡问题""" - -from typing import Dict, List, Optional, Tuple -from dataclasses import dataclass, field - -import numpy as np -import torch -import torch.nn as nn -import torch.nn.functional as F -from torch.utils.data import DataLoader -from tqdm import tqdm - - -@dataclass -class ClassWeights: - """分类任务的类权重""" - pdi: Optional[torch.Tensor] = None # [4] for 4 PDI classes - ee: Optional[torch.Tensor] = None # [3] for 3 EE classes - toxic: Optional[torch.Tensor] = None # [2] for binary toxic - - -@dataclass -class LossWeightsBalanced: - """各任务的损失权重(与 trainer.py 的 LossWeights 兼容)""" - size: float = 1.0 - pdi: float = 1.0 - ee: float = 1.0 - delivery: float = 1.0 - biodist: float = 1.0 - toxic: float = 1.0 - moe_lb: float = 0.01 # MoE load-balancing 系数(仅在 use_moe=True 时生效) - - -def compute_class_weights_from_loader( - loader: DataLoader, - n_pdi_classes: int = 4, - n_ee_classes: int = 3, - n_toxic_classes: int = 2, - smoothing: float = 0.1, -) -> ClassWeights: - """ - 从 DataLoader 统计类别频次并计算类权重。 - - 使用 inverse frequency 方式:weight_c = N / (n_classes * count_c) - 加 smoothing 避免极端权重。 - - Args: - loader: DataLoader(需要遍历一次) - n_pdi_classes: PDI 类别数 - n_ee_classes: EE 类别数 - n_toxic_classes: toxic 类别数 - smoothing: 平滑系数(防止除零和极端权重) - - Returns: - ClassWeights 对象,包含各分类任务的类权重张量 - """ - pdi_counts = torch.zeros(n_pdi_classes) - ee_counts = torch.zeros(n_ee_classes) - toxic_counts = torch.zeros(n_toxic_classes) - - for batch in loader: - targets = batch["targets"] - mask = batch["mask"] - - # PDI - if "pdi" in targets and "pdi" in mask: - m = mask["pdi"] - if m.any(): - labels = targets["pdi"][m] - for c in range(n_pdi_classes): - pdi_counts[c] += (labels == c).sum().item() - - # EE - if "ee" in targets and "ee" in mask: - m = mask["ee"] - if m.any(): - labels = targets["ee"][m] - for c in range(n_ee_classes): - ee_counts[c] += (labels == c).sum().item() - - # Toxic - if "toxic" in targets and "toxic" in mask: - m = mask["toxic"] - if m.any(): - labels = targets["toxic"][m] - for c in range(n_toxic_classes): - toxic_counts[c] += (labels == c).sum().item() - - def counts_to_weights(counts: torch.Tensor, n_classes: int) -> Optional[torch.Tensor]: - """将计数转换为类权重""" - total = counts.sum().item() - if total == 0: - return None - # Inverse frequency with smoothing - counts = counts + smoothing - weights = total / (n_classes * counts) - # Normalize to mean=1 - weights = weights / weights.mean() - return weights - - return ClassWeights( - pdi=counts_to_weights(pdi_counts, n_pdi_classes), - ee=counts_to_weights(ee_counts, n_ee_classes), - toxic=counts_to_weights(toxic_counts, n_toxic_classes), - ) - - -def compute_multitask_loss_balanced( - outputs: Dict[str, torch.Tensor], - targets: Dict[str, torch.Tensor], - mask: Dict[str, torch.Tensor], - task_weights: Optional[LossWeightsBalanced] = None, - class_weights: Optional[ClassWeights] = None, - model: Optional[nn.Module] = None, -) -> Tuple[torch.Tensor, Dict[str, torch.Tensor]]: - """ - 计算带类权重的多任务损失。 - - Args: - outputs: 模型输出 - targets: 真实标签 - mask: 有效样本掩码 - task_weights: 各任务权重 - class_weights: 分类任务的类权重 - - Returns: - (total_loss, loss_dict) 总损失和各任务损失 - """ - task_weights = task_weights or LossWeightsBalanced() - class_weights = class_weights or ClassWeights() - - losses = {} - device = next(iter(outputs.values())).device - total_loss = torch.tensor(0.0, device=device) - - # size: MSE loss(回归任务,不需要类权重) - if "size" in targets and mask["size"].any(): - m = mask["size"] - pred = outputs["size"][m].squeeze(-1) - tgt = targets["size"][m] - losses["size"] = F.mse_loss(pred, tgt) - total_loss = total_loss + task_weights.size * losses["size"] - - # delivery: MSE loss(回归任务,不需要类权重) - if "delivery" in targets and mask["delivery"].any(): - m = mask["delivery"] - pred = outputs["delivery"][m].squeeze(-1) - tgt = targets["delivery"][m] - losses["delivery"] = F.mse_loss(pred, tgt) - total_loss = total_loss + task_weights.delivery * losses["delivery"] - - # pdi: CrossEntropy with class weights - if "pdi" in targets and mask["pdi"].any(): - m = mask["pdi"] - pred = outputs["pdi"][m] - tgt = targets["pdi"][m] - weight = class_weights.pdi.to(device) if class_weights.pdi is not None else None - losses["pdi"] = F.cross_entropy(pred, tgt, weight=weight) - total_loss = total_loss + task_weights.pdi * losses["pdi"] - - # ee: CrossEntropy with class weights - if "ee" in targets and mask["ee"].any(): - m = mask["ee"] - pred = outputs["ee"][m] - tgt = targets["ee"][m] - weight = class_weights.ee.to(device) if class_weights.ee is not None else None - losses["ee"] = F.cross_entropy(pred, tgt, weight=weight) - total_loss = total_loss + task_weights.ee * losses["ee"] - - # toxic: CrossEntropy with class weights - if "toxic" in targets and mask["toxic"].any(): - m = mask["toxic"] - pred = outputs["toxic"][m] - tgt = targets["toxic"][m] - weight = class_weights.toxic.to(device) if class_weights.toxic is not None else None - losses["toxic"] = F.cross_entropy(pred, tgt, weight=weight) - total_loss = total_loss + task_weights.toxic * losses["toxic"] - - # biodist: KL divergence(分布任务,不需要类权重) - if "biodist" in targets and mask["biodist"].any(): - m = mask["biodist"] - pred = outputs["biodist"][m] - tgt = targets["biodist"][m] - losses["biodist"] = F.kl_div( - pred.log().clamp(min=-100), - tgt, - reduction="batchmean", - ) - total_loss = total_loss + task_weights.biodist * losses["biodist"] - - # MoE load-balancing aux loss(可选) - if model is not None and hasattr(model, "get_last_moe_extras"): - extras = model.get_last_moe_extras() - if extras is not None and "lb_loss" in extras: - losses["moe_lb"] = extras["lb_loss"] - total_loss = total_loss + task_weights.moe_lb * losses["moe_lb"] - - return total_loss, losses - - -def train_epoch_balanced( - model: nn.Module, - loader: DataLoader, - optimizer: torch.optim.Optimizer, - device: torch.device, - task_weights: Optional[LossWeightsBalanced] = None, - class_weights: Optional[ClassWeights] = None, -) -> Dict[str, float]: - """带类权重的训练一个 epoch""" - model.train() - total_loss = 0.0 - task_losses = {k: 0.0 for k in ["size", "pdi", "ee", "delivery", "biodist", "toxic", "moe_lb"]} - n_batches = 0 - - for batch in tqdm(loader, desc="Training", leave=False): - smiles = batch["smiles"] - tabular = {k: v.to(device) for k, v in batch["tabular"].items()} - targets = {k: v.to(device) for k, v in batch["targets"].items()} - mask = {k: v.to(device) for k, v in batch["mask"].items()} - - optimizer.zero_grad() - outputs = model(smiles, tabular) - loss, losses = compute_multitask_loss_balanced( - outputs, targets, mask, task_weights, class_weights, model=model, - ) - - loss.backward() - torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) - optimizer.step() - - total_loss += loss.item() - for k, v in losses.items(): - task_losses[k] += v.item() - n_batches += 1 - - return { - "loss": total_loss / n_batches, - **{f"loss_{k}": v / n_batches for k, v in task_losses.items() if v > 0}, - } - - -@torch.no_grad() -def validate_balanced( - model: nn.Module, - loader: DataLoader, - device: torch.device, - task_weights: Optional[LossWeightsBalanced] = None, - class_weights: Optional[ClassWeights] = None, -) -> Dict[str, float]: - """带类权重的验证""" - model.eval() - total_loss = 0.0 - task_losses = {k: 0.0 for k in ["size", "pdi", "ee", "delivery", "biodist", "toxic", "moe_lb"]} - n_batches = 0 - - # 用于计算准确率 - correct = {k: 0 for k in ["pdi", "ee", "toxic"]} - total = {k: 0 for k in ["pdi", "ee", "toxic"]} - - for batch in tqdm(loader, desc="Validating", leave=False): - smiles = batch["smiles"] - tabular = {k: v.to(device) for k, v in batch["tabular"].items()} - targets = {k: v.to(device) for k, v in batch["targets"].items()} - mask = {k: v.to(device) for k, v in batch["mask"].items()} - - outputs = model(smiles, tabular) - loss, losses = compute_multitask_loss_balanced( - outputs, targets, mask, task_weights, class_weights, model=model, - ) - - total_loss += loss.item() - for k, v in losses.items(): - task_losses[k] += v.item() - n_batches += 1 - - # 计算分类准确率 - for k in ["pdi", "ee", "toxic"]: - if k in targets and mask[k].any(): - m = mask[k] - pred = outputs[k][m].argmax(dim=-1) - tgt = targets[k][m] - correct[k] += (pred == tgt).sum().item() - total[k] += m.sum().item() - - metrics = { - "loss": total_loss / n_batches, - **{f"loss_{k}": v / n_batches for k, v in task_losses.items() if v > 0}, - } - - # 添加准确率 - for k in ["pdi", "ee", "toxic"]: - if total[k] > 0: - metrics[f"acc_{k}"] = correct[k] / total[k] - - return metrics - - -BACKBONE_PREFIXES = ("token_projector.", "cross_attention.", "fusion.", "moe.") - - -def build_optimizer( - model: nn.Module, - lr: float, - weight_decay: float, - backbone_lr_ratio: float = 1.0, -) -> torch.optim.AdamW: - """ - 构建 AdamW 优化器,支持分层学习率。 - - 当 backbone_lr_ratio < 1.0 时,backbone 参数使用 lr * backbone_lr_ratio, - 其余参数(task heads 等)使用 lr。backbone_lr_ratio = 1.0 等价于统一学习率。 - """ - if backbone_lr_ratio >= 1.0: - return torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=weight_decay) - - backbone_params = [] - head_params = [] - for name, param in model.named_parameters(): - if not param.requires_grad: - continue - if name.startswith(BACKBONE_PREFIXES): - backbone_params.append(param) - else: - head_params.append(param) - - return torch.optim.AdamW( - [ - {"params": backbone_params, "lr": lr * backbone_lr_ratio}, - {"params": head_params, "lr": lr}, - ], - weight_decay=weight_decay, - ) - - -class EarlyStoppingBalanced: - """早停机制(与 trainer.py 的 EarlyStopping 兼容)""" - - def __init__(self, patience: int = 10, min_delta: float = 0.0): - self.patience = patience - self.min_delta = min_delta - self.counter = 0 - self.best_loss = float("inf") - self.best_epoch = 0 - self.should_stop = False - - def __call__(self, val_loss: float, epoch: int = 0) -> bool: - if val_loss < self.best_loss - self.min_delta: - self.best_loss = val_loss - self.best_epoch = epoch - self.counter = 0 - else: - self.counter += 1 - if self.counter >= self.patience: - self.should_stop = True - return self.should_stop - - def get_best_epoch(self) -> int: - """获取最佳 epoch(1-indexed)""" - return self.best_epoch + 1 - - -def train_with_early_stopping( - model: nn.Module, - train_loader: DataLoader, - val_loader: DataLoader, - device: torch.device, - lr: float = 1e-4, - weight_decay: float = 1e-5, - epochs: int = 100, - patience: int = 15, - task_weights: Optional[LossWeightsBalanced] = None, - class_weights: Optional[ClassWeights] = None, - backbone_lr_ratio: float = 1.0, -) -> Dict: - """ - 带早停的完整训练流程。 - - Returns: - Dict with keys: history, best_val_loss, best_epoch, best_state - """ - model = model.to(device) - optimizer = build_optimizer(model, lr, weight_decay, backbone_lr_ratio) - scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( - optimizer, mode="min", factor=0.5, patience=5 - ) - early_stopping = EarlyStoppingBalanced(patience=patience) - - history = {"train": [], "val": []} - best_val_loss = float("inf") - best_state = None - - for epoch in range(epochs): - # Train - train_metrics = train_epoch_balanced( - model, train_loader, optimizer, device, task_weights, class_weights - ) - - # Validate - val_metrics = validate_balanced( - model, val_loader, device, task_weights, class_weights - ) - - history["train"].append(train_metrics) - history["val"].append(val_metrics) - - # Learning rate scheduling - scheduler.step(val_metrics["loss"]) - - # Save best model - if val_metrics["loss"] < best_val_loss: - best_val_loss = val_metrics["loss"] - best_state = {k: v.cpu().clone() for k, v in model.state_dict().items()} - - # Early stopping - if early_stopping(val_metrics["loss"], epoch): - break - - # Restore best model - if best_state is not None: - model.load_state_dict(best_state) - - return { - "history": history, - "best_val_loss": best_val_loss, - "best_epoch": early_stopping.get_best_epoch(), - "best_state": best_state, - "epochs_trained": len(history["train"]), - } - - -def train_fixed_epochs( - model: nn.Module, - train_loader: DataLoader, - val_loader: Optional[DataLoader], - device: torch.device, - lr: float = 1e-4, - weight_decay: float = 1e-5, - epochs: int = 50, - task_weights: Optional[LossWeightsBalanced] = None, - class_weights: Optional[ClassWeights] = None, - use_cosine_annealing: bool = True, - use_swa: bool = False, - swa_start_epoch: Optional[int] = None, - backbone_lr_ratio: float = 1.0, -) -> Dict: - """ - 固定 epoch 数的训练(不使用 early stopping)。 - - 用于外层 CV 训练和最终训练。 - - Args: - model: 模型 - train_loader: 训练数据 - val_loader: 验证数据(可选,仅用于监控) - device: 设备 - lr: 学习率 - weight_decay: 权重衰减 - epochs: 训练轮数 - task_weights: 任务权重 - class_weights: 类权重 - use_cosine_annealing: 是否使用 CosineAnnealingLR - use_swa: 是否使用 SWA - swa_start_epoch: SWA 开始的 epoch(默认为 epochs * 0.75) - backbone_lr_ratio: backbone 学习率相对于 head 的比例(1.0 = 统一学习率) - - Returns: - Dict with keys: history, final_state - """ - model = model.to(device) - optimizer = build_optimizer(model, lr, weight_decay, backbone_lr_ratio) - - if use_cosine_annealing: - scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs) - else: - scheduler = None - - # SWA setup - swa_model = None - swa_scheduler = None - if use_swa: - from torch.optim.swa_utils import AveragedModel, SWALR - swa_model = AveragedModel(model) - swa_start = swa_start_epoch or int(epochs * 0.75) - swa_scheduler = SWALR(optimizer, swa_lr=lr * 0.1) - - history = {"train": [], "val": []} - - for epoch in range(epochs): - # Train - train_metrics = train_epoch_balanced( - model, train_loader, optimizer, device, task_weights, class_weights - ) - history["train"].append(train_metrics) - - # Validate (optional) - if val_loader is not None: - val_metrics = validate_balanced( - model, val_loader, device, task_weights, class_weights - ) - history["val"].append(val_metrics) - - # Scheduler step - if use_swa and epoch >= swa_start: - swa_model.update_parameters(model) - swa_scheduler.step() - elif scheduler is not None: - scheduler.step() - - # Finalize SWA - final_state = None - if use_swa and swa_model is not None: - # Update batch normalization statistics - torch.optim.swa_utils.update_bn(train_loader, swa_model, device=device) - final_state = {k: v.cpu().clone() for k, v in swa_model.module.state_dict().items()} - else: - final_state = {k: v.cpu().clone() for k, v in model.state_dict().items()} - - return { - "history": history, - "final_state": final_state, - "epochs_trained": epochs, - } - +"""带类权重的训练器:处理分类任务的数据不均衡问题""" + +from typing import Dict, List, Optional, Tuple +from dataclasses import dataclass, field + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.utils.data import DataLoader +from tqdm import tqdm + + +@dataclass +class ClassWeights: + """分类任务的类权重""" + pdi: Optional[torch.Tensor] = None # [4] for 4 PDI classes + ee: Optional[torch.Tensor] = None # [3] for 3 EE classes + toxic: Optional[torch.Tensor] = None # [2] for binary toxic + + +@dataclass +class LossWeightsBalanced: + """各任务的损失权重(与 trainer.py 的 LossWeights 兼容)""" + size: float = 1.0 + pdi: float = 1.0 + ee: float = 1.0 + delivery: float = 1.0 + biodist: float = 1.0 + toxic: float = 1.0 + moe_lb: float = 0.01 # MoE load-balancing 系数(仅在 use_moe=True 时生效) + moe_lb: float = 0.01 # MoE load-balancing 系数(仅在 use_moe=True 时生效) + + +def compute_class_weights_from_loader( + loader: DataLoader, + n_pdi_classes: int = 4, + n_ee_classes: int = 3, + n_toxic_classes: int = 2, + smoothing: float = 0.1, +) -> ClassWeights: + """ + 从 DataLoader 统计类别频次并计算类权重。 + + 使用 inverse frequency 方式:weight_c = N / (n_classes * count_c) + 加 smoothing 避免极端权重。 + + Args: + loader: DataLoader(需要遍历一次) + n_pdi_classes: PDI 类别数 + n_ee_classes: EE 类别数 + n_toxic_classes: toxic 类别数 + smoothing: 平滑系数(防止除零和极端权重) + + Returns: + ClassWeights 对象,包含各分类任务的类权重张量 + """ + pdi_counts = torch.zeros(n_pdi_classes) + ee_counts = torch.zeros(n_ee_classes) + toxic_counts = torch.zeros(n_toxic_classes) + + for batch in loader: + targets = batch["targets"] + mask = batch["mask"] + + # PDI + if "pdi" in targets and "pdi" in mask: + m = mask["pdi"] + if m.any(): + labels = targets["pdi"][m] + for c in range(n_pdi_classes): + pdi_counts[c] += (labels == c).sum().item() + + # EE + if "ee" in targets and "ee" in mask: + m = mask["ee"] + if m.any(): + labels = targets["ee"][m] + for c in range(n_ee_classes): + ee_counts[c] += (labels == c).sum().item() + + # Toxic + if "toxic" in targets and "toxic" in mask: + m = mask["toxic"] + if m.any(): + labels = targets["toxic"][m] + for c in range(n_toxic_classes): + toxic_counts[c] += (labels == c).sum().item() + + def counts_to_weights(counts: torch.Tensor, n_classes: int) -> Optional[torch.Tensor]: + """将计数转换为类权重""" + total = counts.sum().item() + if total == 0: + return None + # Inverse frequency with smoothing + counts = counts + smoothing + weights = total / (n_classes * counts) + # Normalize to mean=1 + weights = weights / weights.mean() + return weights + + return ClassWeights( + pdi=counts_to_weights(pdi_counts, n_pdi_classes), + ee=counts_to_weights(ee_counts, n_ee_classes), + toxic=counts_to_weights(toxic_counts, n_toxic_classes), + ) + + +def compute_multitask_loss_balanced( + outputs: Dict[str, torch.Tensor], + targets: Dict[str, torch.Tensor], + mask: Dict[str, torch.Tensor], + task_weights: Optional[LossWeightsBalanced] = None, + class_weights: Optional[ClassWeights] = None, + model: Optional[nn.Module] = None, + model: Optional[nn.Module] = None, +) -> Tuple[torch.Tensor, Dict[str, torch.Tensor]]: + """ + 计算带类权重的多任务损失。 + + Args: + outputs: 模型输出 + targets: 真实标签 + mask: 有效样本掩码 + task_weights: 各任务权重 + class_weights: 分类任务的类权重 + + Returns: + (total_loss, loss_dict) 总损失和各任务损失 + """ + task_weights = task_weights or LossWeightsBalanced() + class_weights = class_weights or ClassWeights() + + # 若模型 head 暴露 log_vars,则启用不确定性加权(自动平衡),否则回退到标量权重 + log_vars = None + if model is not None and hasattr(model, "head") and hasattr(model.head, "log_vars"): + log_vars = model.head.log_vars + + losses = {} + device = next(iter(outputs.values())).device + total_loss = torch.tensor(0.0, device=device) + + def _add(name: str, raw_loss: torch.Tensor, scalar_w: float) -> None: + nonlocal total_loss + losses[name] = raw_loss + if log_vars is not None and name in log_vars: + s = log_vars[name] + total_loss = total_loss + torch.exp(-s) * raw_loss + 0.5 * s + else: + total_loss = total_loss + scalar_w * raw_loss + + # size: MSE + if "size" in targets and mask["size"].any(): + m = mask["size"] + _add("size", F.mse_loss(outputs["size"][m].squeeze(-1), targets["size"][m]), task_weights.size) + + # delivery: MSE + if "delivery" in targets and mask["delivery"].any(): + m = mask["delivery"] + _add("delivery", F.mse_loss(outputs["delivery"][m].squeeze(-1), targets["delivery"][m]), task_weights.delivery) + + # pdi: 类加权 CE + if "pdi" in targets and mask["pdi"].any(): + m = mask["pdi"] + w = class_weights.pdi.to(device) if class_weights.pdi is not None else None + _add("pdi", F.cross_entropy(outputs["pdi"][m], targets["pdi"][m], weight=w), task_weights.pdi) + + # ee: 类加权 CE + if "ee" in targets and mask["ee"].any(): + m = mask["ee"] + w = class_weights.ee.to(device) if class_weights.ee is not None else None + _add("ee", F.cross_entropy(outputs["ee"][m], targets["ee"][m], weight=w), task_weights.ee) + + # toxic: 类加权 CE + if "toxic" in targets and mask["toxic"].any(): + m = mask["toxic"] + w = class_weights.toxic.to(device) if class_weights.toxic is not None else None + _add("toxic", F.cross_entropy(outputs["toxic"][m], targets["toxic"][m], weight=w), task_weights.toxic) + + # biodist: KL + if "biodist" in targets and mask["biodist"].any(): + m = mask["biodist"] + kl = F.kl_div(outputs["biodist"][m].log().clamp(min=-100), targets["biodist"][m], reduction="batchmean") + _add("biodist", kl, task_weights.biodist) + + # MoE load-balancing aux loss(固定小权重,不纳入不确定性加权) + if model is not None and hasattr(model, "get_last_moe_extras"): + extras = model.get_last_moe_extras() + if extras is not None and "lb_loss" in extras: + losses["moe_lb"] = extras["lb_loss"] + total_loss = total_loss + task_weights.moe_lb * losses["moe_lb"] + + return total_loss, losses + + +def train_epoch_balanced( + model: nn.Module, + loader: DataLoader, + optimizer: torch.optim.Optimizer, + device: torch.device, + task_weights: Optional[LossWeightsBalanced] = None, + class_weights: Optional[ClassWeights] = None, +) -> Dict[str, float]: + """带类权重的训练一个 epoch""" + model.train() + total_loss = 0.0 + task_losses = {k: 0.0 for k in ["size", "pdi", "ee", "delivery", "biodist", "toxic", "moe_lb"]} + task_losses = {k: 0.0 for k in ["size", "pdi", "ee", "delivery", "biodist", "toxic", "moe_lb"]} + n_batches = 0 + + for batch in tqdm(loader, desc="Training", leave=False): + smiles = batch["smiles"] + tabular = {k: v.to(device) for k, v in batch["tabular"].items()} + targets = {k: v.to(device) for k, v in batch["targets"].items()} + mask = {k: v.to(device) for k, v in batch["mask"].items()} + + optimizer.zero_grad() + outputs = model(smiles, tabular) + loss, losses = compute_multitask_loss_balanced( + outputs, targets, mask, task_weights, class_weights, model=model, + outputs, targets, mask, task_weights, class_weights, model=model, + ) + + loss.backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) + optimizer.step() + + total_loss += loss.item() + for k, v in losses.items(): + task_losses[k] += v.item() + n_batches += 1 + + return { + "loss": total_loss / n_batches, + **{f"loss_{k}": v / n_batches for k, v in task_losses.items() if v > 0}, + } + + +@torch.no_grad() +def validate_balanced( + model: nn.Module, + loader: DataLoader, + device: torch.device, + task_weights: Optional[LossWeightsBalanced] = None, + class_weights: Optional[ClassWeights] = None, +) -> Dict[str, float]: + """带类权重的验证""" + model.eval() + total_loss = 0.0 + task_losses = {k: 0.0 for k in ["size", "pdi", "ee", "delivery", "biodist", "toxic", "moe_lb"]} + task_losses = {k: 0.0 for k in ["size", "pdi", "ee", "delivery", "biodist", "toxic", "moe_lb"]} + n_batches = 0 + + # 用于计算准确率 + correct = {k: 0 for k in ["pdi", "ee", "toxic"]} + total = {k: 0 for k in ["pdi", "ee", "toxic"]} + + for batch in tqdm(loader, desc="Validating", leave=False): + smiles = batch["smiles"] + tabular = {k: v.to(device) for k, v in batch["tabular"].items()} + targets = {k: v.to(device) for k, v in batch["targets"].items()} + mask = {k: v.to(device) for k, v in batch["mask"].items()} + + outputs = model(smiles, tabular) + loss, losses = compute_multitask_loss_balanced( + outputs, targets, mask, task_weights, class_weights, model=model, + outputs, targets, mask, task_weights, class_weights, model=model, + ) + + total_loss += loss.item() + for k, v in losses.items(): + task_losses[k] += v.item() + n_batches += 1 + + # 计算分类准确率 + for k in ["pdi", "ee", "toxic"]: + if k in targets and mask[k].any(): + m = mask[k] + pred = outputs[k][m].argmax(dim=-1) + tgt = targets[k][m] + correct[k] += (pred == tgt).sum().item() + total[k] += m.sum().item() + + metrics = { + "loss": total_loss / n_batches, + **{f"loss_{k}": v / n_batches for k, v in task_losses.items() if v > 0}, + } + + # 添加准确率 + for k in ["pdi", "ee", "toxic"]: + if total[k] > 0: + metrics[f"acc_{k}"] = correct[k] / total[k] + + return metrics + + +BACKBONE_PREFIXES = ( + "token_projector.", + "set_transformer.", + "fusion.", + "moe.", + "llm_prompt.", +) + +FROM_SCRATCH_PREFIXES = ( + "moe.", + "llm_prompt.", + "fusion.g_moe", + "fusion.g_llm", +) + + +def build_optimizer( + model: nn.Module, + lr: float, + weight_decay: float, + backbone_lr_ratio: float = 1.0, +) -> torch.optim.AdamW: + """ + 构建 AdamW 优化器,支持分层学习率。 + + 仅收集 requires_grad=True 的参数(冻结的 MolT5 encoder 被排除)。 + 当 backbone_lr_ratio < 1.0 时,backbone 参数使用 lr * backbone_lr_ratio, + 其余参数(task heads 等)使用 lr。backbone_lr_ratio = 1.0 等价于统一学习率。 + """ + trainable = [(n, p) for n, p in model.named_parameters() if p.requires_grad] + + if backbone_lr_ratio >= 1.0: + return torch.optim.AdamW( + [p for _, p in trainable], lr=lr, weight_decay=weight_decay + ) + + backbone_params = [] + head_params = [] + for name, param in trainable: + if name.startswith(BACKBONE_PREFIXES) and not name.startswith(FROM_SCRATCH_PREFIXES): + backbone_params.append(param) + else: + head_params.append(param) + + return torch.optim.AdamW( + [ + {"params": backbone_params, "lr": lr * backbone_lr_ratio}, + {"params": head_params, "lr": lr}, + ], + weight_decay=weight_decay, + ) + + +class EarlyStoppingBalanced: + """早停机制(与 trainer.py 的 EarlyStopping 兼容)""" + + def __init__(self, patience: int = 10, min_delta: float = 0.0): + self.patience = patience + self.min_delta = min_delta + self.counter = 0 + self.best_loss = float("inf") + self.best_epoch = 0 + self.should_stop = False + + def __call__(self, val_loss: float, epoch: int = 0) -> bool: + if val_loss < self.best_loss - self.min_delta: + self.best_loss = val_loss + self.best_epoch = epoch + self.counter = 0 + else: + self.counter += 1 + if self.counter >= self.patience: + self.should_stop = True + return self.should_stop + + def get_best_epoch(self) -> int: + """获取最佳 epoch(1-indexed)""" + return self.best_epoch + 1 + + +def train_with_early_stopping( + model: nn.Module, + train_loader: DataLoader, + val_loader: DataLoader, + device: torch.device, + lr: float = 1e-4, + weight_decay: float = 1e-5, + epochs: int = 100, + patience: int = 15, + task_weights: Optional[LossWeightsBalanced] = None, + class_weights: Optional[ClassWeights] = None, + backbone_lr_ratio: float = 1.0, +) -> Dict: + """ + 带早停的完整训练流程。 + + Returns: + Dict with keys: history, best_val_loss, best_epoch, best_state + """ + model = model.to(device) + optimizer = build_optimizer(model, lr, weight_decay, backbone_lr_ratio) + scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + optimizer, mode="min", factor=0.5, patience=5 + ) + early_stopping = EarlyStoppingBalanced(patience=patience) + + history = {"train": [], "val": []} + best_val_loss = float("inf") + best_state = None + + for epoch in range(epochs): + # Train + train_metrics = train_epoch_balanced( + model, train_loader, optimizer, device, task_weights, class_weights + ) + + # Validate + val_metrics = validate_balanced( + model, val_loader, device, task_weights, class_weights + ) + + history["train"].append(train_metrics) + history["val"].append(val_metrics) + + # Learning rate scheduling + scheduler.step(val_metrics["loss"]) + + # Save best model + if val_metrics["loss"] < best_val_loss: + best_val_loss = val_metrics["loss"] + best_state = {k: v.cpu().clone() for k, v in model.state_dict().items()} + + # Early stopping + if early_stopping(val_metrics["loss"], epoch): + break + + # Restore best model + if best_state is not None: + model.load_state_dict(best_state) + + return { + "history": history, + "best_val_loss": best_val_loss, + "best_epoch": early_stopping.get_best_epoch(), + "best_state": best_state, + "epochs_trained": len(history["train"]), + } + + +def train_fixed_epochs( + model: nn.Module, + train_loader: DataLoader, + val_loader: Optional[DataLoader], + device: torch.device, + lr: float = 1e-4, + weight_decay: float = 1e-5, + epochs: int = 50, + task_weights: Optional[LossWeightsBalanced] = None, + class_weights: Optional[ClassWeights] = None, + use_cosine_annealing: bool = True, + use_swa: bool = False, + swa_start_epoch: Optional[int] = None, + backbone_lr_ratio: float = 1.0, + freeze_backbone_epochs: int = 0, +) -> Dict: + """ + 固定 epoch 数的训练(不使用 early stopping)。 + + 用于外层 CV 训练和最终训练。 + + Args: + model: 模型 + train_loader: 训练数据 + val_loader: 验证数据(可选,仅用于监控) + device: 设备 + lr: 学习率 + weight_decay: 权重衰减 + epochs: 训练轮数 + task_weights: 任务权重 + class_weights: 类权重 + use_cosine_annealing: 是否使用 CosineAnnealingLR + use_swa: 是否使用 SWA + swa_start_epoch: SWA 开始的 epoch(默认为 epochs * 0.75) + backbone_lr_ratio: backbone 学习率相对于 head 的比例(1.0 = 统一学习率) + + Returns: + Dict with keys: history, final_state + """ + model = model.to(device) + optimizer = build_optimizer(model, lr, weight_decay, backbone_lr_ratio) + + backbone_named = [ + (n, p) for n, p in model.named_parameters() + if n.startswith(BACKBONE_PREFIXES) and not n.startswith(FROM_SCRATCH_PREFIXES) + and p.requires_grad + ] + if freeze_backbone_epochs > 0: + for _, p in backbone_named: + p.requires_grad_(False) + + if use_cosine_annealing: + scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs) + else: + scheduler = None + + # SWA setup + swa_model = None + swa_scheduler = None + if use_swa: + from torch.optim.swa_utils import AveragedModel, SWALR + swa_model = AveragedModel(model) + swa_start = swa_start_epoch or int(epochs * 0.75) + swa_scheduler = SWALR(optimizer, swa_lr=lr * 0.1) + + history = {"train": [], "val": []} + + for epoch in range(epochs): + if freeze_backbone_epochs > 0 and epoch == freeze_backbone_epochs: + for _, p in backbone_named: + p.requires_grad_(True) + # Train + train_metrics = train_epoch_balanced( + model, train_loader, optimizer, device, task_weights, class_weights + ) + history["train"].append(train_metrics) + + # Validate (optional) + if val_loader is not None: + val_metrics = validate_balanced( + model, val_loader, device, task_weights, class_weights + ) + history["val"].append(val_metrics) + + # Scheduler step + if use_swa and epoch >= swa_start: + swa_model.update_parameters(model) + swa_scheduler.step() + elif scheduler is not None: + scheduler.step() + + # Finalize SWA + final_state = None + if use_swa and swa_model is not None: + # Update batch normalization statistics + torch.optim.swa_utils.update_bn(train_loader, swa_model, device=device) + final_state = {k: v.cpu().clone() for k, v in swa_model.module.state_dict().items()} + else: + final_state = {k: v.cpu().clone() for k, v in model.state_dict().items()} + + return { + "history": history, + "final_state": final_state, + "epochs_trained": epochs, + } + diff --git a/lnp_ml/utils/seed.py b/lnp_ml/utils/seed.py new file mode 100644 index 0000000..fd7f199 --- /dev/null +++ b/lnp_ml/utils/seed.py @@ -0,0 +1,19 @@ +"""全局随机种子工具。""" + +import random + +import numpy as np +import torch + + +def set_global_seed(seed: int) -> None: + """固定 random / numpy / torch 种子,提升可复现性。 + + 不开启 cudnn deterministic,以免显著拖慢训练;如需严格复现可自行追加: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + """ + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_0/best_params.json b/models/abl/baseline/20260617_180556/outer_fold_0/best_params.json new file mode 100644 index 0000000..3e2c1aa --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_0/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.28242799368681437, + "lr": 0.00037183641805732076, + "weight_decay": 6.290644294586152e-05, + "backbone_lr_ratio": 0.10677482709481352, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_0/splits.json b/models/abl/baseline/20260617_180556/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_0/test_metrics.json b/models/abl/baseline/20260617_180556/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..f809c65 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.32790454280151365, + "rmse": 0.572629498717551, + "mae": 0.35871042688208893, + "r2": -0.08876073797082196 + }, + "delivery": { + "n_samples": 58, + "mse": 0.7250728333301815, + "rmse": 0.8515120864263651, + "mae": 0.7098816664696768, + "r2": 0.07838867510225656 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.3435971685971686, + "recall": 0.5359094457455114, + "f1": 0.34977324263038545 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7142857142857143, + "precision": 0.6871101871101871, + "recall": 0.707142857142857, + "f1": 0.6756066411238826 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.4073394583325288, + "js_divergence": 0.092887269703335 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_1/best_params.json b/models/abl/baseline/20260617_180556/outer_fold_1/best_params.json new file mode 100644 index 0000000..b8d0ca3 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_1/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.23085562232445592, + "lr": 0.0005227270589225132, + "weight_decay": 0.00461701039547356, + "backbone_lr_ratio": 0.12087164274488635, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_1/splits.json b/models/abl/baseline/20260617_180556/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_1/test_metrics.json b/models/abl/baseline/20260617_180556/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..e5102fb --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.233876145855699, + "rmse": 0.4836074294876982, + "mae": 0.3760785318556286, + "r2": -2.874543407510119 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0238964615450643, + "rmse": 1.0118776910007772, + "mae": 0.6578027546466862, + "r2": 0.2249841902125319 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5238095238095238, + "precision": 0.34497354497354493, + "recall": 0.3280423280423281, + "f1": 0.3231922398589065 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5595238095238095, + "precision": 0.5101731601731602, + "recall": 0.5036154321868608, + "f1": 0.48790324563862697 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.48528378254405913, + "js_divergence": 0.12258377401744426 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_2/best_params.json b/models/abl/baseline/20260617_180556/outer_fold_2/best_params.json new file mode 100644 index 0000000..e460f37 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_2/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.18117503720006686, + "lr": 8.135394049241399e-05, + "weight_decay": 0.015076469897649124, + "backbone_lr_ratio": 0.9586175198423679, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_2/splits.json b/models/abl/baseline/20260617_180556/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_2/test_metrics.json b/models/abl/baseline/20260617_180556/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..2a51f0f --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.07870736214858826, + "rmse": 0.28054832408800495, + "mae": 0.2252055633635748, + "r2": 0.15667568332606574 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6624288051399898, + "rmse": 0.8138972939750997, + "mae": 0.5578871982870623, + "r2": 0.118192445613993 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.43453195231581004, + "recall": 0.7014848950332823, + "f1": 0.4452380952380952 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6140109890109889, + "recall": 0.6785714285714285, + "f1": 0.6262626262626263 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3967825471495568, + "js_divergence": 0.1057568924841401 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_3/best_params.json b/models/abl/baseline/20260617_180556/outer_fold_3/best_params.json new file mode 100644 index 0000000..2a7e11e --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_3/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.1799936812783694, + "lr": 0.00033865324369584493, + "weight_decay": 0.01440133094015265, + "backbone_lr_ratio": 0.3278334190266755, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_3/splits.json b/models/abl/baseline/20260617_180556/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_3/test_metrics.json b/models/abl/baseline/20260617_180556/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..5b4cdb8 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.477705869562307, + "rmse": 0.6911626939891266, + "mae": 0.38659381004701177, + "r2": -0.46585807501413723 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7692103143544243, + "rmse": 0.8770463581558413, + "mae": 0.6155587352528158, + "r2": 0.2522361838732067 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.4426767676767677, + "recall": 0.6817716333845366, + "f1": 0.43613724611708476 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.5650987224157956, + "recall": 0.5790095525389644, + "f1": 0.5637508626639062 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.4102080974965646, + "js_divergence": 0.11100613154873733 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_4/best_params.json b/models/abl/baseline/20260617_180556/outer_fold_4/best_params.json new file mode 100644 index 0000000..b3a53a1 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_4/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.14162975892531532, + "lr": 0.0004019907813153378, + "weight_decay": 0.00037960139235180325, + "backbone_lr_ratio": 0.18010931581670617, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_4/splits.json b/models/abl/baseline/20260617_180556/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/outer_fold_4/test_metrics.json b/models/abl/baseline/20260617_180556/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..e553d93 --- /dev/null +++ b/models/abl/baseline/20260617_180556/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.1842198466764517, + "rmse": 0.4292083953937198, + "mae": 0.29178874833243235, + "r2": -0.33736192476816806 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9003281069383875, + "rmse": 0.9488562098328637, + "mae": 0.6070586243837044, + "r2": 0.1293975832987566 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.34548450889914306, + "recall": 0.5337941628264209, + "f1": 0.3497882046269143 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.6548765244417418, + "recall": 0.7576923076923077, + "f1": 0.6777508856852221 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3946735882065513, + "js_divergence": 0.1067245125767987 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/best_params.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/best_params.json new file mode 100644 index 0000000..3e2c1aa --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.28242799368681437, + "lr": 0.00037183641805732076, + "weight_decay": 6.290644294586152e-05, + "backbone_lr_ratio": 0.10677482709481352, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/splits.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..f7d299b --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.3808128541133737, + "rmse": 0.6171003598389598, + "mae": 0.4168719153806388, + "r2": -0.2644353156285024 + }, + "delivery": { + "n_samples": 58, + "mse": 0.751610048614176, + "rmse": 0.8669544674400012, + "mae": 0.7122741444999802, + "r2": 0.04465827311677528 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5, + "precision": 0.3181788931788932, + "recall": 0.5039032006245121, + "f1": 0.32369614512471656 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6258687258687259, + "recall": 0.6461904761904762, + "f1": 0.6127803231251508 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.39644445917049376, + "js_divergence": 0.09334798400608228 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/best_params.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/best_params.json new file mode 100644 index 0000000..b8d0ca3 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.23085562232445592, + "lr": 0.0005227270589225132, + "weight_decay": 0.00461701039547356, + "backbone_lr_ratio": 0.12087164274488635, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/splits.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..3141290 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.3074589292084139, + "rmse": 0.5544897917982025, + "mae": 0.3793355481965201, + "r2": -4.093563359726248 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0592195690639976, + "rmse": 1.029183933543464, + "mae": 0.6786946221025753, + "r2": 0.19824714422578682 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.37142213207121927, + "recall": 0.35978835978835977, + "f1": 0.35976608187134507 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.5052287581699346, + "recall": 0.5094429380143666, + "f1": 0.4903811048389362 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.5219711265981701, + "js_divergence": 0.13035793372268764 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/best_params.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/best_params.json new file mode 100644 index 0000000..e460f37 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.18117503720006686, + "lr": 8.135394049241399e-05, + "weight_decay": 0.015076469897649124, + "backbone_lr_ratio": 0.9586175198423679, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/splits.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..8cbc6ce --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.10285134147020851, + "rmse": 0.3207044456664243, + "mae": 0.2692902485529582, + "r2": -0.10201936510861498 + }, + "delivery": { + "n_samples": 60, + "mse": 0.663864171054346, + "rmse": 0.8147786024769833, + "mae": 0.548082401487045, + "r2": 0.11628172479876508 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4457671957671958, + "recall": 0.7063492063492064, + "f1": 0.44368858654572946 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6064246211305034, + "recall": 0.6547619047619048, + "f1": 0.6168530247347982 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3895171114701636, + "js_divergence": 0.10296173296198505 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/best_params.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/best_params.json new file mode 100644 index 0000000..2a7e11e --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.1799936812783694, + "lr": 0.00033865324369584493, + "weight_decay": 0.01440133094015265, + "backbone_lr_ratio": 0.3278334190266755, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/splits.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..2bc24c3 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.4783278330356588, + "rmse": 0.6916124876226996, + "mae": 0.3700549229081855, + "r2": -0.4677665928655337 + }, + "delivery": { + "n_samples": 59, + "mse": 0.8242563169380902, + "rmse": 0.907885629877514, + "mae": 0.6424747443900017, + "r2": 0.19872492929644914 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.4810152874709206, + "recall": 0.7291346646185355, + "f1": 0.48990704493096837 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.5627865961199294, + "recall": 0.5790095525389644, + "f1": 0.5641184865618634 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.40656307520365187, + "js_divergence": 0.10906334576015857 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/best_params.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/best_params.json new file mode 100644 index 0000000..b3a53a1 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.14162975892531532, + "lr": 0.0004019907813153378, + "weight_decay": 0.00037960139235180325, + "backbone_lr_ratio": 0.18010931581670617, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/splits.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..03fd31e --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_1/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.16667444743348794, + "rmse": 0.4082578198069058, + "mae": 0.2857146007674081, + "r2": -0.20998938958412183 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9768153651071599, + "rmse": 0.9883397012703476, + "mae": 0.6390594764259355, + "r2": 0.055435667309009284 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.49700048379293665, + "recall": 0.7552483358934973, + "f1": 0.533806146572104 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6299589603283173, + "recall": 0.6871794871794873, + "f1": 0.6483638563493374 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.394783094910233, + "js_divergence": 0.10592993993751994 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/best_params.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/best_params.json new file mode 100644 index 0000000..3e2c1aa --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.28242799368681437, + "lr": 0.00037183641805732076, + "weight_decay": 6.290644294586152e-05, + "backbone_lr_ratio": 0.10677482709481352, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/splits.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..e9a6d5e --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.38432886654317966, + "rmse": 0.6199426316548812, + "mae": 0.43342806632260245, + "r2": -0.2761097384806048 + }, + "delivery": { + "n_samples": 58, + "mse": 0.6744019580730524, + "rmse": 0.8212197988803317, + "mae": 0.6701494166306381, + "r2": 0.14279441523317304 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.35634973404255316, + "recall": 0.547423887587822, + "f1": 0.3495414294750159 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6587301587301587, + "recall": 0.6938095238095238, + "f1": 0.6526081185986528 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.40697274862376626, + "js_divergence": 0.09501893155280818 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/best_params.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/best_params.json new file mode 100644 index 0000000..b8d0ca3 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.23085562232445592, + "lr": 0.0005227270589225132, + "weight_decay": 0.00461701039547356, + "backbone_lr_ratio": 0.12087164274488635, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/splits.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..fdb8d5b --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.28709899653313253, + "rmse": 0.5358161965946275, + "mae": 0.41961162147067843, + "r2": -3.7562675545651993 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0055884332484593, + "rmse": 1.0027903236711349, + "mae": 0.6592718309371687, + "r2": 0.23884204782685936 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.44047619047619047, + "precision": 0.34375, + "recall": 0.32275132275132273, + "f1": 0.2913806254767353 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.5, + "recall": 0.5004995004995004, + "f1": 0.4796109240553685 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.4974494276121329, + "js_divergence": 0.1259321573319038 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/best_params.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/best_params.json new file mode 100644 index 0000000..e460f37 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.18117503720006686, + "lr": 8.135394049241399e-05, + "weight_decay": 0.015076469897649124, + "backbone_lr_ratio": 0.9586175198423679, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/splits.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..e23acea --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.12734599676966307, + "rmse": 0.3568557086129674, + "mae": 0.283481532619113, + "r2": -0.3644717949534717 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6995736506531275, + "rmse": 0.8364051952571359, + "mae": 0.5743296845893686, + "r2": 0.06874621814647808 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5119047619047619, + "precision": 0.41008771929824556, + "recall": 0.6746031746031745, + "f1": 0.4050345260514752 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6189974937343359, + "recall": 0.687908496732026, + "f1": 0.6319077437787746 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3964743242871827, + "js_divergence": 0.10757710661599443 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/best_params.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/best_params.json new file mode 100644 index 0000000..2a7e11e --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.1799936812783694, + "lr": 0.00033865324369584493, + "weight_decay": 0.01440133094015265, + "backbone_lr_ratio": 0.3278334190266755, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/splits.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..cf76689 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.46358638894813786, + "rmse": 0.6808717859833361, + "mae": 0.37019611553973464, + "r2": -0.422531928127458 + }, + "delivery": { + "n_samples": 59, + "mse": 0.8370140113507513, + "rmse": 0.9148846983914155, + "mae": 0.6370043654657774, + "r2": 0.18632293457411198 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6071428571428571, + "precision": 0.47548510048510045, + "recall": 0.7491039426523297, + "f1": 0.4726173766801967 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6115219070742745, + "recall": 0.6469582704876823, + "f1": 0.6198067632850242 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.40801997248379873, + "js_divergence": 0.11086638268723202 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/best_params.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/best_params.json new file mode 100644 index 0000000..b3a53a1 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/best_params.json @@ -0,0 +1,12 @@ +{ + "dropout": 0.14162975892531532, + "lr": 0.0004019907813153378, + "weight_decay": 0.00037960139235180325, + "backbone_lr_ratio": 0.18010931581670617, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/splits.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/test_metrics.json b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..8097854 --- /dev/null +++ b/models/abl/baseline/20260617_180556/repeat_2/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.15145313313910996, + "rmse": 0.3891697998806048, + "mae": 0.2744193644750686, + "r2": -0.09948877551085711 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9378577638427679, + "rmse": 0.9684305673835207, + "mae": 0.6135335185661398, + "r2": 0.09310702461562304 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6071428571428571, + "precision": 0.4863247863247863, + "recall": 0.7491039426523297, + "f1": 0.5019607843137255 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6324786324786325, + "recall": 0.7021367521367522, + "f1": 0.6488452445899254 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.39116454524118993, + "js_divergence": 0.1065009133663494 + } +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/strata_info.json b/models/abl/baseline/20260617_180556/strata_info.json new file mode 100644 index 0000000..ef3be58 --- /dev/null +++ b/models/abl/baseline/20260617_180556/strata_info.json @@ -0,0 +1,60 @@ +{ + "original_strata_counts": { + "T0|P0|E0": "5", + "T0|P0|E1": "58", + "T0|P0|E2": "169", + "T0|P1|E0": "1", + "T0|P1|E1": "17", + "T0|P1|E2": "32", + "T0|P2|E2": "3", + "T1|P0|E2": "9", + "T1|P1|E2": "5", + "TNA|P0|E0": "28", + "TNA|P0|E1": "21", + "TNA|P0|E2": "20", + "TNA|P1|E0": "29", + "TNA|P1|E1": "7", + "TNA|P1|E2": "14", + "TNA|P2|E2": "1", + "TNA|P3|E0": "1" + }, + "rare_strata": [ + "T0|P1|E0", + "T0|P2|E2", + "TNA|P2|E2", + "TNA|P3|E0" + ], + "final_strata": [ + "RARE", + "T0|P0|E0", + "T0|P0|E1", + "T0|P0|E2", + "T0|P1|E1", + "T0|P1|E2", + "T1|P0|E2", + "T1|P1|E2", + "TNA|P0|E0", + "TNA|P0|E1", + "TNA|P0|E2", + "TNA|P1|E0", + "TNA|P1|E1", + "TNA|P1|E2" + ], + "final_strata_counts": { + "RARE": "6", + "T0|P0|E0": "5", + "T0|P0|E1": "58", + "T0|P0|E2": "169", + "T0|P1|E1": "17", + "T0|P1|E2": "32", + "T1|P0|E2": "9", + "T1|P1|E2": "5", + "TNA|P0|E0": "28", + "TNA|P0|E1": "21", + "TNA|P0|E2": "20", + "TNA|P1|E0": "29", + "TNA|P1|E1": "7", + "TNA|P1|E2": "14" + }, + "n_rare_merged": "6" +} \ No newline at end of file diff --git a/models/abl/baseline/20260617_180556/summary.json b/models/abl/baseline/20260617_180556/summary.json new file mode 100644 index 0000000..3847ca6 --- /dev/null +++ b/models/abl/baseline/20260617_180556/summary.json @@ -0,0 +1,932 @@ +{ + "fold_results": [ + { + "fold": 0, + "best_params": { + "dropout": 0.28242799368681437, + "lr": 0.00037183641805732076, + "weight_decay": 6.290644294586152e-05, + "backbone_lr_ratio": 0.10677482709481352, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.32790454280151365, + "rmse": 0.572629498717551, + "mae": 0.35871042688208893, + "r2": -0.08876073797082196 + }, + "delivery": { + "n_samples": 58, + "mse": 0.7250728333301815, + "rmse": 0.8515120864263651, + "mae": 0.7098816664696768, + "r2": 0.07838867510225656 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.3435971685971686, + "recall": 0.5359094457455114, + "f1": 0.34977324263038545 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7142857142857143, + "precision": 0.6871101871101871, + "recall": 0.707142857142857, + "f1": 0.6756066411238826 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.4073394583325288, + "js_divergence": 0.092887269703335 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.23085562232445592, + "lr": 0.0005227270589225132, + "weight_decay": 0.00461701039547356, + "backbone_lr_ratio": 0.12087164274488635, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 9, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.233876145855699, + "rmse": 0.4836074294876982, + "mae": 0.3760785318556286, + "r2": -2.874543407510119 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0238964615450643, + "rmse": 1.0118776910007772, + "mae": 0.6578027546466862, + "r2": 0.2249841902125319 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5238095238095238, + "precision": 0.34497354497354493, + "recall": 0.3280423280423281, + "f1": 0.3231922398589065 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5595238095238095, + "precision": 0.5101731601731602, + "recall": 0.5036154321868608, + "f1": 0.48790324563862697 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.48528378254405913, + "js_divergence": 0.12258377401744426 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.18117503720006686, + "lr": 8.135394049241399e-05, + "weight_decay": 0.015076469897649124, + "backbone_lr_ratio": 0.9586175198423679, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.07870736214858826, + "rmse": 0.28054832408800495, + "mae": 0.2252055633635748, + "r2": 0.15667568332606574 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6624288051399898, + "rmse": 0.8138972939750997, + "mae": 0.5578871982870623, + "r2": 0.118192445613993 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.43453195231581004, + "recall": 0.7014848950332823, + "f1": 0.4452380952380952 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6140109890109889, + "recall": 0.6785714285714285, + "f1": 0.6262626262626263 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3967825471495568, + "js_divergence": 0.1057568924841401 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.1799936812783694, + "lr": 0.00033865324369584493, + "weight_decay": 0.01440133094015265, + "backbone_lr_ratio": 0.3278334190266755, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 10, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.477705869562307, + "rmse": 0.6911626939891266, + "mae": 0.38659381004701177, + "r2": -0.46585807501413723 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7692103143544243, + "rmse": 0.8770463581558413, + "mae": 0.6155587352528158, + "r2": 0.2522361838732067 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.4426767676767677, + "recall": 0.6817716333845366, + "f1": 0.43613724611708476 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.5650987224157956, + "recall": 0.5790095525389644, + "f1": 0.5637508626639062 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.4102080974965646, + "js_divergence": 0.11100613154873733 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.14162975892531532, + "lr": 0.0004019907813153378, + "weight_decay": 0.00037960139235180325, + "backbone_lr_ratio": 0.18010931581670617, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 12, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.1842198466764517, + "rmse": 0.4292083953937198, + "mae": 0.29178874833243235, + "r2": -0.33736192476816806 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9003281069383875, + "rmse": 0.9488562098328637, + "mae": 0.6070586243837044, + "r2": 0.1293975832987566 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.34548450889914306, + "recall": 0.5337941628264209, + "f1": 0.3497882046269143 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.6548765244417418, + "recall": 0.7576923076923077, + "f1": 0.6777508856852221 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3946735882065513, + "js_divergence": 0.1067245125767987 + } + } + }, + { + "fold": 0, + "best_params": { + "dropout": 0.28242799368681437, + "lr": 0.00037183641805732076, + "weight_decay": 6.290644294586152e-05, + "backbone_lr_ratio": 0.10677482709481352, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.3808128541133737, + "rmse": 0.6171003598389598, + "mae": 0.4168719153806388, + "r2": -0.2644353156285024 + }, + "delivery": { + "n_samples": 58, + "mse": 0.751610048614176, + "rmse": 0.8669544674400012, + "mae": 0.7122741444999802, + "r2": 0.04465827311677528 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5, + "precision": 0.3181788931788932, + "recall": 0.5039032006245121, + "f1": 0.32369614512471656 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6258687258687259, + "recall": 0.6461904761904762, + "f1": 0.6127803231251508 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.39644445917049376, + "js_divergence": 0.09334798400608228 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.23085562232445592, + "lr": 0.0005227270589225132, + "weight_decay": 0.00461701039547356, + "backbone_lr_ratio": 0.12087164274488635, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 9, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.3074589292084139, + "rmse": 0.5544897917982025, + "mae": 0.3793355481965201, + "r2": -4.093563359726248 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0592195690639976, + "rmse": 1.029183933543464, + "mae": 0.6786946221025753, + "r2": 0.19824714422578682 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.37142213207121927, + "recall": 0.35978835978835977, + "f1": 0.35976608187134507 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.5052287581699346, + "recall": 0.5094429380143666, + "f1": 0.4903811048389362 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.5219711265981701, + "js_divergence": 0.13035793372268764 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.18117503720006686, + "lr": 8.135394049241399e-05, + "weight_decay": 0.015076469897649124, + "backbone_lr_ratio": 0.9586175198423679, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.10285134147020851, + "rmse": 0.3207044456664243, + "mae": 0.2692902485529582, + "r2": -0.10201936510861498 + }, + "delivery": { + "n_samples": 60, + "mse": 0.663864171054346, + "rmse": 0.8147786024769833, + "mae": 0.548082401487045, + "r2": 0.11628172479876508 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4457671957671958, + "recall": 0.7063492063492064, + "f1": 0.44368858654572946 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6064246211305034, + "recall": 0.6547619047619048, + "f1": 0.6168530247347982 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3895171114701636, + "js_divergence": 0.10296173296198505 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.1799936812783694, + "lr": 0.00033865324369584493, + "weight_decay": 0.01440133094015265, + "backbone_lr_ratio": 0.3278334190266755, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 10, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.4783278330356588, + "rmse": 0.6916124876226996, + "mae": 0.3700549229081855, + "r2": -0.4677665928655337 + }, + "delivery": { + "n_samples": 59, + "mse": 0.8242563169380902, + "rmse": 0.907885629877514, + "mae": 0.6424747443900017, + "r2": 0.19872492929644914 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.4810152874709206, + "recall": 0.7291346646185355, + "f1": 0.48990704493096837 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.5627865961199294, + "recall": 0.5790095525389644, + "f1": 0.5641184865618634 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.40656307520365187, + "js_divergence": 0.10906334576015857 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.14162975892531532, + "lr": 0.0004019907813153378, + "weight_decay": 0.00037960139235180325, + "backbone_lr_ratio": 0.18010931581670617, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 12, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.16667444743348794, + "rmse": 0.4082578198069058, + "mae": 0.2857146007674081, + "r2": -0.20998938958412183 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9768153651071599, + "rmse": 0.9883397012703476, + "mae": 0.6390594764259355, + "r2": 0.055435667309009284 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.49700048379293665, + "recall": 0.7552483358934973, + "f1": 0.533806146572104 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6299589603283173, + "recall": 0.6871794871794873, + "f1": 0.6483638563493374 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.394783094910233, + "js_divergence": 0.10592993993751994 + } + } + }, + { + "fold": 0, + "best_params": { + "dropout": 0.28242799368681437, + "lr": 0.00037183641805732076, + "weight_decay": 6.290644294586152e-05, + "backbone_lr_ratio": 0.10677482709481352, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.38432886654317966, + "rmse": 0.6199426316548812, + "mae": 0.43342806632260245, + "r2": -0.2761097384806048 + }, + "delivery": { + "n_samples": 58, + "mse": 0.6744019580730524, + "rmse": 0.8212197988803317, + "mae": 0.6701494166306381, + "r2": 0.14279441523317304 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.35634973404255316, + "recall": 0.547423887587822, + "f1": 0.3495414294750159 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6587301587301587, + "recall": 0.6938095238095238, + "f1": 0.6526081185986528 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.40697274862376626, + "js_divergence": 0.09501893155280818 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.23085562232445592, + "lr": 0.0005227270589225132, + "weight_decay": 0.00461701039547356, + "backbone_lr_ratio": 0.12087164274488635, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 9, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.28709899653313253, + "rmse": 0.5358161965946275, + "mae": 0.41961162147067843, + "r2": -3.7562675545651993 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0055884332484593, + "rmse": 1.0027903236711349, + "mae": 0.6592718309371687, + "r2": 0.23884204782685936 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.44047619047619047, + "precision": 0.34375, + "recall": 0.32275132275132273, + "f1": 0.2913806254767353 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.5, + "recall": 0.5004995004995004, + "f1": 0.4796109240553685 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.4974494276121329, + "js_divergence": 0.1259321573319038 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.18117503720006686, + "lr": 8.135394049241399e-05, + "weight_decay": 0.015076469897649124, + "backbone_lr_ratio": 0.9586175198423679, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.12734599676966307, + "rmse": 0.3568557086129674, + "mae": 0.283481532619113, + "r2": -0.3644717949534717 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6995736506531275, + "rmse": 0.8364051952571359, + "mae": 0.5743296845893686, + "r2": 0.06874621814647808 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5119047619047619, + "precision": 0.41008771929824556, + "recall": 0.6746031746031745, + "f1": 0.4050345260514752 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6189974937343359, + "recall": 0.687908496732026, + "f1": 0.6319077437787746 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3964743242871827, + "js_divergence": 0.10757710661599443 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.1799936812783694, + "lr": 0.00033865324369584493, + "weight_decay": 0.01440133094015265, + "backbone_lr_ratio": 0.3278334190266755, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 10, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.46358638894813786, + "rmse": 0.6808717859833361, + "mae": 0.37019611553973464, + "r2": -0.422531928127458 + }, + "delivery": { + "n_samples": 59, + "mse": 0.8370140113507513, + "rmse": 0.9148846983914155, + "mae": 0.6370043654657774, + "r2": 0.18632293457411198 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6071428571428571, + "precision": 0.47548510048510045, + "recall": 0.7491039426523297, + "f1": 0.4726173766801967 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6115219070742745, + "recall": 0.6469582704876823, + "f1": 0.6198067632850242 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.40801997248379873, + "js_divergence": 0.11086638268723202 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.14162975892531532, + "lr": 0.0004019907813153378, + "weight_decay": 0.00037960139235180325, + "backbone_lr_ratio": 0.18010931581670617, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 12, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.15145313313910996, + "rmse": 0.3891697998806048, + "mae": 0.2744193644750686, + "r2": -0.09948877551085711 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9378577638427679, + "rmse": 0.9684305673835207, + "mae": 0.6135335185661398, + "r2": 0.09310702461562304 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6071428571428571, + "precision": 0.4863247863247863, + "recall": 0.7491039426523297, + "f1": 0.5019607843137255 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6324786324786325, + "recall": 0.7021367521367522, + "f1": 0.6488452445899254 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.39116454524118993, + "js_divergence": 0.1065009133663494 + } + } + } + ], + "summary_stats": { + "size": { + "mse_mean": 0.2768235036159284, + "mse_std": 0.1346583260723207, + "rmse_mean": 0.508798491275714, + "rmse_std": 0.13396864891266763, + "mae_mean": 0.3427187344475763, + "mae_std": 0.06271329639776796, + "r2_mean": -0.9110994850991861, + "r2_std": 1.3609378589681 + }, + "delivery": { + "mse_mean": 0.834075853950265, + "mse_std": 0.13581578656540713, + "rmse_mean": 0.9102708371721865, + "rmse_std": 0.0740463162089242, + "mae_mean": 0.634870878942305, + "mae_std": 0.04810398332825185, + "r2_mean": 0.14309063048291837, + "r2_std": 0.06678544282427759 + }, + "pdi": { + "accuracy_mean": 0.573809523809524, + "accuracy_std": 0.07315376902732006, + "precision_mean": 0.40644301832628565, + "precision_std": 0.06081224559746048, + "recall_mean": 0.591894166836878, + "recall_std": 0.15212645465643837, + "f1_mean": 0.40503518503422653, + "f1_std": 0.07270554354315185 + }, + "ee": { + "accuracy_mean": 0.65, + "accuracy_std": 0.05460640448180816, + "precision_mean": 0.5988843624524457, + "precision_std": 0.055997857124168736, + "recall_mean": 0.6355952320322067, + "recall_std": 0.07902933872282923, + "f1_mean": 0.5997699900861396, + "f1_std": 0.06505269720858664 + }, + "toxic": { + "accuracy_mean": 0.9500396342534485, + "accuracy_std": 0.014290090778642328, + "precision_mean": 0.7457142857142857, + "precision_std": 0.03149343955006944, + "recall_mean": 0.9737706334802525, + "recall_std": 0.007575117962473199, + "f1_mean": 0.81483431023254, + "f1_std": 0.0312513648447909 + }, + "biodist": { + "kl_divergence_mean": 0.42024315728866957, + "kl_divergence_std": 0.04170766696370389, + "js_divergence_mean": 0.10843433388487847, + "js_divergence_std": 0.010645869413863087 + } + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_0/best_params.json b/models/abl/both/20260617_232841/outer_fold_0/best_params.json new file mode 100644 index 0000000..26f8b2c --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_0/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.12930599750984867, + "lr": 0.0003183893957684731, + "weight_decay": 0.0011797820449629415, + "backbone_lr_ratio": 0.35598913444921026, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_0/splits.json b/models/abl/both/20260617_232841/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_0/test_metrics.json b/models/abl/both/20260617_232841/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..8ced9f4 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.27316252507783767, + "rmse": 0.5226495241343262, + "mae": 0.268634506018765, + "r2": 0.09300240292875017 + }, + "delivery": { + "n_samples": 58, + "mse": 0.49318943105662066, + "rmse": 0.7022744698881063, + "mae": 0.5225495728182381, + "r2": 0.37312647214479966 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.75, + "precision": 0.4107142857142857, + "recall": 0.5977751756440282, + "f1": 0.447008547008547 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.6658119658119658, + "recall": 0.6976190476190475, + "f1": 0.6690688363683327 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.20575334902695963, + "js_divergence": 0.045069148869594025 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_1/best_params.json b/models/abl/both/20260617_232841/outer_fold_1/best_params.json new file mode 100644 index 0000000..caac8e8 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_1/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.14959924395216218, + "lr": 0.00012401964324838103, + "weight_decay": 9.656428689903883e-05, + "backbone_lr_ratio": 0.32683834688760083, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_1/splits.json b/models/abl/both/20260617_232841/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_1/test_metrics.json b/models/abl/both/20260617_232841/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..12a303a --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.11199287760383045, + "rmse": 0.3346533693298641, + "mae": 0.24370252518426805, + "r2": -0.8553464014912291 + }, + "delivery": { + "n_samples": 61, + "mse": 0.9945337433308287, + "rmse": 0.9972631264269368, + "mae": 0.637184505488296, + "r2": 0.24720965117371863 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.2606719367588933, + "recall": 0.24206349206349206, + "f1": 0.25038520801232667 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4737424924924925, + "recall": 0.47331240188383045, + "f1": 0.46359870390878144 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.42904510824573017, + "js_divergence": 0.11140172525390164 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_2/best_params.json b/models/abl/both/20260617_232841/outer_fold_2/best_params.json new file mode 100644 index 0000000..7380fbe --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_2/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.12302210383900847, + "lr": 0.00015510064533248203, + "weight_decay": 0.0037340196924722196, + "backbone_lr_ratio": 0.3036603338505521, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_2/splits.json b/models/abl/both/20260617_232841/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_2/test_metrics.json b/models/abl/both/20260617_232841/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..a94d4c7 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.13105160735348353, + "rmse": 0.36201050724182515, + "mae": 0.29236553396497456, + "r2": -0.4041762321007929 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6170164560338233, + "rmse": 0.7855039503616918, + "mae": 0.518595163594, + "r2": 0.178644153319804 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.3343023255813954, + "recall": 0.5261136712749617, + "f1": 0.34470899470899463 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6311332192269291, + "recall": 0.6916433239962653, + "f1": 0.6470105449067581 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.2793246003181208, + "js_divergence": 0.07360589998440034 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_3/best_params.json b/models/abl/both/20260617_232841/outer_fold_3/best_params.json new file mode 100644 index 0000000..8bb346b --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_3/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.11061601330629428, + "lr": 0.0003491022701087641, + "weight_decay": 1.2696904821623371e-05, + "backbone_lr_ratio": 0.39277239063286945, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_3/splits.json b/models/abl/both/20260617_232841/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_3/test_metrics.json b/models/abl/both/20260617_232841/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..4e32cd7 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.2974639059494916, + "rmse": 0.5454025173662949, + "mae": 0.2553033943635872, + "r2": 0.08722103632340716 + }, + "delivery": { + "n_samples": 59, + "mse": 0.72832486531675, + "rmse": 0.8534195130864715, + "mae": 0.5703363718970095, + "r2": 0.29198169797506535 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.3663025210084033, + "recall": 0.5624039938556068, + "f1": 0.3811802616390919 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.5903252773977808, + "recall": 0.6201608848667672, + "f1": 0.59879647539222 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.4182398191784831, + "js_divergence": 0.10764099439445415 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_4/best_params.json b/models/abl/both/20260617_232841/outer_fold_4/best_params.json new file mode 100644 index 0000000..ae9c54f --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_4/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.41353294032230026, + "lr": 0.00018606616740103076, + "weight_decay": 9.912252717813433e-05, + "backbone_lr_ratio": 0.32820993966799533, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_4/splits.json b/models/abl/both/20260617_232841/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/outer_fold_4/test_metrics.json b/models/abl/both/20260617_232841/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..1350189 --- /dev/null +++ b/models/abl/both/20260617_232841/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.2385472153185827, + "rmse": 0.4884129557235175, + "mae": 0.37417884383882793, + "r2": -0.7317567503291509 + }, + "delivery": { + "n_samples": 58, + "mse": 0.7980907160636062, + "rmse": 0.8933592312522473, + "mae": 0.6033944039252298, + "r2": 0.2282594525293985 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.33809196980096085, + "recall": 0.5263056835637481, + "f1": 0.3583862620559868 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7261904761904762, + "precision": 0.6831659493065518, + "recall": 0.7594017094017094, + "f1": 0.7065123352302344 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.4050166777635646, + "js_divergence": 0.10143992174009567 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_0/best_params.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_0/best_params.json new file mode 100644 index 0000000..26f8b2c --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_0/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.12930599750984867, + "lr": 0.0003183893957684731, + "weight_decay": 0.0011797820449629415, + "backbone_lr_ratio": 0.35598913444921026, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_0/splits.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_0/test_metrics.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..1285c9e --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.2816563970171338, + "rmse": 0.5307131023605257, + "mae": 0.27628492734518395, + "r2": 0.06479970039267835 + }, + "delivery": { + "n_samples": 58, + "mse": 0.5807003895647976, + "rmse": 0.7620370001284699, + "mae": 0.564853833378132, + "r2": 0.26189476312686466 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7857142857142857, + "precision": 0.42781279178338005, + "recall": 0.5944574551131928, + "f1": 0.4533531409168081 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.6603426956368134, + "recall": 0.7080952380952382, + "f1": 0.6472175061309188 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9827586206896551, + "precision": 0.9912280701754386, + "recall": 0.75, + "f1": 0.8289085545722714 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.2790682434585921, + "js_divergence": 0.06757546969442413 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_1/best_params.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_1/best_params.json new file mode 100644 index 0000000..caac8e8 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_1/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.14959924395216218, + "lr": 0.00012401964324838103, + "weight_decay": 9.656428689903883e-05, + "backbone_lr_ratio": 0.32683834688760083, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_1/splits.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_1/test_metrics.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..496d64e --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.08666696329506099, + "rmse": 0.2943925326754417, + "mae": 0.22798642090388707, + "r2": -0.4357809346276156 + }, + "delivery": { + "n_samples": 61, + "mse": 0.9690008398737997, + "rmse": 0.9843784027871597, + "mae": 0.626403434202075, + "r2": 0.26653621845095465 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.4880952380952381, + "precision": 0.27691029900332226, + "recall": 0.2579365079365079, + "f1": 0.24170918367346939 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4703263535182041, + "recall": 0.47331240188383045, + "f1": 0.46348793258357346 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.4359101867730315, + "js_divergence": 0.11254492304386336 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_2/best_params.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_2/best_params.json new file mode 100644 index 0000000..7380fbe --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_2/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.12302210383900847, + "lr": 0.00015510064533248203, + "weight_decay": 0.0037340196924722196, + "backbone_lr_ratio": 0.3036603338505521, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_2/splits.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_2/test_metrics.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..2424804 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.13747360050361937, + "rmse": 0.3707743255723343, + "mae": 0.2868303656578064, + "r2": -0.4729858432626901 + }, + "delivery": { + "n_samples": 60, + "mse": 0.7104536138129312, + "rmse": 0.8428841046151785, + "mae": 0.5430462850956246, + "r2": 0.054263101423121185 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.45827160493827157, + "recall": 0.7127496159754224, + "f1": 0.4944194569381975 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6060343270099368, + "recall": 0.6573295985060691, + "f1": 0.6198067632850242 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.28003378134681434, + "js_divergence": 0.0731604987811758 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_3/best_params.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_3/best_params.json new file mode 100644 index 0000000..8bb346b --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_3/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.11061601330629428, + "lr": 0.0003491022701087641, + "weight_decay": 1.2696904821623371e-05, + "backbone_lr_ratio": 0.39277239063286945, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_3/splits.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_3/test_metrics.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..c31358b --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.32669708395989955, + "rmse": 0.5715742156184965, + "mae": 0.31596550309514426, + "r2": -0.0024820483050997932 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7029380513850005, + "rmse": 0.8384140095352657, + "mae": 0.5650059677881457, + "r2": 0.31666069734708746 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.3406323185011709, + "recall": 0.5230414746543779, + "f1": 0.3490853658536585 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5888888888888889, + "recall": 0.6327300150829562, + "f1": 0.5970695970695971 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3455956570999495, + "js_divergence": 0.08991455654751294 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_4/best_params.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_4/best_params.json new file mode 100644 index 0000000..ae9c54f --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_4/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.41353294032230026, + "lr": 0.00018606616740103076, + "weight_decay": 9.912252717813433e-05, + "backbone_lr_ratio": 0.32820993966799533, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_4/splits.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_1/outer_fold_4/test_metrics.json b/models/abl/both/20260617_232841/repeat_1/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..3c90eff --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_1/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.2498053256210641, + "rmse": 0.49980528770818755, + "mae": 0.4012378028460911, + "r2": -0.8134860989037498 + }, + "delivery": { + "n_samples": 58, + "mse": 0.8713336067211406, + "rmse": 0.9334525198000917, + "mae": 0.6369200194704121, + "r2": 0.1574347863646688 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6190476190476191, + "precision": 0.32608695652173914, + "recall": 0.510752688172043, + "f1": 0.350912975912976 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6324786324786325, + "recall": 0.7021367521367522, + "f1": 0.6488452445899254 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3635802403548602, + "js_divergence": 0.09224357999051915 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_0/best_params.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_0/best_params.json new file mode 100644 index 0000000..26f8b2c --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_0/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.12930599750984867, + "lr": 0.0003183893957684731, + "weight_decay": 0.0011797820449629415, + "backbone_lr_ratio": 0.35598913444921026, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_0/splits.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_0/test_metrics.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..fc61132 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.3048058934964392, + "rmse": 0.5520922871191366, + "mae": 0.30447895555611115, + "r2": -0.012064934220566759 + }, + "delivery": { + "n_samples": 58, + "mse": 0.5277170018903071, + "rmse": 0.7264413272180398, + "mae": 0.553587457165122, + "r2": 0.32923984608630563 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7261904761904762, + "precision": 0.3958333333333333, + "recall": 0.5817720530835285, + "f1": 0.43162393162393164 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.75, + "precision": 0.7124588290649997, + "recall": 0.7785714285714285, + "f1": 0.7248325686863893 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.2720172018326682, + "js_divergence": 0.060785283409926956 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_1/best_params.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_1/best_params.json new file mode 100644 index 0000000..caac8e8 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_1/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.14959924395216218, + "lr": 0.00012401964324838103, + "weight_decay": 9.656428689903883e-05, + "backbone_lr_ratio": 0.32683834688760083, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_1/splits.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_1/test_metrics.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..d038813 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.10482404388180623, + "rmse": 0.32376541489449767, + "mae": 0.23482046808515275, + "r2": -0.7365828681878246 + }, + "delivery": { + "n_samples": 61, + "mse": 0.9723624200125729, + "rmse": 0.9860843878758921, + "mae": 0.6302215732084434, + "r2": 0.2639917446186245 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.28258620689655173, + "recall": 0.2698412698412698, + "f1": 0.2714159292035398 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.48611111111111116, + "recall": 0.4884639170353456, + "f1": 0.4753962887837127 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.4600248432068658, + "js_divergence": 0.11821523045175072 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_2/best_params.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_2/best_params.json new file mode 100644 index 0000000..7380fbe --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_2/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.12302210383900847, + "lr": 0.00015510064533248203, + "weight_decay": 0.0037340196924722196, + "backbone_lr_ratio": 0.3036603338505521, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_2/splits.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_2/test_metrics.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..d81dbdd --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.12549337649644715, + "rmse": 0.35425044318454585, + "mae": 0.2802231794311887, + "r2": -0.34462155879619094 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6592902402854742, + "rmse": 0.8119668960527111, + "mae": 0.5348013029200956, + "r2": 0.12237041942365745 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5119047619047619, + "precision": 0.4135659661975451, + "recall": 0.6746031746031745, + "f1": 0.4122222222222222 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5972649572649572, + "recall": 0.6507936507936507, + "f1": 0.6069243156199677 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.2563386788633516, + "js_divergence": 0.06872839042316117 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_3/best_params.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_3/best_params.json new file mode 100644 index 0000000..8bb346b --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_3/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.11061601330629428, + "lr": 0.0003491022701087641, + "weight_decay": 1.2696904821623371e-05, + "backbone_lr_ratio": 0.39277239063286945, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_3/splits.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_3/test_metrics.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..204b74c --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.30582211903190704, + "rmse": 0.5530118615652896, + "mae": 0.297713055668107, + "r2": 0.06157355129088471 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7117105624010245, + "rmse": 0.8436293987296937, + "mae": 0.5593153651077616, + "r2": 0.30813277436953124 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.36681547619047616, + "recall": 0.5662442396313364, + "f1": 0.3804035250463822 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.5864396721189867, + "recall": 0.6201608848667672, + "f1": 0.5949003714961162 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.31884722326826903, + "js_divergence": 0.08589330459529161 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_4/best_params.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_4/best_params.json new file mode 100644 index 0000000..ae9c54f --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_4/best_params.json @@ -0,0 +1,16 @@ +{ + "dropout": 0.41353294032230026, + "lr": 0.00018606616740103076, + "weight_decay": 9.912252717813433e-05, + "backbone_lr_ratio": 0.32820993966799533, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_4/splits.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/repeat_2/outer_fold_4/test_metrics.json b/models/abl/both/20260617_232841/repeat_2/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..9c8d629 --- /dev/null +++ b/models/abl/both/20260617_232841/repeat_2/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.21199504587721935, + "rmse": 0.4604291974638656, + "mae": 0.33512775670914424, + "r2": -0.5389986893953644 + }, + "delivery": { + "n_samples": 58, + "mse": 0.8018784776714993, + "rmse": 0.8954766762297605, + "mae": 0.6036076779509413, + "r2": 0.22459674958332065 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6190476190476191, + "precision": 0.4494096489170381, + "recall": 0.7124935995903737, + "f1": 0.47481767481767473 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7142857142857143, + "precision": 0.664516711833785, + "recall": 0.7427350427350428, + "f1": 0.6874551971326165 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3693123344696232, + "js_divergence": 0.09443444364888388 + } +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/strata_info.json b/models/abl/both/20260617_232841/strata_info.json new file mode 100644 index 0000000..ef3be58 --- /dev/null +++ b/models/abl/both/20260617_232841/strata_info.json @@ -0,0 +1,60 @@ +{ + "original_strata_counts": { + "T0|P0|E0": "5", + "T0|P0|E1": "58", + "T0|P0|E2": "169", + "T0|P1|E0": "1", + "T0|P1|E1": "17", + "T0|P1|E2": "32", + "T0|P2|E2": "3", + "T1|P0|E2": "9", + "T1|P1|E2": "5", + "TNA|P0|E0": "28", + "TNA|P0|E1": "21", + "TNA|P0|E2": "20", + "TNA|P1|E0": "29", + "TNA|P1|E1": "7", + "TNA|P1|E2": "14", + "TNA|P2|E2": "1", + "TNA|P3|E0": "1" + }, + "rare_strata": [ + "T0|P1|E0", + "T0|P2|E2", + "TNA|P2|E2", + "TNA|P3|E0" + ], + "final_strata": [ + "RARE", + "T0|P0|E0", + "T0|P0|E1", + "T0|P0|E2", + "T0|P1|E1", + "T0|P1|E2", + "T1|P0|E2", + "T1|P1|E2", + "TNA|P0|E0", + "TNA|P0|E1", + "TNA|P0|E2", + "TNA|P1|E0", + "TNA|P1|E1", + "TNA|P1|E2" + ], + "final_strata_counts": { + "RARE": "6", + "T0|P0|E0": "5", + "T0|P0|E1": "58", + "T0|P0|E2": "169", + "T0|P1|E1": "17", + "T0|P1|E2": "32", + "T1|P0|E2": "9", + "T1|P1|E2": "5", + "TNA|P0|E0": "28", + "TNA|P0|E1": "21", + "TNA|P0|E2": "20", + "TNA|P1|E0": "29", + "TNA|P1|E1": "7", + "TNA|P1|E2": "14" + }, + "n_rare_merged": "6" +} \ No newline at end of file diff --git a/models/abl/both/20260617_232841/summary.json b/models/abl/both/20260617_232841/summary.json new file mode 100644 index 0000000..70c4c36 --- /dev/null +++ b/models/abl/both/20260617_232841/summary.json @@ -0,0 +1,992 @@ +{ + "fold_results": [ + { + "fold": 0, + "best_params": { + "dropout": 0.12930599750984867, + "lr": 0.0003183893957684731, + "weight_decay": 0.0011797820449629415, + "backbone_lr_ratio": 0.35598913444921026, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 20, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.27316252507783767, + "rmse": 0.5226495241343262, + "mae": 0.268634506018765, + "r2": 0.09300240292875017 + }, + "delivery": { + "n_samples": 58, + "mse": 0.49318943105662066, + "rmse": 0.7022744698881063, + "mae": 0.5225495728182381, + "r2": 0.37312647214479966 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.75, + "precision": 0.4107142857142857, + "recall": 0.5977751756440282, + "f1": 0.447008547008547 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.6658119658119658, + "recall": 0.6976190476190475, + "f1": 0.6690688363683327 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.20575334902695963, + "js_divergence": 0.045069148869594025 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.14959924395216218, + "lr": 0.00012401964324838103, + "weight_decay": 9.656428689903883e-05, + "backbone_lr_ratio": 0.32683834688760083, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 23, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.11199287760383045, + "rmse": 0.3346533693298641, + "mae": 0.24370252518426805, + "r2": -0.8553464014912291 + }, + "delivery": { + "n_samples": 61, + "mse": 0.9945337433308287, + "rmse": 0.9972631264269368, + "mae": 0.637184505488296, + "r2": 0.24720965117371863 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.2606719367588933, + "recall": 0.24206349206349206, + "f1": 0.25038520801232667 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4737424924924925, + "recall": 0.47331240188383045, + "f1": 0.46359870390878144 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.42904510824573017, + "js_divergence": 0.11140172525390164 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.12302210383900847, + "lr": 0.00015510064533248203, + "weight_decay": 0.0037340196924722196, + "backbone_lr_ratio": 0.3036603338505521, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.13105160735348353, + "rmse": 0.36201050724182515, + "mae": 0.29236553396497456, + "r2": -0.4041762321007929 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6170164560338233, + "rmse": 0.7855039503616918, + "mae": 0.518595163594, + "r2": 0.178644153319804 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.3343023255813954, + "recall": 0.5261136712749617, + "f1": 0.34470899470899463 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6311332192269291, + "recall": 0.6916433239962653, + "f1": 0.6470105449067581 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.2793246003181208, + "js_divergence": 0.07360589998440034 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.11061601330629428, + "lr": 0.0003491022701087641, + "weight_decay": 1.2696904821623371e-05, + "backbone_lr_ratio": 0.39277239063286945, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.2974639059494916, + "rmse": 0.5454025173662949, + "mae": 0.2553033943635872, + "r2": 0.08722103632340716 + }, + "delivery": { + "n_samples": 59, + "mse": 0.72832486531675, + "rmse": 0.8534195130864715, + "mae": 0.5703363718970095, + "r2": 0.29198169797506535 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.3663025210084033, + "recall": 0.5624039938556068, + "f1": 0.3811802616390919 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.5903252773977808, + "recall": 0.6201608848667672, + "f1": 0.59879647539222 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.4182398191784831, + "js_divergence": 0.10764099439445415 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.41353294032230026, + "lr": 0.00018606616740103076, + "weight_decay": 9.912252717813433e-05, + "backbone_lr_ratio": 0.32820993966799533, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 25, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.2385472153185827, + "rmse": 0.4884129557235175, + "mae": 0.37417884383882793, + "r2": -0.7317567503291509 + }, + "delivery": { + "n_samples": 58, + "mse": 0.7980907160636062, + "rmse": 0.8933592312522473, + "mae": 0.6033944039252298, + "r2": 0.2282594525293985 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.33809196980096085, + "recall": 0.5263056835637481, + "f1": 0.3583862620559868 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7261904761904762, + "precision": 0.6831659493065518, + "recall": 0.7594017094017094, + "f1": 0.7065123352302344 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.4050166777635646, + "js_divergence": 0.10143992174009567 + } + } + }, + { + "fold": 0, + "best_params": { + "dropout": 0.12930599750984867, + "lr": 0.0003183893957684731, + "weight_decay": 0.0011797820449629415, + "backbone_lr_ratio": 0.35598913444921026, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 20, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.2816563970171338, + "rmse": 0.5307131023605257, + "mae": 0.27628492734518395, + "r2": 0.06479970039267835 + }, + "delivery": { + "n_samples": 58, + "mse": 0.5807003895647976, + "rmse": 0.7620370001284699, + "mae": 0.564853833378132, + "r2": 0.26189476312686466 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7857142857142857, + "precision": 0.42781279178338005, + "recall": 0.5944574551131928, + "f1": 0.4533531409168081 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.6603426956368134, + "recall": 0.7080952380952382, + "f1": 0.6472175061309188 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9827586206896551, + "precision": 0.9912280701754386, + "recall": 0.75, + "f1": 0.8289085545722714 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.2790682434585921, + "js_divergence": 0.06757546969442413 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.14959924395216218, + "lr": 0.00012401964324838103, + "weight_decay": 9.656428689903883e-05, + "backbone_lr_ratio": 0.32683834688760083, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 23, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.08666696329506099, + "rmse": 0.2943925326754417, + "mae": 0.22798642090388707, + "r2": -0.4357809346276156 + }, + "delivery": { + "n_samples": 61, + "mse": 0.9690008398737997, + "rmse": 0.9843784027871597, + "mae": 0.626403434202075, + "r2": 0.26653621845095465 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.4880952380952381, + "precision": 0.27691029900332226, + "recall": 0.2579365079365079, + "f1": 0.24170918367346939 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4703263535182041, + "recall": 0.47331240188383045, + "f1": 0.46348793258357346 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.4359101867730315, + "js_divergence": 0.11254492304386336 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.12302210383900847, + "lr": 0.00015510064533248203, + "weight_decay": 0.0037340196924722196, + "backbone_lr_ratio": 0.3036603338505521, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.13747360050361937, + "rmse": 0.3707743255723343, + "mae": 0.2868303656578064, + "r2": -0.4729858432626901 + }, + "delivery": { + "n_samples": 60, + "mse": 0.7104536138129312, + "rmse": 0.8428841046151785, + "mae": 0.5430462850956246, + "r2": 0.054263101423121185 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.45827160493827157, + "recall": 0.7127496159754224, + "f1": 0.4944194569381975 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6060343270099368, + "recall": 0.6573295985060691, + "f1": 0.6198067632850242 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.28003378134681434, + "js_divergence": 0.0731604987811758 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.11061601330629428, + "lr": 0.0003491022701087641, + "weight_decay": 1.2696904821623371e-05, + "backbone_lr_ratio": 0.39277239063286945, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.32669708395989955, + "rmse": 0.5715742156184965, + "mae": 0.31596550309514426, + "r2": -0.0024820483050997932 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7029380513850005, + "rmse": 0.8384140095352657, + "mae": 0.5650059677881457, + "r2": 0.31666069734708746 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.3406323185011709, + "recall": 0.5230414746543779, + "f1": 0.3490853658536585 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5888888888888889, + "recall": 0.6327300150829562, + "f1": 0.5970695970695971 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3455956570999495, + "js_divergence": 0.08991455654751294 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.41353294032230026, + "lr": 0.00018606616740103076, + "weight_decay": 9.912252717813433e-05, + "backbone_lr_ratio": 0.32820993966799533, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 25, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.2498053256210641, + "rmse": 0.49980528770818755, + "mae": 0.4012378028460911, + "r2": -0.8134860989037498 + }, + "delivery": { + "n_samples": 58, + "mse": 0.8713336067211406, + "rmse": 0.9334525198000917, + "mae": 0.6369200194704121, + "r2": 0.1574347863646688 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6190476190476191, + "precision": 0.32608695652173914, + "recall": 0.510752688172043, + "f1": 0.350912975912976 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6324786324786325, + "recall": 0.7021367521367522, + "f1": 0.6488452445899254 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3635802403548602, + "js_divergence": 0.09224357999051915 + } + } + }, + { + "fold": 0, + "best_params": { + "dropout": 0.12930599750984867, + "lr": 0.0003183893957684731, + "weight_decay": 0.0011797820449629415, + "backbone_lr_ratio": 0.35598913444921026, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 20, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.3048058934964392, + "rmse": 0.5520922871191366, + "mae": 0.30447895555611115, + "r2": -0.012064934220566759 + }, + "delivery": { + "n_samples": 58, + "mse": 0.5277170018903071, + "rmse": 0.7264413272180398, + "mae": 0.553587457165122, + "r2": 0.32923984608630563 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7261904761904762, + "precision": 0.3958333333333333, + "recall": 0.5817720530835285, + "f1": 0.43162393162393164 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.75, + "precision": 0.7124588290649997, + "recall": 0.7785714285714285, + "f1": 0.7248325686863893 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.2720172018326682, + "js_divergence": 0.060785283409926956 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.14959924395216218, + "lr": 0.00012401964324838103, + "weight_decay": 9.656428689903883e-05, + "backbone_lr_ratio": 0.32683834688760083, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 23, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.10482404388180623, + "rmse": 0.32376541489449767, + "mae": 0.23482046808515275, + "r2": -0.7365828681878246 + }, + "delivery": { + "n_samples": 61, + "mse": 0.9723624200125729, + "rmse": 0.9860843878758921, + "mae": 0.6302215732084434, + "r2": 0.2639917446186245 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.28258620689655173, + "recall": 0.2698412698412698, + "f1": 0.2714159292035398 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.48611111111111116, + "recall": 0.4884639170353456, + "f1": 0.4753962887837127 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.4600248432068658, + "js_divergence": 0.11821523045175072 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.12302210383900847, + "lr": 0.00015510064533248203, + "weight_decay": 0.0037340196924722196, + "backbone_lr_ratio": 0.3036603338505521, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.12549337649644715, + "rmse": 0.35425044318454585, + "mae": 0.2802231794311887, + "r2": -0.34462155879619094 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6592902402854742, + "rmse": 0.8119668960527111, + "mae": 0.5348013029200956, + "r2": 0.12237041942365745 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5119047619047619, + "precision": 0.4135659661975451, + "recall": 0.6746031746031745, + "f1": 0.4122222222222222 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5972649572649572, + "recall": 0.6507936507936507, + "f1": 0.6069243156199677 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.2563386788633516, + "js_divergence": 0.06872839042316117 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.11061601330629428, + "lr": 0.0003491022701087641, + "weight_decay": 1.2696904821623371e-05, + "backbone_lr_ratio": 0.39277239063286945, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.30582211903190704, + "rmse": 0.5530118615652896, + "mae": 0.297713055668107, + "r2": 0.06157355129088471 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7117105624010245, + "rmse": 0.8436293987296937, + "mae": 0.5593153651077616, + "r2": 0.30813277436953124 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.36681547619047616, + "recall": 0.5662442396313364, + "f1": 0.3804035250463822 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.5864396721189867, + "recall": 0.6201608848667672, + "f1": 0.5949003714961162 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.31884722326826903, + "js_divergence": 0.08589330459529161 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.41353294032230026, + "lr": 0.00018606616740103076, + "weight_decay": 9.912252717813433e-05, + "backbone_lr_ratio": 0.32820993966799533, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 25, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.21199504587721935, + "rmse": 0.4604291974638656, + "mae": 0.33512775670914424, + "r2": -0.5389986893953644 + }, + "delivery": { + "n_samples": 58, + "mse": 0.8018784776714993, + "rmse": 0.8954766762297605, + "mae": 0.6036076779509413, + "r2": 0.22459674958332065 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6190476190476191, + "precision": 0.4494096489170381, + "recall": 0.7124935995903737, + "f1": 0.47481767481767473 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7142857142857143, + "precision": 0.664516711833785, + "recall": 0.7427350427350428, + "f1": 0.6874551971326165 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3693123344696232, + "js_divergence": 0.09443444364888388 + } + } + } + ], + "summary_stats": { + "size": { + "mse_mean": 0.21249719869892153, + "mse_std": 0.083819203886272, + "rmse_mean": 0.4509291694638765, + "rmse_std": 0.09570832161071456, + "mae_mean": 0.29299021591121593, + "mae_std": 0.04711634555603193, + "r2_mean": -0.33611237791230353, + "r2_std": 0.3452040990881361 + }, + "delivery": { + "mse_mean": 0.7425693610280117, + "mse_std": 0.15313439940788104, + "rmse_mean": 0.8571056675991812, + "rmse_std": 0.08910238828097625, + "mae_mean": 0.5779881956006352, + "mae_std": 0.040317114677088234, + "r2_mean": 0.24162283519579483, + "r2_std": 0.08163767158765754 + }, + "pdi": { + "accuracy_mean": 0.634126984126984, + "accuracy_std": 0.08009190991455786, + "precision_mean": 0.36320050940978454, + "precision_std": 0.06018646749200912, + "recall_mean": 0.5239036063335376, + "recall_std": 0.14740021344728976, + "f1_mean": 0.37610884530892047, + "f1_std": 0.0760087699533074 + }, + "ee": { + "accuracy_mean": 0.6563492063492063, + "accuracy_std": 0.06431020501550125, + "precision_mean": 0.6032694055441358, + "precision_std": 0.07290814030935075, + "recall_mean": 0.6464310864983134, + "recall_std": 0.09580096959112427, + "f1_mean": 0.6100615120789444, + "f1_std": 0.08078656411296503 + }, + "toxic": { + "accuracy_mean": 0.9511890595408049, + "accuracy_std": 0.016071213375949578, + "precision_mean": 0.7617961570593149, + "precision_std": 0.0689235340767993, + "recall_mean": 0.958294443004062, + "recall_std": 0.05613748087593979, + "f1_mean": 0.8151453855878632, + "f1_std": 0.03136647604932653 + }, + "biodist": { + "kl_divergence_mean": 0.3412071963471256, + "kl_divergence_std": 0.07500564394419486, + "js_divergence_mean": 0.08684355805526371, + "js_divergence_std": 0.020779098028044035 + } + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_0/best_params.json b/models/abl/llm/20260617_203747/outer_fold_0/best_params.json new file mode 100644 index 0000000..148218a --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_0/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.17394178221021084, + "lr": 0.0008692991511139548, + "weight_decay": 0.012604664585649461, + "backbone_lr_ratio": 0.7568292060167615, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_0/splits.json b/models/abl/llm/20260617_203747/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_0/test_metrics.json b/models/abl/llm/20260617_203747/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..88371e0 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.32257861692567663, + "rmse": 0.567960048705608, + "mae": 0.31035865933062085, + "r2": -0.07107675306042016 + }, + "delivery": { + "n_samples": 58, + "mse": 0.5663698080597032, + "rmse": 0.7525754500777335, + "mae": 0.5982509058225771, + "r2": 0.28010979698326477 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7619047619047619, + "precision": 0.41369047619047616, + "recall": 0.570647931303669, + "f1": 0.4308211473565804 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7261904761904762, + "precision": 0.6878324844368987, + "recall": 0.7209523809523809, + "f1": 0.6887741512487962 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3926160201854191, + "js_divergence": 0.08674307332595234 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_1/best_params.json b/models/abl/llm/20260617_203747/outer_fold_1/best_params.json new file mode 100644 index 0000000..46f8192 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_1/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.10384800371647304, + "lr": 0.0001279570746472226, + "weight_decay": 4.1852509552898965e-05, + "backbone_lr_ratio": 0.3376629665631628, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_1/splits.json b/models/abl/llm/20260617_203747/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_1/test_metrics.json b/models/abl/llm/20260617_203747/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..5d7affc --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.08957809256845296, + "rmse": 0.29929599490880754, + "mae": 0.23231829348064603, + "r2": -0.4840085838962582 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0507386739143396, + "rmse": 1.0250554491901107, + "mae": 0.6530180171926002, + "r2": 0.20466657047540615 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.4880952380952381, + "precision": 0.24191919191919192, + "recall": 0.21825396825396826, + "f1": 0.2222222222222222 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.49025974025974023, + "recall": 0.4884639170353456, + "f1": 0.4755038065382893 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.49752328596137474, + "js_divergence": 0.1298567265780671 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_2/best_params.json b/models/abl/llm/20260617_203747/outer_fold_2/best_params.json new file mode 100644 index 0000000..2f07d91 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_2/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.2636290439443595, + "lr": 0.00010466580528023322, + "weight_decay": 0.006927746271980836, + "backbone_lr_ratio": 0.8337818756564023, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_2/splits.json b/models/abl/llm/20260617_203747/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_2/test_metrics.json b/models/abl/llm/20260617_203747/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..c10d3a3 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.10270568332175314, + "rmse": 0.32047727426722966, + "mae": 0.26504439683187575, + "r2": -0.10045868444087502 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6479334722947253, + "rmse": 0.804943148486106, + "mae": 0.5286491472351675, + "r2": 0.13748824601867593 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.43184754521963825, + "recall": 0.7014848950332823, + "f1": 0.43844797178130507 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5883295286154832, + "recall": 0.6176470588235293, + "f1": 0.5941360089186176 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3661685785379984, + "js_divergence": 0.097896603299405 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_3/best_params.json b/models/abl/llm/20260617_203747/outer_fold_3/best_params.json new file mode 100644 index 0000000..5b8f4f2 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_3/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.26162738320409185, + "lr": 0.0004044490597558798, + "weight_decay": 7.205221534692395e-05, + "backbone_lr_ratio": 0.07900176413772968, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_3/splits.json b/models/abl/llm/20260617_203747/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_3/test_metrics.json b/models/abl/llm/20260617_203747/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..a09e744 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.4464246305433506, + "rmse": 0.6681501556860932, + "mae": 0.4577071551817009, + "r2": -0.3698704396635446 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7483002407454893, + "rmse": 0.8650434906670816, + "mae": 0.6075752978449909, + "r2": 0.2725632597658799 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.47149122807017546, + "recall": 0.7437275985663083, + "f1": 0.4655994978028876 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6331979820351913, + "recall": 0.6534942182001006, + "f1": 0.6372471762542685 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.45626077922317954, + "js_divergence": 0.11599223837350767 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_4/best_params.json b/models/abl/llm/20260617_203747/outer_fold_4/best_params.json new file mode 100644 index 0000000..ec07eaa --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_4/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.3625765078454039, + "lr": 0.0002275295018001268, + "weight_decay": 0.0448416500708463, + "backbone_lr_ratio": 0.9894719193206745, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_4/splits.json b/models/abl/llm/20260617_203747/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/outer_fold_4/test_metrics.json b/models/abl/llm/20260617_203747/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..9b349ec --- /dev/null +++ b/models/abl/llm/20260617_203747/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.1515180161283022, + "rmse": 0.38925315172558617, + "mae": 0.2619989627883548, + "r2": -0.09995979989219483 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9644662063026374, + "rmse": 0.9820724037985373, + "mae": 0.6300572055424082, + "r2": 0.06737710001181019 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.35128205128205126, + "recall": 0.5418586789554531, + "f1": 0.359983498349835 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7142857142857143, + "precision": 0.6777971351142082, + "recall": 0.7316239316239317, + "f1": 0.6927021107128635 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.4022183174014837, + "js_divergence": 0.10679024644721553 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/best_params.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/best_params.json new file mode 100644 index 0000000..148218a --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.17394178221021084, + "lr": 0.0008692991511139548, + "weight_decay": 0.012604664585649461, + "backbone_lr_ratio": 0.7568292060167615, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/splits.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/test_metrics.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..7067af3 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.27335362785162987, + "rmse": 0.5228323133200834, + "mae": 0.2646587670567524, + "r2": 0.09236787314991679 + }, + "delivery": { + "n_samples": 58, + "mse": 0.6266138798614104, + "rmse": 0.7915894642182969, + "mae": 0.6268783063338749, + "r2": 0.20353594636000905 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.34911616161616166, + "recall": 0.532591725214676, + "f1": 0.3726817042606517 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.6745750184774574, + "recall": 0.65, + "f1": 0.6212006495929071 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9827586206896551, + "precision": 0.9912280701754386, + "recall": 0.75, + "f1": 0.8289085545722714 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.36684155421249465, + "js_divergence": 0.08459006045737026 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/best_params.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/best_params.json new file mode 100644 index 0000000..46f8192 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.10384800371647304, + "lr": 0.0001279570746472226, + "weight_decay": 4.1852509552898965e-05, + "backbone_lr_ratio": 0.3376629665631628, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/splits.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/test_metrics.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..e6be906 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.08146984680414535, + "rmse": 0.2854292325676285, + "mae": 0.21767334143320718, + "r2": -0.3496821434735853 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0904473156848673, + "rmse": 1.0442448542774188, + "mae": 0.6599734681124081, + "r2": 0.1746099912086837 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.3838763575605681, + "recall": 0.37566137566137564, + "f1": 0.3487872596783488 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4564636752136752, + "recall": 0.4544740973312402, + "f1": 0.4475740309073643 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.5191994338273651, + "js_divergence": 0.133390010507665 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/best_params.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/best_params.json new file mode 100644 index 0000000..2f07d91 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.2636290439443595, + "lr": 0.00010466580528023322, + "weight_decay": 0.006927746271980836, + "backbone_lr_ratio": 0.8337818756564023, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/splits.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/test_metrics.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..b0f16f9 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.12125461439631278, + "rmse": 0.34821633275352376, + "mae": 0.2753084216799055, + "r2": -0.29920457296339475 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6854320028215705, + "rmse": 0.8279082091763377, + "mae": 0.5523756401070083, + "r2": 0.08757120249585015 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.4586220836220836, + "recall": 0.7329749103942652, + "f1": 0.4518518518518519 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6279802069275754, + "recall": 0.6944444444444443, + "f1": 0.6439817992323139 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3964294851645634, + "js_divergence": 0.10166093827031751 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/best_params.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/best_params.json new file mode 100644 index 0000000..5b8f4f2 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.26162738320409185, + "lr": 0.0004044490597558798, + "weight_decay": 7.205221534692395e-05, + "backbone_lr_ratio": 0.07900176413772968, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/splits.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/test_metrics.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..d0d10e0 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.4492520714018539, + "rmse": 0.6702626883557325, + "mae": 0.4418497430272849, + "r2": -0.378546546192986 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7723968020638662, + "rmse": 0.878861082346844, + "mae": 0.6126736976932419, + "r2": 0.24913853923013773 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.4175641025641026, + "recall": 0.680747567844342, + "f1": 0.43159687042665773 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6309523809523809, + "precision": 0.5534853959650707, + "recall": 0.5724736048265461, + "f1": 0.5548289684944762 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.431312081575883, + "js_divergence": 0.11082453680268824 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/best_params.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/best_params.json new file mode 100644 index 0000000..ec07eaa --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.3625765078454039, + "lr": 0.0002275295018001268, + "weight_decay": 0.0448416500708463, + "backbone_lr_ratio": 0.9894719193206745, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/splits.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/test_metrics.json b/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..cc8559b --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_1/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.170886835718096, + "rmse": 0.41338460991925663, + "mae": 0.29878092663628714, + "r2": -0.24056963273277931 + }, + "delivery": { + "n_samples": 58, + "mse": 0.968847127241079, + "rmse": 0.9843003237026182, + "mae": 0.6712857072466406, + "r2": 0.06314082178502656 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.3400862068965517, + "recall": 0.5228494623655914, + "f1": 0.3645325203252032 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6417989417989417, + "recall": 0.6871794871794873, + "f1": 0.6548463356973995 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.393825272071608, + "js_divergence": 0.10333396074064978 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/best_params.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/best_params.json new file mode 100644 index 0000000..148218a --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.17394178221021084, + "lr": 0.0008692991511139548, + "weight_decay": 0.012604664585649461, + "backbone_lr_ratio": 0.7568292060167615, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/splits.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/test_metrics.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..a1b0a23 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.27246983404452624, + "rmse": 0.5219864309007718, + "mae": 0.28265616979943703, + "r2": 0.09530238570474492 + }, + "delivery": { + "n_samples": 58, + "mse": 0.604184383301435, + "rmse": 0.7772929842095804, + "mae": 0.6221898367050392, + "r2": 0.23204518997142287 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7380952380952381, + "precision": 0.39046451914098973, + "recall": 0.5624512099921936, + "f1": 0.4189728353140917 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6848595848595848, + "recall": 0.6666666666666666, + "f1": 0.6505561230280331 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.39513784060217455, + "js_divergence": 0.08783549794397413 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/best_params.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/best_params.json new file mode 100644 index 0000000..46f8192 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.10384800371647304, + "lr": 0.0001279570746472226, + "weight_decay": 4.1852509552898965e-05, + "backbone_lr_ratio": 0.3376629665631628, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/splits.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/test_metrics.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..66ca9f6 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.10195066921659326, + "rmse": 0.31929714877617255, + "mae": 0.22798235643477666, + "r2": -0.6889806861624865 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0993270249173992, + "rmse": 1.0484879708024308, + "mae": 0.6632463136596269, + "r2": 0.16788869144841 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5119047619047619, + "precision": 0.34006734006734013, + "recall": 0.31216931216931215, + "f1": 0.3148148148148148 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.47448872021927047, + "recall": 0.47331240188383045, + "f1": 0.46254778641016153 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.5088345898691146, + "js_divergence": 0.1334314820265482 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/best_params.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/best_params.json new file mode 100644 index 0000000..2f07d91 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.2636290439443595, + "lr": 0.00010466580528023322, + "weight_decay": 0.006927746271980836, + "backbone_lr_ratio": 0.8337818756564023, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/splits.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/test_metrics.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..c80f290 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.12090247209069646, + "rmse": 0.34771032784589023, + "mae": 0.2784879008928935, + "r2": -0.29543148031806843 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6492677806116993, + "rmse": 0.8057715436844983, + "mae": 0.5516021698790913, + "r2": 0.13571205038126077 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.4586220836220836, + "recall": 0.7329749103942652, + "f1": 0.4518518518518519 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6032256850346281, + "recall": 0.6454248366013072, + "f1": 0.6147342995169082 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3796575473458722, + "js_divergence": 0.10108036272798335 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/best_params.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/best_params.json new file mode 100644 index 0000000..5b8f4f2 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.26162738320409185, + "lr": 0.0004044490597558798, + "weight_decay": 7.205221534692395e-05, + "backbone_lr_ratio": 0.07900176413772968, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/splits.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/test_metrics.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..4f50a95 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.45122799383005324, + "rmse": 0.6717350622306782, + "mae": 0.44397926330566406, + "r2": -0.3846097370213326 + }, + "delivery": { + "n_samples": 59, + "mse": 0.8108848103710049, + "rmse": 0.9004914271502005, + "mae": 0.6249074435682368, + "r2": 0.2117236223604647 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.35099206349206347, + "recall": 0.5499231950844854, + "f1": 0.3530056759545923 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5756257631257631, + "recall": 0.5945198592257416, + "f1": 0.5782485101535254 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.4477290570324428, + "js_divergence": 0.11535991205187913 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/best_params.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/best_params.json new file mode 100644 index 0000000..ec07eaa --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/best_params.json @@ -0,0 +1,13 @@ +{ + "dropout": 0.3625765078454039, + "lr": 0.0002275295018001268, + "weight_decay": 0.0448416500708463, + "backbone_lr_ratio": 0.9894719193206745, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/splits.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/test_metrics.json b/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..a186b70 --- /dev/null +++ b/models/abl/llm/20260617_203747/repeat_2/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.19538948202688425, + "rmse": 0.4420288248823647, + "mae": 0.3140518381482079, + "r2": -0.41844898080859916 + }, + "delivery": { + "n_samples": 58, + "mse": 0.8735566441358382, + "rmse": 0.9346425221098376, + "mae": 0.6355925653258274, + "r2": 0.15528514588278453 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.3333333333333333, + "recall": 0.5149769585253456, + "f1": 0.3569777217318201 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.618080808080808, + "recall": 0.6594017094017094, + "f1": 0.632253086419753 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.40700346878885973, + "js_divergence": 0.10808181429714495 + } +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/strata_info.json b/models/abl/llm/20260617_203747/strata_info.json new file mode 100644 index 0000000..ef3be58 --- /dev/null +++ b/models/abl/llm/20260617_203747/strata_info.json @@ -0,0 +1,60 @@ +{ + "original_strata_counts": { + "T0|P0|E0": "5", + "T0|P0|E1": "58", + "T0|P0|E2": "169", + "T0|P1|E0": "1", + "T0|P1|E1": "17", + "T0|P1|E2": "32", + "T0|P2|E2": "3", + "T1|P0|E2": "9", + "T1|P1|E2": "5", + "TNA|P0|E0": "28", + "TNA|P0|E1": "21", + "TNA|P0|E2": "20", + "TNA|P1|E0": "29", + "TNA|P1|E1": "7", + "TNA|P1|E2": "14", + "TNA|P2|E2": "1", + "TNA|P3|E0": "1" + }, + "rare_strata": [ + "T0|P1|E0", + "T0|P2|E2", + "TNA|P2|E2", + "TNA|P3|E0" + ], + "final_strata": [ + "RARE", + "T0|P0|E0", + "T0|P0|E1", + "T0|P0|E2", + "T0|P1|E1", + "T0|P1|E2", + "T1|P0|E2", + "T1|P1|E2", + "TNA|P0|E0", + "TNA|P0|E1", + "TNA|P0|E2", + "TNA|P1|E0", + "TNA|P1|E1", + "TNA|P1|E2" + ], + "final_strata_counts": { + "RARE": "6", + "T0|P0|E0": "5", + "T0|P0|E1": "58", + "T0|P0|E2": "169", + "T0|P1|E1": "17", + "T0|P1|E2": "32", + "T1|P0|E2": "9", + "T1|P1|E2": "5", + "TNA|P0|E0": "28", + "TNA|P0|E1": "21", + "TNA|P0|E2": "20", + "TNA|P1|E0": "29", + "TNA|P1|E1": "7", + "TNA|P1|E2": "14" + }, + "n_rare_merged": "6" +} \ No newline at end of file diff --git a/models/abl/llm/20260617_203747/summary.json b/models/abl/llm/20260617_203747/summary.json new file mode 100644 index 0000000..c11eeec --- /dev/null +++ b/models/abl/llm/20260617_203747/summary.json @@ -0,0 +1,947 @@ +{ + "fold_results": [ + { + "fold": 0, + "best_params": { + "dropout": 0.17394178221021084, + "lr": 0.0008692991511139548, + "weight_decay": 0.012604664585649461, + "backbone_lr_ratio": 0.7568292060167615, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.32257861692567663, + "rmse": 0.567960048705608, + "mae": 0.31035865933062085, + "r2": -0.07107675306042016 + }, + "delivery": { + "n_samples": 58, + "mse": 0.5663698080597032, + "rmse": 0.7525754500777335, + "mae": 0.5982509058225771, + "r2": 0.28010979698326477 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7619047619047619, + "precision": 0.41369047619047616, + "recall": 0.570647931303669, + "f1": 0.4308211473565804 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7261904761904762, + "precision": 0.6878324844368987, + "recall": 0.7209523809523809, + "f1": 0.6887741512487962 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3926160201854191, + "js_divergence": 0.08674307332595234 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.10384800371647304, + "lr": 0.0001279570746472226, + "weight_decay": 4.1852509552898965e-05, + "backbone_lr_ratio": 0.3376629665631628, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 17, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.08957809256845296, + "rmse": 0.29929599490880754, + "mae": 0.23231829348064603, + "r2": -0.4840085838962582 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0507386739143396, + "rmse": 1.0250554491901107, + "mae": 0.6530180171926002, + "r2": 0.20466657047540615 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.4880952380952381, + "precision": 0.24191919191919192, + "recall": 0.21825396825396826, + "f1": 0.2222222222222222 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.49025974025974023, + "recall": 0.4884639170353456, + "f1": 0.4755038065382893 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.49752328596137474, + "js_divergence": 0.1298567265780671 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.2636290439443595, + "lr": 0.00010466580528023322, + "weight_decay": 0.006927746271980836, + "backbone_lr_ratio": 0.8337818756564023, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.10270568332175314, + "rmse": 0.32047727426722966, + "mae": 0.26504439683187575, + "r2": -0.10045868444087502 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6479334722947253, + "rmse": 0.804943148486106, + "mae": 0.5286491472351675, + "r2": 0.13748824601867593 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.43184754521963825, + "recall": 0.7014848950332823, + "f1": 0.43844797178130507 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5883295286154832, + "recall": 0.6176470588235293, + "f1": 0.5941360089186176 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3661685785379984, + "js_divergence": 0.097896603299405 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.26162738320409185, + "lr": 0.0004044490597558798, + "weight_decay": 7.205221534692395e-05, + "backbone_lr_ratio": 0.07900176413772968, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 14, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.4464246305433506, + "rmse": 0.6681501556860932, + "mae": 0.4577071551817009, + "r2": -0.3698704396635446 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7483002407454893, + "rmse": 0.8650434906670816, + "mae": 0.6075752978449909, + "r2": 0.2725632597658799 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.47149122807017546, + "recall": 0.7437275985663083, + "f1": 0.4655994978028876 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6331979820351913, + "recall": 0.6534942182001006, + "f1": 0.6372471762542685 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.45626077922317954, + "js_divergence": 0.11599223837350767 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.3625765078454039, + "lr": 0.0002275295018001268, + "weight_decay": 0.0448416500708463, + "backbone_lr_ratio": 0.9894719193206745, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 18, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.1515180161283022, + "rmse": 0.38925315172558617, + "mae": 0.2619989627883548, + "r2": -0.09995979989219483 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9644662063026374, + "rmse": 0.9820724037985373, + "mae": 0.6300572055424082, + "r2": 0.06737710001181019 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.35128205128205126, + "recall": 0.5418586789554531, + "f1": 0.359983498349835 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7142857142857143, + "precision": 0.6777971351142082, + "recall": 0.7316239316239317, + "f1": 0.6927021107128635 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.4022183174014837, + "js_divergence": 0.10679024644721553 + } + } + }, + { + "fold": 0, + "best_params": { + "dropout": 0.17394178221021084, + "lr": 0.0008692991511139548, + "weight_decay": 0.012604664585649461, + "backbone_lr_ratio": 0.7568292060167615, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.27335362785162987, + "rmse": 0.5228323133200834, + "mae": 0.2646587670567524, + "r2": 0.09236787314991679 + }, + "delivery": { + "n_samples": 58, + "mse": 0.6266138798614104, + "rmse": 0.7915894642182969, + "mae": 0.6268783063338749, + "r2": 0.20353594636000905 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.34911616161616166, + "recall": 0.532591725214676, + "f1": 0.3726817042606517 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.6745750184774574, + "recall": 0.65, + "f1": 0.6212006495929071 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9827586206896551, + "precision": 0.9912280701754386, + "recall": 0.75, + "f1": 0.8289085545722714 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.36684155421249465, + "js_divergence": 0.08459006045737026 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.10384800371647304, + "lr": 0.0001279570746472226, + "weight_decay": 4.1852509552898965e-05, + "backbone_lr_ratio": 0.3376629665631628, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 17, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.08146984680414535, + "rmse": 0.2854292325676285, + "mae": 0.21767334143320718, + "r2": -0.3496821434735853 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0904473156848673, + "rmse": 1.0442448542774188, + "mae": 0.6599734681124081, + "r2": 0.1746099912086837 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.3838763575605681, + "recall": 0.37566137566137564, + "f1": 0.3487872596783488 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4564636752136752, + "recall": 0.4544740973312402, + "f1": 0.4475740309073643 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.5191994338273651, + "js_divergence": 0.133390010507665 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.2636290439443595, + "lr": 0.00010466580528023322, + "weight_decay": 0.006927746271980836, + "backbone_lr_ratio": 0.8337818756564023, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.12125461439631278, + "rmse": 0.34821633275352376, + "mae": 0.2753084216799055, + "r2": -0.29920457296339475 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6854320028215705, + "rmse": 0.8279082091763377, + "mae": 0.5523756401070083, + "r2": 0.08757120249585015 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.4586220836220836, + "recall": 0.7329749103942652, + "f1": 0.4518518518518519 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6279802069275754, + "recall": 0.6944444444444443, + "f1": 0.6439817992323139 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3964294851645634, + "js_divergence": 0.10166093827031751 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.26162738320409185, + "lr": 0.0004044490597558798, + "weight_decay": 7.205221534692395e-05, + "backbone_lr_ratio": 0.07900176413772968, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 14, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.4492520714018539, + "rmse": 0.6702626883557325, + "mae": 0.4418497430272849, + "r2": -0.378546546192986 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7723968020638662, + "rmse": 0.878861082346844, + "mae": 0.6126736976932419, + "r2": 0.24913853923013773 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.4175641025641026, + "recall": 0.680747567844342, + "f1": 0.43159687042665773 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6309523809523809, + "precision": 0.5534853959650707, + "recall": 0.5724736048265461, + "f1": 0.5548289684944762 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.431312081575883, + "js_divergence": 0.11082453680268824 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.3625765078454039, + "lr": 0.0002275295018001268, + "weight_decay": 0.0448416500708463, + "backbone_lr_ratio": 0.9894719193206745, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 18, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.170886835718096, + "rmse": 0.41338460991925663, + "mae": 0.29878092663628714, + "r2": -0.24056963273277931 + }, + "delivery": { + "n_samples": 58, + "mse": 0.968847127241079, + "rmse": 0.9843003237026182, + "mae": 0.6712857072466406, + "r2": 0.06314082178502656 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.3400862068965517, + "recall": 0.5228494623655914, + "f1": 0.3645325203252032 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6417989417989417, + "recall": 0.6871794871794873, + "f1": 0.6548463356973995 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.393825272071608, + "js_divergence": 0.10333396074064978 + } + } + }, + { + "fold": 0, + "best_params": { + "dropout": 0.17394178221021084, + "lr": 0.0008692991511139548, + "weight_decay": 0.012604664585649461, + "backbone_lr_ratio": 0.7568292060167615, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.27246983404452624, + "rmse": 0.5219864309007718, + "mae": 0.28265616979943703, + "r2": 0.09530238570474492 + }, + "delivery": { + "n_samples": 58, + "mse": 0.604184383301435, + "rmse": 0.7772929842095804, + "mae": 0.6221898367050392, + "r2": 0.23204518997142287 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7380952380952381, + "precision": 0.39046451914098973, + "recall": 0.5624512099921936, + "f1": 0.4189728353140917 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6848595848595848, + "recall": 0.6666666666666666, + "f1": 0.6505561230280331 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.39513784060217455, + "js_divergence": 0.08783549794397413 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.10384800371647304, + "lr": 0.0001279570746472226, + "weight_decay": 4.1852509552898965e-05, + "backbone_lr_ratio": 0.3376629665631628, + "llm_lora_r": 16, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 17, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.10195066921659326, + "rmse": 0.31929714877617255, + "mae": 0.22798235643477666, + "r2": -0.6889806861624865 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0993270249173992, + "rmse": 1.0484879708024308, + "mae": 0.6632463136596269, + "r2": 0.16788869144841 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5119047619047619, + "precision": 0.34006734006734013, + "recall": 0.31216931216931215, + "f1": 0.3148148148148148 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.47448872021927047, + "recall": 0.47331240188383045, + "f1": 0.46254778641016153 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.5088345898691146, + "js_divergence": 0.1334314820265482 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.2636290439443595, + "lr": 0.00010466580528023322, + "weight_decay": 0.006927746271980836, + "backbone_lr_ratio": 0.8337818756564023, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 22, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.12090247209069646, + "rmse": 0.34771032784589023, + "mae": 0.2784879008928935, + "r2": -0.29543148031806843 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6492677806116993, + "rmse": 0.8057715436844983, + "mae": 0.5516021698790913, + "r2": 0.13571205038126077 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.4586220836220836, + "recall": 0.7329749103942652, + "f1": 0.4518518518518519 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6032256850346281, + "recall": 0.6454248366013072, + "f1": 0.6147342995169082 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.3796575473458722, + "js_divergence": 0.10108036272798335 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.26162738320409185, + "lr": 0.0004044490597558798, + "weight_decay": 7.205221534692395e-05, + "backbone_lr_ratio": 0.07900176413772968, + "llm_lora_r": 32, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 14, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.45122799383005324, + "rmse": 0.6717350622306782, + "mae": 0.44397926330566406, + "r2": -0.3846097370213326 + }, + "delivery": { + "n_samples": 59, + "mse": 0.8108848103710049, + "rmse": 0.9004914271502005, + "mae": 0.6249074435682368, + "r2": 0.2117236223604647 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.35099206349206347, + "recall": 0.5499231950844854, + "f1": 0.3530056759545923 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5756257631257631, + "recall": 0.5945198592257416, + "f1": 0.5782485101535254 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.4477290570324428, + "js_divergence": 0.11535991205187913 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.3625765078454039, + "lr": 0.0002275295018001268, + "weight_decay": 0.0448416500708463, + "backbone_lr_ratio": 0.9894719193206745, + "llm_lora_r": 8, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 18, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.19538948202688425, + "rmse": 0.4420288248823647, + "mae": 0.3140518381482079, + "r2": -0.41844898080859916 + }, + "delivery": { + "n_samples": 58, + "mse": 0.8735566441358382, + "rmse": 0.9346425221098376, + "mae": 0.6355925653258274, + "r2": 0.15528514588278453 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.3333333333333333, + "recall": 0.5149769585253456, + "f1": 0.3569777217318201 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.618080808080808, + "recall": 0.6594017094017094, + "f1": 0.632253086419753 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.40700346878885973, + "js_divergence": 0.10808181429714495 + } + } + } + ], + "summary_stats": { + "size": { + "mse_mean": 0.22339749912455512, + "mse_std": 0.13276860667147747, + "rmse_mean": 0.45253463978969516, + "rmse_std": 0.13641810332564366, + "mae_mean": 0.3048570797351743, + "mae_std": 0.07637999745755018, + "r2_mean": -0.2662118521181242, + "r2_std": 0.20796761595726418 + }, + "delivery": { + "mse_mean": 0.810584411488471, + "mse_std": 0.17918852622038825, + "rmse_mean": 0.8948853549265088, + "rmse_std": 0.09881605652183918, + "mae_mean": 0.6158850481512493, + "mae_std": 0.04133793584599054, + "r2_mean": 0.1761904116252725, + "r2_std": 0.0670662068919268 + }, + "pdi": { + "accuracy_mean": 0.6, + "accuracy_std": 0.07271331378442132, + "precision_mean": 0.382198316306454, + "precision_std": 0.059482007465697324, + "recall_mean": 0.552886246650569, + "recall_std": 0.15151126540989962, + "f1_mean": 0.3854764962481809, + "f1_std": 0.06295617241236845 + }, + "ee": { + "accuracy_mean": 0.6492063492063492, + "accuracy_std": 0.05989829290194668, + "precision_mean": 0.5992000446776198, + "precision_std": 0.0738385570229797, + "recall_mean": 0.6206719076130841, + "recall_std": 0.08494291371338275, + "f1_mean": 0.5966089895417119, + "f1_std": 0.07618779152357238 + }, + "toxic": { + "accuracy_mean": 0.9511890595408049, + "accuracy_std": 0.016071213375949578, + "precision_mean": 0.7617961570593149, + "precision_std": 0.0689235340767993, + "recall_mean": 0.958294443004062, + "recall_std": 0.05613748087593979, + "f1_mean": 0.8151453855878632, + "f1_std": 0.03136647604932653 + }, + "biodist": { + "kl_divergence_mean": 0.4240504874533223, + "kl_divergence_std": 0.049093469886439346, + "js_divergence_mean": 0.1077911642566912, + "js_divergence_std": 0.015306583731384354 + } + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_0/best_params.json b/models/abl/moe/20260617_191948/outer_fold_0/best_params.json new file mode 100644 index 0000000..39574c1 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_0/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.11659837578806788, + "lr": 0.00026604612647882186, + "weight_decay": 0.00021355962098733124, + "backbone_lr_ratio": 0.29733721720121176, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_0/splits.json b/models/abl/moe/20260617_191948/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_0/test_metrics.json b/models/abl/moe/20260617_191948/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..b2704e6 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.24151334347557607, + "rmse": 0.4914400710926777, + "mae": 0.25384363496159934, + "r2": 0.1980890419336545 + }, + "delivery": { + "n_samples": 58, + "mse": 0.6215165843621644, + "rmse": 0.7883632312342861, + "mae": 0.6303568019949156, + "r2": 0.21001491653032867 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.34911616161616166, + "recall": 0.532591725214676, + "f1": 0.3726817042606517 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7261904761904762, + "precision": 0.6833403612340994, + "recall": 0.730952380952381, + "f1": 0.6870884387763607 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3475976565313305, + "js_divergence": 0.08236128812465786 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_1/best_params.json b/models/abl/moe/20260617_191948/outer_fold_1/best_params.json new file mode 100644 index 0000000..97afcf4 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_1/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.18614946459458093, + "lr": 0.00015757063904422037, + "weight_decay": 0.000955120409040689, + "backbone_lr_ratio": 0.9059364477738808, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_1/splits.json b/models/abl/moe/20260617_191948/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_1/test_metrics.json b/models/abl/moe/20260617_191948/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..968f072 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.07934253557006275, + "rmse": 0.281678070800804, + "mae": 0.21441291059766496, + "r2": -0.3144397304964943 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0472045646776351, + "rmse": 1.0233301347452028, + "mae": 0.6786254059034781, + "r2": 0.20734163639743197 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6309523809523809, + "precision": 0.2611111111111111, + "recall": 0.24206349206349206, + "f1": 0.25 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5595238095238095, + "precision": 0.49978354978354983, + "recall": 0.49526663812378097, + "f1": 0.48344031447479724 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.4763434813369227, + "js_divergence": 0.12345390425610421 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_2/best_params.json b/models/abl/moe/20260617_191948/outer_fold_2/best_params.json new file mode 100644 index 0000000..8ccbf40 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_2/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.27066334445695367, + "lr": 0.00024715599869840884, + "weight_decay": 1.0172836375002765e-05, + "backbone_lr_ratio": 0.5054041560165133, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_2/splits.json b/models/abl/moe/20260617_191948/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_2/test_metrics.json b/models/abl/moe/20260617_191948/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..6123b1e --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.1393018116424732, + "rmse": 0.37323157910668975, + "mae": 0.30152987014679683, + "r2": -0.49257454331973105 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6391425542093007, + "rmse": 0.7994639167650411, + "mae": 0.5482877640752122, + "r2": 0.14919048166659254 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.4258597883597883, + "recall": 0.6909882232462877, + "f1": 0.4396490918709222 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6053508771929824, + "recall": 0.6573295985060691, + "f1": 0.6168590642643939 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.29610571824726867, + "js_divergence": 0.07901143607137948 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_3/best_params.json b/models/abl/moe/20260617_191948/outer_fold_3/best_params.json new file mode 100644 index 0000000..963e8ed --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_3/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.2778201867797741, + "lr": 0.0004781288818954282, + "weight_decay": 0.0016987970387862138, + "backbone_lr_ratio": 0.9458696393367624, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_3/splits.json b/models/abl/moe/20260617_191948/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_3/test_metrics.json b/models/abl/moe/20260617_191948/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..db8a929 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.3258503637013872, + "rmse": 0.5708330436313118, + "mae": 0.35500740717692547, + "r2": 0.00011614402893123099 + }, + "delivery": { + "n_samples": 59, + "mse": 0.9100019552700145, + "rmse": 0.9539402262563491, + "mae": 0.6691959031652344, + "r2": 0.11536998132084963 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.3551587301587302, + "recall": 0.5311059907834101, + "f1": 0.3651428571428571 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5822944896115628, + "recall": 0.6315736551030668, + "f1": 0.583905415713196 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.15341130227627944, + "js_divergence": 0.03932574094762976 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_4/best_params.json b/models/abl/moe/20260617_191948/outer_fold_4/best_params.json new file mode 100644 index 0000000..01bfebb --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_4/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.445253277169985, + "lr": 0.0002457483875420317, + "weight_decay": 0.00014672230276933923, + "backbone_lr_ratio": 0.2588275309142304, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_4/splits.json b/models/abl/moe/20260617_191948/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/outer_fold_4/test_metrics.json b/models/abl/moe/20260617_191948/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..027d49b --- /dev/null +++ b/models/abl/moe/20260617_191948/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.3157862632738926, + "rmse": 0.561948630458241, + "mae": 0.46222461689086186, + "r2": -1.2924811440596238 + }, + "delivery": { + "n_samples": 58, + "mse": 0.894030368182473, + "rmse": 0.945531791206659, + "mae": 0.6543392465160839, + "r2": 0.1354873927120125 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.3313131313131313, + "recall": 0.5182411674347158, + "f1": 0.34882312218760814 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6414141414141414, + "recall": 0.6649572649572649, + "f1": 0.6458333333333334 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.41797103371550187, + "js_divergence": 0.1075696933374844 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/best_params.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/best_params.json new file mode 100644 index 0000000..39574c1 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.11659837578806788, + "lr": 0.00026604612647882186, + "weight_decay": 0.00021355962098733124, + "backbone_lr_ratio": 0.29733721720121176, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/splits.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/test_metrics.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..f621b01 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.2913344988852884, + "rmse": 0.539754109651134, + "mae": 0.2935657845922263, + "r2": 0.03266492957766376 + }, + "delivery": { + "n_samples": 58, + "mse": 0.6689203995885333, + "rmse": 0.8178755404024095, + "mae": 0.6310591241023664, + "r2": 0.1497618068457085 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.3387987012987013, + "recall": 0.532591725214676, + "f1": 0.3577380952380953 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.688189110769756, + "recall": 0.7452380952380953, + "f1": 0.6821408529741864 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9827586206896551, + "precision": 0.9912280701754386, + "recall": 0.75, + "f1": 0.8289085545722714 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3378843364368577, + "js_divergence": 0.0825013706213184 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/best_params.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/best_params.json new file mode 100644 index 0000000..97afcf4 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.18614946459458093, + "lr": 0.00015757063904422037, + "weight_decay": 0.000955120409040689, + "backbone_lr_ratio": 0.9059364477738808, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/splits.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/test_metrics.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..8823ca4 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.07875340556972314, + "rmse": 0.28063037178773637, + "mae": 0.2168605923652649, + "r2": -0.3046798221029694 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0042013711545308, + "rmse": 1.0020984837602194, + "mae": 0.6381056923419237, + "r2": 0.2398919538401385 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.28846153846153844, + "recall": 0.27380952380952384, + "f1": 0.26176470588235295 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5595238095238095, + "precision": 0.49570604833762727, + "recall": 0.49526663812378097, + "f1": 0.4855665407389545 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.44548003202564046, + "js_divergence": 0.11344950900067649 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/best_params.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/best_params.json new file mode 100644 index 0000000..8ccbf40 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.27066334445695367, + "lr": 0.00024715599869840884, + "weight_decay": 1.0172836375002765e-05, + "backbone_lr_ratio": 0.5054041560165133, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/splits.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/test_metrics.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..d368091 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.21586856281890104, + "rmse": 0.464616576134452, + "mae": 0.3479909045355661, + "r2": -1.3129628952238908 + }, + "delivery": { + "n_samples": 60, + "mse": 0.653652792026344, + "rmse": 0.8084879665315644, + "mae": 0.5382411242850745, + "r2": 0.1298748401610842 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4276315789473684, + "recall": 0.6958525345622121, + "f1": 0.42300062774639047 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6053508771929824, + "recall": 0.6573295985060691, + "f1": 0.6168590642643939 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.30110808565332015, + "js_divergence": 0.07808617669952787 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/best_params.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/best_params.json new file mode 100644 index 0000000..963e8ed --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.2778201867797741, + "lr": 0.0004781288818954282, + "weight_decay": 0.0016987970387862138, + "backbone_lr_ratio": 0.9458696393367624, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/splits.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/test_metrics.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..08f66fa --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.3297365176991437, + "rmse": 0.5742268869524865, + "mae": 0.3261373416486993, + "r2": -0.011808662805825154 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7657906728091051, + "rmse": 0.8750946650557899, + "mae": 0.5747662091753998, + "r2": 0.2555604817459669 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.34004329004329004, + "recall": 0.5307219662058371, + "f1": 0.3543192918192918 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5846866096866097, + "recall": 0.6315736551030668, + "f1": 0.5823533191954245 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9166666666666666, + "precision": 0.6875, + "recall": 0.956140350877193, + "f1": 0.749791492910759 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.2686512579596156, + "js_divergence": 0.06891811070906341 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/best_params.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/best_params.json new file mode 100644 index 0000000..01bfebb --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.445253277169985, + "lr": 0.0002457483875420317, + "weight_decay": 0.00014672230276933923, + "backbone_lr_ratio": 0.2588275309142304, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/splits.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/test_metrics.json b/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..74927cd --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_1/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.29915782982104877, + "rmse": 0.5469532245275173, + "mae": 0.44856263058526175, + "r2": -1.1717654113653504 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9258910073532772, + "rmse": 0.9622323042557225, + "mae": 0.6478613211676992, + "r2": 0.10467868059252439 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.328125, + "recall": 0.5144009216589862, + "f1": 0.3488413547237077 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6225589225589225, + "recall": 0.6371794871794871, + "f1": 0.6226530205687535 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.36246349925173466, + "js_divergence": 0.09345889429140254 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/best_params.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/best_params.json new file mode 100644 index 0000000..39574c1 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.11659837578806788, + "lr": 0.00026604612647882186, + "weight_decay": 0.00021355962098733124, + "backbone_lr_ratio": 0.29733721720121176, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/splits.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/splits.json new file mode 100644 index 0000000..cccb9d8 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 75, 76, 77, 80, 81, 85, 86, 88, 89, 90, 92, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 111, 113, 114, 115, 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 133, 134, 135, 136, 138, 139, 141, 144, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 156, 157, 158, 159, 160, 163, 164, 167, 168, 169, 170, 171, 172, 175, 176, 178, 179, 180, 182, 183, 184, 185, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 206, 208, 210, 211, 212, 213, 216, 217, 218, 219, 220, 222, 224, 225, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 265, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 285, 286, 287, 288, 291, 292, 294, 296, 297, 298, 299, 300, 301, 303, 304, 306, 307, 308, 309, 310, 311, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 335, 336, 337, 338, 339, 340, 342, 343, 344, 345, 346, 347, 348, 349, 351, 352, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 374, 375, 377, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 393, 395, 396, 397, 398, 399, 400, 401, 403, 404, 405, 406, 407, 408, 409, 411, 412, 413, 414, 415, 417, 418, 419], "outer_test_idx": [7, 16, 20, 29, 51, 59, 60, 69, 70, 74, 78, 79, 82, 83, 84, 87, 91, 93, 97, 102, 110, 112, 119, 120, 121, 132, 137, 140, 142, 143, 152, 161, 162, 165, 166, 173, 174, 177, 181, 186, 187, 194, 205, 207, 209, 214, 215, 221, 223, 226, 235, 238, 240, 243, 246, 251, 254, 263, 264, 266, 273, 284, 289, 290, 293, 295, 302, 305, 314, 315, 331, 334, 341, 350, 353, 361, 373, 376, 378, 392, 394, 402, 410, 416]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/test_metrics.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/test_metrics.json new file mode 100644 index 0000000..0de795e --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_0/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.25539435269510624, + "rmse": 0.5053655634242467, + "mae": 0.2715319524328393, + "r2": 0.15199911066123628 + }, + "delivery": { + "n_samples": 58, + "mse": 0.5401788750549795, + "rmse": 0.7349686218165913, + "mae": 0.5700714552839254, + "r2": 0.3134000532957635 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5238095238095238, + "precision": 0.34578392621870885, + "recall": 0.53551912568306, + "f1": 0.34206626442256804 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.75, + "precision": 0.7166666666666667, + "recall": 0.7785714285714285, + "f1": 0.7271511627906978 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3182339907718673, + "js_divergence": 0.07309337216987152 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/best_params.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/best_params.json new file mode 100644 index 0000000..97afcf4 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.18614946459458093, + "lr": 0.00015757063904422037, + "weight_decay": 0.000955120409040689, + "backbone_lr_ratio": 0.9059364477738808, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/splits.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/splits.json new file mode 100644 index 0000000..1773fe5 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 24, 26, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 112, 114, 115, 118, 119, 120, 121, 123, 124, 125, 126, 128, 129, 130, 131, 132, 136, 137, 140, 141, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 194, 195, 196, 197, 198, 199, 201, 202, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 228, 229, 231, 232, 233, 234, 235, 236, 237, 238, 240, 242, 243, 244, 246, 247, 248, 250, 251, 252, 254, 255, 256, 258, 259, 260, 261, 262, 263, 264, 266, 268, 269, 270, 271, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 295, 296, 297, 300, 301, 302, 303, 304, 305, 306, 307, 308, 310, 311, 313, 314, 315, 316, 317, 318, 319, 321, 322, 323, 324, 325, 327, 328, 329, 330, 331, 333, 334, 335, 337, 338, 339, 340, 341, 342, 343, 344, 345, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 362, 364, 365, 366, 367, 368, 369, 373, 374, 375, 376, 378, 379, 380, 381, 382, 384, 387, 388, 389, 391, 392, 393, 394, 396, 397, 398, 399, 402, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 416, 417, 419], "outer_test_idx": [1, 2, 4, 8, 9, 14, 17, 22, 23, 25, 28, 34, 37, 41, 43, 45, 63, 64, 68, 85, 96, 104, 111, 113, 116, 117, 122, 127, 133, 134, 135, 138, 139, 147, 160, 163, 170, 180, 191, 192, 193, 200, 203, 208, 224, 227, 230, 239, 241, 245, 249, 253, 257, 265, 267, 272, 280, 294, 298, 299, 309, 312, 320, 326, 332, 336, 346, 347, 360, 363, 370, 371, 372, 377, 383, 385, 386, 390, 395, 400, 401, 407, 415, 418]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/test_metrics.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/test_metrics.json new file mode 100644 index 0000000..521c53f --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_1/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.09045275471905934, + "rmse": 0.30075364456488196, + "mae": 0.23161025274367558, + "r2": -0.4984988024563053 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0258191430256933, + "rmse": 1.0128273016786689, + "mae": 0.6263890392528694, + "r2": 0.2235288589357498 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5238095238095238, + "precision": 0.27182539682539686, + "recall": 0.25396825396825395, + "f1": 0.24962406015037591 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5595238095238095, + "precision": 0.506110257723161, + "recall": 0.5057561486132914, + "f1": 0.49192340762639003 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.46752297086632433, + "js_divergence": 0.11978345787287335 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/best_params.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/best_params.json new file mode 100644 index 0000000..8ccbf40 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.27066334445695367, + "lr": 0.00024715599869840884, + "weight_decay": 1.0172836375002765e-05, + "backbone_lr_ratio": 0.5054041560165133, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/splits.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/splits.json new file mode 100644 index 0000000..14df306 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 68, 69, 70, 72, 74, 76, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 91, 93, 94, 95, 96, 97, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 142, 143, 145, 147, 148, 149, 150, 151, 152, 153, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 179, 180, 181, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 235, 236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 249, 250, 251, 252, 253, 254, 255, 256, 257, 259, 260, 261, 263, 264, 265, 266, 267, 268, 269, 271, 272, 273, 274, 275, 276, 280, 281, 282, 283, 284, 285, 287, 289, 290, 293, 294, 295, 296, 297, 298, 299, 300, 302, 303, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 317, 318, 320, 321, 322, 323, 324, 326, 327, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 358, 360, 361, 363, 364, 365, 366, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 392, 394, 395, 398, 399, 400, 401, 402, 404, 405, 407, 408, 409, 410, 412, 413, 414, 415, 416, 417, 418], "outer_test_idx": [10, 12, 15, 31, 35, 42, 46, 52, 53, 54, 62, 66, 67, 71, 73, 75, 77, 81, 89, 90, 92, 98, 99, 105, 123, 124, 141, 144, 146, 154, 155, 164, 169, 176, 178, 182, 189, 190, 195, 198, 201, 206, 216, 217, 218, 219, 231, 234, 244, 247, 248, 258, 262, 270, 277, 278, 279, 286, 288, 291, 292, 301, 304, 306, 316, 319, 325, 328, 343, 357, 359, 362, 367, 374, 375, 384, 391, 393, 396, 397, 403, 406, 411, 419]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/test_metrics.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/test_metrics.json new file mode 100644 index 0000000..663ad9b --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_2/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.18305400438734884, + "rmse": 0.42784810901457637, + "mae": 0.33086523839405607, + "r2": -0.961365353255677 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6782912801570451, + "rmse": 0.8235844098555078, + "mae": 0.5519710779888556, + "r2": 0.09707674202024197 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.4318260568260568, + "recall": 0.7012288786482334, + "f1": 0.4298268907350504 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5916666666666667, + "recall": 0.6414565826330533, + "f1": 0.6008547008547008 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.2848294483055189, + "js_divergence": 0.07664507104164577 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/best_params.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/best_params.json new file mode 100644 index 0000000..963e8ed --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.2778201867797741, + "lr": 0.0004781288818954282, + "weight_decay": 0.0016987970387862138, + "backbone_lr_ratio": 0.9458696393367624, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/splits.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/splits.json new file mode 100644 index 0000000..7a2b13e --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [0, 1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 104, 105, 106, 109, 110, 111, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 129, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 172, 173, 174, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 194, 195, 198, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 221, 223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 251, 252, 253, 254, 255, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276, 277, 278, 279, 280, 282, 284, 286, 288, 289, 290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 314, 315, 316, 317, 319, 320, 321, 325, 326, 327, 328, 331, 332, 334, 336, 340, 341, 343, 344, 346, 347, 348, 350, 352, 353, 357, 359, 360, 361, 362, 363, 364, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 400, 401, 402, 403, 404, 406, 407, 410, 411, 412, 414, 415, 416, 418, 419], "outer_test_idx": [3, 6, 13, 18, 19, 26, 33, 44, 48, 49, 50, 56, 57, 72, 80, 88, 94, 101, 103, 107, 108, 114, 126, 128, 130, 145, 149, 157, 167, 171, 175, 188, 196, 197, 199, 211, 220, 222, 225, 229, 232, 236, 250, 260, 261, 271, 281, 283, 285, 287, 296, 300, 303, 311, 313, 318, 322, 323, 324, 329, 330, 333, 335, 337, 338, 339, 342, 345, 349, 351, 354, 355, 356, 358, 365, 369, 381, 388, 399, 405, 408, 409, 413, 417]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/test_metrics.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/test_metrics.json new file mode 100644 index 0000000..ab9e68a --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_3/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 83, + "mse": 0.3129556437133723, + "rmse": 0.5594243860553205, + "mae": 0.3127409808606987, + "r2": 0.039684067774135356 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7857185201725363, + "rmse": 0.8864076489812891, + "mae": 0.6024630838626269, + "r2": 0.23618824646311343 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.38567649281934996, + "recall": 0.5862135176651306, + "f1": 0.40061936936936937 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.5957671957671957, + "recall": 0.6363247863247863, + "f1": 0.5951323580633926 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.37168209467721186, + "js_divergence": 0.09777546387972921 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/best_params.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/best_params.json new file mode 100644 index 0000000..01bfebb --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/best_params.json @@ -0,0 +1,15 @@ +{ + "dropout": 0.445253277169985, + "lr": 0.0002457483875420317, + "weight_decay": 0.00014672230276933923, + "backbone_lr_ratio": 0.2588275309142304, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/splits.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/splits.json new file mode 100644 index 0000000..8dd0299 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/splits.json @@ -0,0 +1 @@ +{"outer_train_idx": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 35, 37, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 59, 60, 62, 63, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 112, 113, 114, 116, 117, 119, 120, 121, 122, 123, 124, 126, 127, 128, 130, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 149, 152, 154, 155, 157, 160, 161, 162, 163, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 205, 206, 207, 208, 209, 211, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 234, 235, 236, 238, 239, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 253, 254, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 277, 278, 279, 280, 281, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 306, 309, 311, 312, 313, 314, 315, 316, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 341, 342, 343, 345, 346, 347, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 365, 367, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 381, 383, 384, 385, 386, 388, 390, 391, 392, 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 413, 415, 416, 417, 418, 419], "outer_test_idx": [0, 5, 11, 21, 24, 27, 30, 32, 36, 38, 39, 40, 47, 55, 58, 61, 65, 76, 86, 95, 100, 106, 109, 115, 118, 125, 129, 131, 136, 148, 150, 151, 153, 156, 158, 159, 168, 172, 179, 183, 184, 185, 202, 204, 210, 212, 213, 228, 233, 237, 242, 252, 255, 256, 259, 268, 269, 274, 275, 276, 282, 297, 307, 308, 310, 317, 321, 327, 340, 344, 348, 352, 364, 366, 368, 379, 380, 382, 387, 389, 398, 404, 412, 414]} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/test_metrics.json b/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/test_metrics.json new file mode 100644 index 0000000..493d2c3 --- /dev/null +++ b/models/abl/moe/20260617_191948/repeat_2/outer_fold_4/test_metrics.json @@ -0,0 +1,42 @@ +{ + "size": { + "n_samples": 84, + "mse": 0.2967457163832042, + "rmse": 0.544743716240219, + "mae": 0.461613933245341, + "r2": -1.1542544388605225 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9213812458325495, + "rmse": 0.9598860587760141, + "mae": 0.6561634901525646, + "r2": 0.10903954553546502 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.4396781819568367, + "recall": 0.7017409114183307, + "f1": 0.46197533353496656 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6104279510076611, + "recall": 0.6205128205128205, + "f1": 0.610010886870937 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.43138180820562744, + "js_divergence": 0.11081996861265214 + } +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/strata_info.json b/models/abl/moe/20260617_191948/strata_info.json new file mode 100644 index 0000000..ef3be58 --- /dev/null +++ b/models/abl/moe/20260617_191948/strata_info.json @@ -0,0 +1,60 @@ +{ + "original_strata_counts": { + "T0|P0|E0": "5", + "T0|P0|E1": "58", + "T0|P0|E2": "169", + "T0|P1|E0": "1", + "T0|P1|E1": "17", + "T0|P1|E2": "32", + "T0|P2|E2": "3", + "T1|P0|E2": "9", + "T1|P1|E2": "5", + "TNA|P0|E0": "28", + "TNA|P0|E1": "21", + "TNA|P0|E2": "20", + "TNA|P1|E0": "29", + "TNA|P1|E1": "7", + "TNA|P1|E2": "14", + "TNA|P2|E2": "1", + "TNA|P3|E0": "1" + }, + "rare_strata": [ + "T0|P1|E0", + "T0|P2|E2", + "TNA|P2|E2", + "TNA|P3|E0" + ], + "final_strata": [ + "RARE", + "T0|P0|E0", + "T0|P0|E1", + "T0|P0|E2", + "T0|P1|E1", + "T0|P1|E2", + "T1|P0|E2", + "T1|P1|E2", + "TNA|P0|E0", + "TNA|P0|E1", + "TNA|P0|E2", + "TNA|P1|E0", + "TNA|P1|E1", + "TNA|P1|E2" + ], + "final_strata_counts": { + "RARE": "6", + "T0|P0|E0": "5", + "T0|P0|E1": "58", + "T0|P0|E2": "169", + "T0|P1|E1": "17", + "T0|P1|E2": "32", + "T1|P0|E2": "9", + "T1|P1|E2": "5", + "TNA|P0|E0": "28", + "TNA|P0|E1": "21", + "TNA|P0|E2": "20", + "TNA|P1|E0": "29", + "TNA|P1|E1": "7", + "TNA|P1|E2": "14" + }, + "n_rare_merged": "6" +} \ No newline at end of file diff --git a/models/abl/moe/20260617_191948/summary.json b/models/abl/moe/20260617_191948/summary.json new file mode 100644 index 0000000..ede08f9 --- /dev/null +++ b/models/abl/moe/20260617_191948/summary.json @@ -0,0 +1,977 @@ +{ + "fold_results": [ + { + "fold": 0, + "best_params": { + "dropout": 0.11659837578806788, + "lr": 0.00026604612647882186, + "weight_decay": 0.00021355962098733124, + "backbone_lr_ratio": 0.29733721720121176, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 18, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.24151334347557607, + "rmse": 0.4914400710926777, + "mae": 0.25384363496159934, + "r2": 0.1980890419336545 + }, + "delivery": { + "n_samples": 58, + "mse": 0.6215165843621644, + "rmse": 0.7883632312342861, + "mae": 0.6303568019949156, + "r2": 0.21001491653032867 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.34911616161616166, + "recall": 0.532591725214676, + "f1": 0.3726817042606517 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.7261904761904762, + "precision": 0.6833403612340994, + "recall": 0.730952380952381, + "f1": 0.6870884387763607 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3475976565313305, + "js_divergence": 0.08236128812465786 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.18614946459458093, + "lr": 0.00015757063904422037, + "weight_decay": 0.000955120409040689, + "backbone_lr_ratio": 0.9059364477738808, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 16, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.07934253557006275, + "rmse": 0.281678070800804, + "mae": 0.21441291059766496, + "r2": -0.3144397304964943 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0472045646776351, + "rmse": 1.0233301347452028, + "mae": 0.6786254059034781, + "r2": 0.20734163639743197 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6309523809523809, + "precision": 0.2611111111111111, + "recall": 0.24206349206349206, + "f1": 0.25 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5595238095238095, + "precision": 0.49978354978354983, + "recall": 0.49526663812378097, + "f1": 0.48344031447479724 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.4763434813369227, + "js_divergence": 0.12345390425610421 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.27066334445695367, + "lr": 0.00024715599869840884, + "weight_decay": 1.0172836375002765e-05, + "backbone_lr_ratio": 0.5054041560165133, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 14, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.1393018116424732, + "rmse": 0.37323157910668975, + "mae": 0.30152987014679683, + "r2": -0.49257454331973105 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6391425542093007, + "rmse": 0.7994639167650411, + "mae": 0.5482877640752122, + "r2": 0.14919048166659254 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.4258597883597883, + "recall": 0.6909882232462877, + "f1": 0.4396490918709222 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6053508771929824, + "recall": 0.6573295985060691, + "f1": 0.6168590642643939 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.29610571824726867, + "js_divergence": 0.07901143607137948 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.2778201867797741, + "lr": 0.0004781288818954282, + "weight_decay": 0.0016987970387862138, + "backbone_lr_ratio": 0.9458696393367624, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.3258503637013872, + "rmse": 0.5708330436313118, + "mae": 0.35500740717692547, + "r2": 0.00011614402893123099 + }, + "delivery": { + "n_samples": 59, + "mse": 0.9100019552700145, + "rmse": 0.9539402262563491, + "mae": 0.6691959031652344, + "r2": 0.11536998132084963 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.3551587301587302, + "recall": 0.5311059907834101, + "f1": 0.3651428571428571 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5822944896115628, + "recall": 0.6315736551030668, + "f1": 0.583905415713196 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.15341130227627944, + "js_divergence": 0.03932574094762976 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.445253277169985, + "lr": 0.0002457483875420317, + "weight_decay": 0.00014672230276933923, + "backbone_lr_ratio": 0.2588275309142304, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 25, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.3157862632738926, + "rmse": 0.561948630458241, + "mae": 0.46222461689086186, + "r2": -1.2924811440596238 + }, + "delivery": { + "n_samples": 58, + "mse": 0.894030368182473, + "rmse": 0.945531791206659, + "mae": 0.6543392465160839, + "r2": 0.1354873927120125 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5714285714285714, + "precision": 0.3313131313131313, + "recall": 0.5182411674347158, + "f1": 0.34882312218760814 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.6414141414141414, + "recall": 0.6649572649572649, + "f1": 0.6458333333333334 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.41797103371550187, + "js_divergence": 0.1075696933374844 + } + } + }, + { + "fold": 0, + "best_params": { + "dropout": 0.11659837578806788, + "lr": 0.00026604612647882186, + "weight_decay": 0.00021355962098733124, + "backbone_lr_ratio": 0.29733721720121176, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 18, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.2913344988852884, + "rmse": 0.539754109651134, + "mae": 0.2935657845922263, + "r2": 0.03266492957766376 + }, + "delivery": { + "n_samples": 58, + "mse": 0.6689203995885333, + "rmse": 0.8178755404024095, + "mae": 0.6310591241023664, + "r2": 0.1497618068457085 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.3387987012987013, + "recall": 0.532591725214676, + "f1": 0.3577380952380953 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6904761904761905, + "precision": 0.688189110769756, + "recall": 0.7452380952380953, + "f1": 0.6821408529741864 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9827586206896551, + "precision": 0.9912280701754386, + "recall": 0.75, + "f1": 0.8289085545722714 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3378843364368577, + "js_divergence": 0.0825013706213184 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.18614946459458093, + "lr": 0.00015757063904422037, + "weight_decay": 0.000955120409040689, + "backbone_lr_ratio": 0.9059364477738808, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 16, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.07875340556972314, + "rmse": 0.28063037178773637, + "mae": 0.2168605923652649, + "r2": -0.3046798221029694 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0042013711545308, + "rmse": 1.0020984837602194, + "mae": 0.6381056923419237, + "r2": 0.2398919538401385 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.28846153846153844, + "recall": 0.27380952380952384, + "f1": 0.26176470588235295 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5595238095238095, + "precision": 0.49570604833762727, + "recall": 0.49526663812378097, + "f1": 0.4855665407389545 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.44548003202564046, + "js_divergence": 0.11344950900067649 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.27066334445695367, + "lr": 0.00024715599869840884, + "weight_decay": 1.0172836375002765e-05, + "backbone_lr_ratio": 0.5054041560165133, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 14, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.21586856281890104, + "rmse": 0.464616576134452, + "mae": 0.3479909045355661, + "r2": -1.3129628952238908 + }, + "delivery": { + "n_samples": 60, + "mse": 0.653652792026344, + "rmse": 0.8084879665315644, + "mae": 0.5382411242850745, + "r2": 0.1298748401610842 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5357142857142857, + "precision": 0.4276315789473684, + "recall": 0.6958525345622121, + "f1": 0.42300062774639047 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6053508771929824, + "recall": 0.6573295985060691, + "f1": 0.6168590642643939 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.30110808565332015, + "js_divergence": 0.07808617669952787 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.2778201867797741, + "lr": 0.0004781288818954282, + "weight_decay": 0.0016987970387862138, + "backbone_lr_ratio": 0.9458696393367624, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.3297365176991437, + "rmse": 0.5742268869524865, + "mae": 0.3261373416486993, + "r2": -0.011808662805825154 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7657906728091051, + "rmse": 0.8750946650557899, + "mae": 0.5747662091753998, + "r2": 0.2555604817459669 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.34004329004329004, + "recall": 0.5307219662058371, + "f1": 0.3543192918192918 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5846866096866097, + "recall": 0.6315736551030668, + "f1": 0.5823533191954245 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9166666666666666, + "precision": 0.6875, + "recall": 0.956140350877193, + "f1": 0.749791492910759 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.2686512579596156, + "js_divergence": 0.06891811070906341 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.445253277169985, + "lr": 0.0002457483875420317, + "weight_decay": 0.00014672230276933923, + "backbone_lr_ratio": 0.2588275309142304, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 25, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.29915782982104877, + "rmse": 0.5469532245275173, + "mae": 0.44856263058526175, + "r2": -1.1717654113653504 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9258910073532772, + "rmse": 0.9622323042557225, + "mae": 0.6478613211676992, + "r2": 0.10467868059252439 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5833333333333334, + "precision": 0.328125, + "recall": 0.5144009216589862, + "f1": 0.3488413547237077 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6785714285714286, + "precision": 0.6225589225589225, + "recall": 0.6371794871794871, + "f1": 0.6226530205687535 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.36246349925173466, + "js_divergence": 0.09345889429140254 + } + } + }, + { + "fold": 0, + "best_params": { + "dropout": 0.11659837578806788, + "lr": 0.00026604612647882186, + "weight_decay": 0.00021355962098733124, + "backbone_lr_ratio": 0.29733721720121176, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 18, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.25539435269510624, + "rmse": 0.5053655634242467, + "mae": 0.2715319524328393, + "r2": 0.15199911066123628 + }, + "delivery": { + "n_samples": 58, + "mse": 0.5401788750549795, + "rmse": 0.7349686218165913, + "mae": 0.5700714552839254, + "r2": 0.3134000532957635 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5238095238095238, + "precision": 0.34578392621870885, + "recall": 0.53551912568306, + "f1": 0.34206626442256804 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.75, + "precision": 0.7166666666666667, + "recall": 0.7785714285714285, + "f1": 0.7271511627906978 + }, + "toxic": { + "n_samples": 58, + "accuracy": 0.9655172413793104, + "precision": 0.75, + "recall": 0.9821428571428572, + "f1": 0.8242424242424242 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.3182339907718673, + "js_divergence": 0.07309337216987152 + } + } + }, + { + "fold": 1, + "best_params": { + "dropout": 0.18614946459458093, + "lr": 0.00015757063904422037, + "weight_decay": 0.000955120409040689, + "backbone_lr_ratio": 0.9059364477738808, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 1, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 16, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.09045275471905934, + "rmse": 0.30075364456488196, + "mae": 0.23161025274367558, + "r2": -0.4984988024563053 + }, + "delivery": { + "n_samples": 61, + "mse": 1.0258191430256933, + "rmse": 1.0128273016786689, + "mae": 0.6263890392528694, + "r2": 0.2235288589357498 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5238095238095238, + "precision": 0.27182539682539686, + "recall": 0.25396825396825395, + "f1": 0.24962406015037591 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.5595238095238095, + "precision": 0.506110257723161, + "recall": 0.5057561486132914, + "f1": 0.49192340762639003 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9508196721311475, + "precision": 0.75, + "recall": 0.9741379310344828, + "f1": 0.8200589970501475 + }, + "biodist": { + "n_samples": 61, + "kl_divergence": 0.46752297086632433, + "js_divergence": 0.11978345787287335 + } + } + }, + { + "fold": 2, + "best_params": { + "dropout": 0.27066334445695367, + "lr": 0.00024715599869840884, + "weight_decay": 1.0172836375002765e-05, + "backbone_lr_ratio": 0.5054041560165133, + "moe_n_experts": 4, + "moe_top_k": 1, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 14, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.18305400438734884, + "rmse": 0.42784810901457637, + "mae": 0.33086523839405607, + "r2": -0.961365353255677 + }, + "delivery": { + "n_samples": 60, + "mse": 0.6782912801570451, + "rmse": 0.8235844098555078, + "mae": 0.5519710779888556, + "r2": 0.09707674202024197 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5476190476190477, + "precision": 0.4318260568260568, + "recall": 0.7012288786482334, + "f1": 0.4298268907350504 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6547619047619048, + "precision": 0.5916666666666667, + "recall": 0.6414565826330533, + "f1": 0.6008547008547008 + }, + "toxic": { + "n_samples": 61, + "accuracy": 0.9344262295081968, + "precision": 0.7142857142857143, + "recall": 0.9655172413793103, + "f1": 0.7821428571428571 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.2848294483055189, + "js_divergence": 0.07664507104164577 + } + } + }, + { + "fold": 3, + "best_params": { + "dropout": 0.2778201867797741, + "lr": 0.0004781288818954282, + "weight_decay": 0.0016987970387862138, + "backbone_lr_ratio": 0.9458696393367624, + "moe_n_experts": 4, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 15, + "test_metrics": { + "size": { + "n_samples": 83, + "mse": 0.3129556437133723, + "rmse": 0.5594243860553205, + "mae": 0.3127409808606987, + "r2": 0.039684067774135356 + }, + "delivery": { + "n_samples": 59, + "mse": 0.7857185201725363, + "rmse": 0.8864076489812891, + "mae": 0.6024630838626269, + "r2": 0.23618824646311343 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.7023809523809523, + "precision": 0.38567649281934996, + "recall": 0.5862135176651306, + "f1": 0.40061936936936937 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6428571428571429, + "precision": 0.5957671957671957, + "recall": 0.6363247863247863, + "f1": 0.5951323580633926 + }, + "toxic": { + "n_samples": 60, + "accuracy": 0.9333333333333333, + "precision": 0.7142857142857143, + "recall": 0.9649122807017544, + "f1": 0.7818181818181817 + }, + "biodist": { + "n_samples": 60, + "kl_divergence": 0.37168209467721186, + "js_divergence": 0.09777546387972921 + } + } + }, + { + "fold": 4, + "best_params": { + "dropout": 0.445253277169985, + "lr": 0.0002457483875420317, + "weight_decay": 0.00014672230276933923, + "backbone_lr_ratio": 0.2588275309142304, + "moe_n_experts": 2, + "moe_top_k": 2, + "moe_expert_hidden_mult": 2, + "d_model": 256, + "num_heads": 8, + "n_attn_layers": 4, + "fusion_strategy": "attention", + "head_hidden_dim": 128, + "set_transformer_block": "sab" + }, + "epoch_mean": 25, + "test_metrics": { + "size": { + "n_samples": 84, + "mse": 0.2967457163832042, + "rmse": 0.544743716240219, + "mae": 0.461613933245341, + "r2": -1.1542544388605225 + }, + "delivery": { + "n_samples": 58, + "mse": 0.9213812458325495, + "rmse": 0.9598860587760141, + "mae": 0.6561634901525646, + "r2": 0.10903954553546502 + }, + "pdi": { + "n_samples": 84, + "accuracy": 0.5952380952380952, + "precision": 0.4396781819568367, + "recall": 0.7017409114183307, + "f1": 0.46197533353496656 + }, + "ee": { + "n_samples": 84, + "accuracy": 0.6666666666666666, + "precision": 0.6104279510076611, + "recall": 0.6205128205128205, + "f1": 0.610010886870937 + }, + "toxic": { + "n_samples": 59, + "accuracy": 0.9661016949152542, + "precision": 0.8, + "recall": 0.9821428571428572, + "f1": 0.8659090909090909 + }, + "biodist": { + "n_samples": 58, + "kl_divergence": 0.43138180820562744, + "js_divergence": 0.11081996861265214 + } + } + } + ], + "summary_stats": { + "size": { + "mse_mean": 0.23034984029037256, + "mse_std": 0.09049026510650632, + "rmse_mean": 0.46822986556281965, + "rmse_std": 0.105406988788203, + "mae_mean": 0.32189987007849846, + "mae_std": 0.08014105320611228, + "r2_mean": -0.4728185006647179, + "r2_std": 0.5427422370821634 + }, + "delivery": { + "mse_mean": 0.8054494222584121, + "mse_std": 0.16018870426337528, + "rmse_mean": 0.8929394867547544, + "rmse_std": 0.09004718347937392, + "mae_mean": 0.6145264492845487, + "mae_std": 0.045144810651025415, + "r2_mean": 0.17842704120419808, + "r2_std": 0.06422601059093863 + }, + "pdi": { + "accuracy_mean": 0.5896825396825397, + "accuracy_std": 0.05682229307831347, + "precision_mean": 0.35469393906374463, + "precision_std": 0.055592769200553505, + "recall_mean": 0.522735863838455, + "recall_std": 0.15050332076418682, + "f1_mean": 0.3604048512722805, + "f1_std": 0.06427235489398077 + }, + "ee": { + "accuracy_mean": 0.6547619047619047, + "accuracy_std": 0.05481364015819684, + "precision_mean": 0.6019542483742392, + "precision_std": 0.06379027980318479, + "recall_mean": 0.6352859185632295, + "recall_std": 0.08160957226119422, + "f1_mean": 0.6021181253673275, + "f1_std": 0.06960400235208303 + }, + "toxic": { + "accuracy_mean": 0.9500779484296937, + "accuracy_std": 0.017755203225104002, + "precision_mean": 0.7600104427736006, + "precision_std": 0.07046117058026663, + "recall_mean": 0.9577096476824245, + "recall_std": 0.05611117888622105, + "f1_mean": 0.813010272994035, + "f1_std": 0.03449626596837632 + }, + "biodist": { + "kl_divergence_mean": 0.3520444477507348, + "kl_divergence_std": 0.08432681015154675, + "js_divergence_mean": 0.08975023050906776, + "js_divergence_std": 0.021944673828634763 + } + } +} \ No newline at end of file diff --git a/models/pretrain/baseline/pretrain_history.json b/models/pretrain/baseline/pretrain_history.json new file mode 100644 index 0000000..fb14233 --- /dev/null +++ b/models/pretrain/baseline/pretrain_history.json @@ -0,0 +1,278 @@ +{ + "train": [ + { + "loss": 0.8582913640808747, + "n_samples": 8236 + }, + { + "loss": 0.7334218317296333, + "n_samples": 8236 + }, + { + "loss": 0.6796810012699737, + "n_samples": 8236 + }, + { + "loss": 0.6473208318757108, + "n_samples": 8236 + }, + { + "loss": 0.6055158256992315, + "n_samples": 8236 + }, + { + "loss": 0.5720149335090022, + "n_samples": 8236 + }, + { + "loss": 0.5633457967701209, + "n_samples": 8236 + }, + { + "loss": 0.5486284278734845, + "n_samples": 8236 + }, + { + "loss": 0.5361546486717453, + "n_samples": 8236 + }, + { + "loss": 0.5240235518720209, + "n_samples": 8236 + }, + { + "loss": 0.49913822504546584, + "n_samples": 8236 + }, + { + "loss": 0.4925965267717983, + "n_samples": 8236 + }, + { + "loss": 0.45051227462934373, + "n_samples": 8236 + }, + { + "loss": 0.44367643966438586, + "n_samples": 8236 + }, + { + "loss": 0.4273412961471191, + "n_samples": 8236 + }, + { + "loss": 0.4228938979509677, + "n_samples": 8236 + }, + { + "loss": 0.4112005476062306, + "n_samples": 8236 + }, + { + "loss": 0.40629705631831364, + "n_samples": 8236 + }, + { + "loss": 0.42360058238692744, + "n_samples": 8236 + }, + { + "loss": 0.4034957442253524, + "n_samples": 8236 + }, + { + "loss": 0.38521730207945315, + "n_samples": 8236 + }, + { + "loss": 0.37948636159901483, + "n_samples": 8236 + }, + { + "loss": 0.37755159031366364, + "n_samples": 8236 + }, + { + "loss": 0.3701660043843572, + "n_samples": 8236 + }, + { + "loss": 0.37210758378518444, + "n_samples": 8236 + }, + { + "loss": 0.36690921294799184, + "n_samples": 8236 + }, + { + "loss": 0.36984847650301, + "n_samples": 8236 + }, + { + "loss": 0.3605616689596783, + "n_samples": 8236 + }, + { + "loss": 0.3655680444936488, + "n_samples": 8236 + }, + { + "loss": 0.36526672537029226, + "n_samples": 8236 + }, + { + "loss": 0.3543367654939136, + "n_samples": 8236 + }, + { + "loss": 0.35087492111066176, + "n_samples": 8236 + }, + { + "loss": 0.3467409024254797, + "n_samples": 8236 + }, + { + "loss": 0.34398526131325174, + "n_samples": 8236 + } + ], + "val": [ + { + "loss": 0.8896072963572926, + "n_samples": 1454 + }, + { + "loss": 0.7802096485599691, + "n_samples": 1454 + }, + { + "loss": 0.7978634365323157, + "n_samples": 1454 + }, + { + "loss": 0.8511822325327374, + "n_samples": 1454 + }, + { + "loss": 0.7501020415121128, + "n_samples": 1454 + }, + { + "loss": 0.6728035928950513, + "n_samples": 1454 + }, + { + "loss": 0.6917924798994314, + "n_samples": 1454 + }, + { + "loss": 0.6740748839660393, + "n_samples": 1454 + }, + { + "loss": 0.7173020512562507, + "n_samples": 1454 + }, + { + "loss": 0.7763959644913182, + "n_samples": 1454 + }, + { + "loss": 0.7305065183560818, + "n_samples": 1454 + }, + { + "loss": 0.780519578938963, + "n_samples": 1454 + }, + { + "loss": 0.7018034222037461, + "n_samples": 1454 + }, + { + "loss": 0.6671784554583826, + "n_samples": 1454 + }, + { + "loss": 0.7753380404213928, + "n_samples": 1454 + }, + { + "loss": 0.7145413732594276, + "n_samples": 1454 + }, + { + "loss": 0.7781085617112654, + "n_samples": 1454 + }, + { + "loss": 0.7261470704655864, + "n_samples": 1454 + }, + { + "loss": 0.7288248239717916, + "n_samples": 1454 + }, + { + "loss": 0.7820749839529538, + "n_samples": 1454 + }, + { + "loss": 0.6941640189294146, + "n_samples": 1454 + }, + { + "loss": 0.7284273796265194, + "n_samples": 1454 + }, + { + "loss": 0.7228540447751954, + "n_samples": 1454 + }, + { + "loss": 0.6631342088175936, + "n_samples": 1454 + }, + { + "loss": 0.70179358481377, + "n_samples": 1454 + }, + { + "loss": 0.7577670631415251, + "n_samples": 1454 + }, + { + "loss": 0.7293373680016362, + "n_samples": 1454 + }, + { + "loss": 0.7630523304663793, + "n_samples": 1454 + }, + { + "loss": 1.2040446808938312, + "n_samples": 1454 + }, + { + "loss": 0.8740957265379012, + "n_samples": 1454 + }, + { + "loss": 0.7228784211892045, + "n_samples": 1454 + }, + { + "loss": 0.919559612152829, + "n_samples": 1454 + }, + { + "loss": 0.7133580116655016, + "n_samples": 1454 + }, + { + "loss": 0.7670782431447686, + "n_samples": 1454 + } + ] +} \ No newline at end of file diff --git a/models/pretrain/both/pretrain_history.json b/models/pretrain/both/pretrain_history.json new file mode 100644 index 0000000..3b4613f --- /dev/null +++ b/models/pretrain/both/pretrain_history.json @@ -0,0 +1,190 @@ +{ + "train": [ + { + "loss": 0.8554558599093633, + "n_samples": 8236 + }, + { + "loss": 0.7229876103709194, + "n_samples": 8236 + }, + { + "loss": 0.6616510472985481, + "n_samples": 8236 + }, + { + "loss": 0.6123412358581354, + "n_samples": 8236 + }, + { + "loss": 0.5816178609005973, + "n_samples": 8236 + }, + { + "loss": 0.5567314851162444, + "n_samples": 8236 + }, + { + "loss": 0.5471804023020588, + "n_samples": 8236 + }, + { + "loss": 0.5232358496127747, + "n_samples": 8236 + }, + { + "loss": 0.5077663908136765, + "n_samples": 8236 + }, + { + "loss": 0.49409472768662216, + "n_samples": 8236 + }, + { + "loss": 0.4685479326697447, + "n_samples": 8236 + }, + { + "loss": 0.4661633943312952, + "n_samples": 8236 + }, + { + "loss": 0.45084559565727544, + "n_samples": 8236 + }, + { + "loss": 0.4328205635705117, + "n_samples": 8236 + }, + { + "loss": 0.4192166178188259, + "n_samples": 8236 + }, + { + "loss": 0.42055297585411405, + "n_samples": 8236 + }, + { + "loss": 0.4064124973726944, + "n_samples": 8236 + }, + { + "loss": 0.40532303066320824, + "n_samples": 8236 + }, + { + "loss": 0.3921647861694004, + "n_samples": 8236 + }, + { + "loss": 0.35802152207199955, + "n_samples": 8236 + }, + { + "loss": 0.3374909654787989, + "n_samples": 8236 + }, + { + "loss": 0.33711282439229556, + "n_samples": 8236 + }, + { + "loss": 0.3344602975062574, + "n_samples": 8236 + } + ], + "val": [ + { + "loss": 0.802013921278543, + "n_samples": 1454 + }, + { + "loss": 0.7423172385689317, + "n_samples": 1454 + }, + { + "loss": 0.7013477237877196, + "n_samples": 1454 + }, + { + "loss": 0.7136843136448972, + "n_samples": 1454 + }, + { + "loss": 0.7933826344869159, + "n_samples": 1454 + }, + { + "loss": 0.9788537297648937, + "n_samples": 1454 + }, + { + "loss": 0.6800120943514156, + "n_samples": 1454 + }, + { + "loss": 1.2560746194243924, + "n_samples": 1454 + }, + { + "loss": 0.713272411196891, + "n_samples": 1454 + }, + { + "loss": 0.6641660026867747, + "n_samples": 1454 + }, + { + "loss": 0.8228101764781275, + "n_samples": 1454 + }, + { + "loss": 0.6853714855861796, + "n_samples": 1454 + }, + { + "loss": 0.6394927511516922, + "n_samples": 1454 + }, + { + "loss": 0.6555562639990732, + "n_samples": 1454 + }, + { + "loss": 1.0004203671274357, + "n_samples": 1454 + }, + { + "loss": 0.9006968698114608, + "n_samples": 1454 + }, + { + "loss": 0.6581838270329051, + "n_samples": 1454 + }, + { + "loss": 0.7013987417562135, + "n_samples": 1454 + }, + { + "loss": 0.6933215458094664, + "n_samples": 1454 + }, + { + "loss": 0.6575196106627358, + "n_samples": 1454 + }, + { + "loss": 0.6755308373594219, + "n_samples": 1454 + }, + { + "loss": 0.7767709115676408, + "n_samples": 1454 + }, + { + "loss": 0.6545238016888069, + "n_samples": 1454 + } + ] +} \ No newline at end of file diff --git a/models/pretrain/llm/pretrain_history.json b/models/pretrain/llm/pretrain_history.json new file mode 100644 index 0000000..a0d296f --- /dev/null +++ b/models/pretrain/llm/pretrain_history.json @@ -0,0 +1,166 @@ +{ + "train": [ + { + "loss": 0.8493162816794767, + "n_samples": 8236 + }, + { + "loss": 0.719371718651696, + "n_samples": 8236 + }, + { + "loss": 0.6663210250440879, + "n_samples": 8236 + }, + { + "loss": 0.6313854984544677, + "n_samples": 8236 + }, + { + "loss": 0.6050180681936367, + "n_samples": 8236 + }, + { + "loss": 0.5724720832732999, + "n_samples": 8236 + }, + { + "loss": 0.5582639975939172, + "n_samples": 8236 + }, + { + "loss": 0.5438417370832331, + "n_samples": 8236 + }, + { + "loss": 0.5246556448728035, + "n_samples": 8236 + }, + { + "loss": 0.5136562741283307, + "n_samples": 8236 + }, + { + "loss": 0.49826916715020747, + "n_samples": 8236 + }, + { + "loss": 0.4817734892186521, + "n_samples": 8236 + }, + { + "loss": 0.4816470630629772, + "n_samples": 8236 + }, + { + "loss": 0.4610506330895852, + "n_samples": 8236 + }, + { + "loss": 0.4502680387063881, + "n_samples": 8236 + }, + { + "loss": 0.4463582375259177, + "n_samples": 8236 + }, + { + "loss": 0.40212532723772115, + "n_samples": 8236 + }, + { + "loss": 0.39290236833316716, + "n_samples": 8236 + }, + { + "loss": 0.3818181393041143, + "n_samples": 8236 + }, + { + "loss": 0.38346117517796463, + "n_samples": 8236 + } + ], + "val": [ + { + "loss": 0.7823408520697236, + "n_samples": 1454 + }, + { + "loss": 0.7572638167803685, + "n_samples": 1454 + }, + { + "loss": 1.3016815285571175, + "n_samples": 1454 + }, + { + "loss": 0.7050852468941857, + "n_samples": 1454 + }, + { + "loss": 0.7743825887879446, + "n_samples": 1454 + }, + { + "loss": 2.98265173149896, + "n_samples": 1454 + }, + { + "loss": 0.7438884984184329, + "n_samples": 1454 + }, + { + "loss": 2.6711699774045563, + "n_samples": 1454 + }, + { + "loss": 0.7234079081057846, + "n_samples": 1454 + }, + { + "loss": 0.6671479742005569, + "n_samples": 1454 + }, + { + "loss": 1.0528025386913935, + "n_samples": 1454 + }, + { + "loss": 0.7759058258228486, + "n_samples": 1454 + }, + { + "loss": 1.0733910772790607, + "n_samples": 1454 + }, + { + "loss": 0.7092724900790061, + "n_samples": 1454 + }, + { + "loss": 0.8837297995775897, + "n_samples": 1454 + }, + { + "loss": 0.874810852243615, + "n_samples": 1454 + }, + { + "loss": 0.7093387734775202, + "n_samples": 1454 + }, + { + "loss": 0.7450522419675016, + "n_samples": 1454 + }, + { + "loss": 0.7102828234065186, + "n_samples": 1454 + }, + { + "loss": 0.702132918893717, + "n_samples": 1454 + } + ] +} \ No newline at end of file diff --git a/models/pretrain/moe/pretrain_history.json b/models/pretrain/moe/pretrain_history.json new file mode 100644 index 0000000..4ab061a --- /dev/null +++ b/models/pretrain/moe/pretrain_history.json @@ -0,0 +1,238 @@ +{ + "train": [ + { + "loss": 0.8444833619870162, + "n_samples": 8236 + }, + { + "loss": 0.7221717920159761, + "n_samples": 8236 + }, + { + "loss": 0.6476956897131617, + "n_samples": 8236 + }, + { + "loss": 0.6058183341653907, + "n_samples": 8236 + }, + { + "loss": 0.5818977655282931, + "n_samples": 8236 + }, + { + "loss": 0.5606534384650591, + "n_samples": 8236 + }, + { + "loss": 0.5438616421108051, + "n_samples": 8236 + }, + { + "loss": 0.5296446231454828, + "n_samples": 8236 + }, + { + "loss": 0.5034642058301169, + "n_samples": 8236 + }, + { + "loss": 0.4926449143521817, + "n_samples": 8236 + }, + { + "loss": 0.4809608229043821, + "n_samples": 8236 + }, + { + "loss": 0.46792712891605537, + "n_samples": 8236 + }, + { + "loss": 0.46016837027595137, + "n_samples": 8236 + }, + { + "loss": 0.4539264049589084, + "n_samples": 8236 + }, + { + "loss": 0.4343785792082592, + "n_samples": 8236 + }, + { + "loss": 0.4022773470098154, + "n_samples": 8236 + }, + { + "loss": 0.391768712971962, + "n_samples": 8236 + }, + { + "loss": 0.3946328157646787, + "n_samples": 8236 + }, + { + "loss": 0.38186461452780096, + "n_samples": 8236 + }, + { + "loss": 0.37831240947412137, + "n_samples": 8236 + }, + { + "loss": 0.37218554509734, + "n_samples": 8236 + }, + { + "loss": 0.37003324522793785, + "n_samples": 8236 + }, + { + "loss": 0.37280535147194727, + "n_samples": 8236 + }, + { + "loss": 0.366068535345512, + "n_samples": 8236 + }, + { + "loss": 0.3588095046959785, + "n_samples": 8236 + }, + { + "loss": 0.3447240012661238, + "n_samples": 8236 + }, + { + "loss": 0.34654789203402486, + "n_samples": 8236 + }, + { + "loss": 0.3341197949726064, + "n_samples": 8236 + }, + { + "loss": 0.3334885352210202, + "n_samples": 8236 + } + ], + "val": [ + { + "loss": 0.8233604396717749, + "n_samples": 1454 + }, + { + "loss": 0.7986104544943924, + "n_samples": 1454 + }, + { + "loss": 0.6878670279392678, + "n_samples": 1454 + }, + { + "loss": 1.4778851701927973, + "n_samples": 1454 + }, + { + "loss": 0.7188797573439849, + "n_samples": 1454 + }, + { + "loss": 0.708491360878846, + "n_samples": 1454 + }, + { + "loss": 0.7465513021450751, + "n_samples": 1454 + }, + { + "loss": 0.7036250697697373, + "n_samples": 1454 + }, + { + "loss": 0.6551542343594841, + "n_samples": 1454 + }, + { + "loss": 0.6759496378767441, + "n_samples": 1454 + }, + { + "loss": 1.0201101731893285, + "n_samples": 1454 + }, + { + "loss": 0.6907692915635719, + "n_samples": 1454 + }, + { + "loss": 0.7211924836428982, + "n_samples": 1454 + }, + { + "loss": 0.7141936532896848, + "n_samples": 1454 + }, + { + "loss": 0.773055208434429, + "n_samples": 1454 + }, + { + "loss": 1.3679038423947487, + "n_samples": 1454 + }, + { + "loss": 0.6390884835913552, + "n_samples": 1454 + }, + { + "loss": 0.6397012937019747, + "n_samples": 1454 + }, + { + "loss": 0.6198025200685084, + "n_samples": 1454 + }, + { + "loss": 0.6775723626065943, + "n_samples": 1454 + }, + { + "loss": 1.147026978791826, + "n_samples": 1454 + }, + { + "loss": 0.9496700583330703, + "n_samples": 1454 + }, + { + "loss": 0.7171065121930108, + "n_samples": 1454 + }, + { + "loss": 0.6501950878224642, + "n_samples": 1454 + }, + { + "loss": 0.6247917262035354, + "n_samples": 1454 + }, + { + "loss": 0.6408829362717094, + "n_samples": 1454 + }, + { + "loss": 0.6341315902246898, + "n_samples": 1454 + }, + { + "loss": 0.6743946996154943, + "n_samples": 1454 + }, + { + "loss": 0.6599862504202201, + "n_samples": 1454 + } + ] +} \ No newline at end of file diff --git a/pixi.lock b/pixi.lock index 07bfb98..bfaccff 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,3319 +1,3319 @@ -version: 6 -environments: - default: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py38h578d9bd_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.8.20-h4a871b0_2_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.12-h4196e79_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.1-hbcc6ac9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.1-hbcc6ac9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - pypi: https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/52/4a86a4fa1cc2aae79137cc9510b7080c3e5aede2310d14fae5486feec7f7/altair-5.4.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/76/b21bfd2c35cab2e9a4b68b1977f7488c246c8cffa31e3361ee7610e8b5af/captum-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bf/fa/cf5bb2409a385f78750e78c8d2e24780964976acdaaed65dbd6083ae5b40/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/a0/ad/72361203906e2dbe9baa776c64e9246d555b516808dd0cce385f07f4cf71/chemprop-1.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8e/71/7f20855592cc929bc206810432b991ec4c702dc26b0567b132e52c85536f/contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/15/1a/c6eae628480aa1fc5f6f85437c7d8ec0d1172597acd1c61182202a902c0f/cramjam-2.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7b/3c/67bfc03db3f6527a54a0f9b696809bca55eb6de27928829218ab7e6c40e7/descriptastorus-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3e/57/aa70121b5008f44031be645a61a7c4abc24e0e888ad3fc8fda916f4d188e/fastapi-0.124.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/31/673a677c137d8b2429813f56be77986f44bcb43f5c113336a4c8347e0eb0/fastparquet-2024.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/6a/00d144ac1626fbb44c4ff36519712e258128985a5d0ae43344778ae5cbb9/Flask-2.1.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a5/0e/b6314a09a4d561aaa7e09de43fa700917be91e701f07df6178865962666c/fonttools-4.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d8/88/0ce16c0afb2d71d85562a7bcd9b092fec80a7767ab5b5f7e1bbbca8200f8/greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/cd/5b3334d39276067f54618ce0d0b48ed69d91352fbf137468c7095170d0e5/hyperopt-0.2.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/6a/4604f9ae2fa62ef47b9de2fa5ad599589d28c9fd1d335f32759813dfa91e/importlib_resources-6.4.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/36/ae40d7a3171e06f55ac77fe5536079e7be1d8be2a8210e08975c7f9b4d54/kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/30/33/cc27211d2ffeee4fd7402dca137b6e8a83f6dcae3d4be8d0ad5068555561/matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/3f/8d450588206b437dd239a6d44230c63095e71135bd95d5a74347d07adbd5/narwhals-1.42.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a8/05/9d4f9b78ead6b2661d6e8ea772e111fc4a9fbd866ad0c81906c11206b55e/networkx-3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/5d/5738903efe0ecb73e51eb44feafba32bdba2081263d40c5043568ff60faf/numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/eb/d5/c68b1d2cdfcc59e72e8a5949a37ddb22ae6cade80cd4a57a84d4c8b55472/nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/86/94/eb540db023ce1d162e7bea9f8f5aa781d57c65aed513c33ee9a5123ead4d/nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/44/31/4890b1c9abc496303412947fc7dcea3d14861720642b49e8ceed89636705/nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/da/d3/8057f0587683ed2fcd4dbfbdfdfa807b9160b809976099d36b8f60d08f03/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7f/12/cba81286cbaf0f0c3f0473846cfd992cb240bdcea816bf2ef7de8ed0f744/optuna-4.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/7f/5b047effafbdd34e52c9e2d7e44f729a0655efafb22198c45cf692cdc157/pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/5d/e6/71ed4d95676098159b533c4a4c424cf453fec9614edaff1a0633fe228eef/pandas_flavor-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fb/ad/435fe29865f98a8fbdc64add8875a6e4f8c97749a93577a8919ec6f32c64/pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/bd/db/ea0203e495be491c85af87b66e37acfd3bf756fd985f87e46fc5e3bf022c/py4j-0.10.9.9-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/c1/4c6bcdf7a820034aa91a8b4d25fef38809be79b42ca7aaa16d4680b0bbac/pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f7/a3/5f19bc495793546825ab160e530330c2afcee2281c02b5ffafd0b32ac05e/pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/25/a2/b725b61ac76a75583ae7104b3209f75ea44b13cfd026aa535ece22b7f22e/PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3d/84/63b2e66f5c7cb97ce994769afbbef85a1ac364fedbcb7d4a3c0f15d318a5/rdkit-2024.3.5-cp38-cp38-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c4/ce/af016c81fda833bf125b20d1677d816f230cad2ab189f46bcbfea3c7a375/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3f/48/6fdd99f5717045f9984616b5c2ec683d6286d30c0ac234563062132b83ab/scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/69/f0/fb07a9548e48b687b8bf2fa81d71aba9cfc548d365046ca1c791e24db99d/scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/c7/b5c8015d823bfda1a346adb2c634a2101d50bb75d421eb6dcb31acd25ebc/sphinx_rtd_theme-3.1.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/7b/b9e0eb7f9a15f2e82856603c728edf14c54a07c6738ab228e4f2de049338/sqlalchemy-2.0.46-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b6/c5/7ae467eeddb57260c8ce17a3a09f9f5edba35820fc022d7c55b7decd5d3a/starlette-0.44.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/14/857d0734989f3d26f2f965b2e3f67568ea7a6e8a60cb9c1ed7f774b6d606/streamlit-1.40.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/44/71/f3e7c9b2ab67e28c572ab4e9d5fa3499e0d252650f96d8a3a03e26677f53/tensorboardX-2.6.2.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/71/45aac46b75742e08d2d6f9fc2b612223b5e36115b8b2ed673b23c21b5387/torch-2.4.1-cp38-cp38-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4d/b4/c37e2776a1390bab7e78a6d52bd525441cb3cad7260a6a00b11b0b702e7c/triton-3.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/ea/07/0055bb513de2b7cf23b2bfc7eeeb6a6ae6ff7b287e2a62ab80cf403d61e9/typed_argument_parser-1.10.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/79/2e2620337ef1e4ef7a058b351603b765f59ac28e6e3ac7c5e7cdee9ea1ab/uvicorn-0.33.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/01/d2/c8931ff840a7e5bd5dcb93f2bb2a1fd18faf8312e9f7f53ff1cf76ecc8ed/watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/fd/21/0a674dfe66e9df9072c46269c882e9f901d36d987d8ea50ead033a9c1e01/werkzeug-2.3.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b4/a7/897f484225bd8e179a4f39f8e9a4ca26c14e9f7055b495384b1d56e1382d/xarray-2023.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - - pypi: . - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.8.1-h39f12f2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/loguru-0.7.2-py38h10201cd_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.8.20-h7d35d02_2_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.14.12-hb0cad00_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.8.1-h9a6d368_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.8.1-h9a6d368_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.8.1-h39f12f2_2.conda - - pypi: https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/52/4a86a4fa1cc2aae79137cc9510b7080c3e5aede2310d14fae5486feec7f7/altair-5.4.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/76/b21bfd2c35cab2e9a4b68b1977f7488c246c8cffa31e3361ee7610e8b5af/captum-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/4e/3926a1c11f0433791985727965263f788af00db3482d89a7545ca5ecc921/charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/a0/ad/72361203906e2dbe9baa776c64e9246d555b516808dd0cce385f07f4cf71/chemprop-1.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a6/82/29f5ff4ae074c3230e266bc9efef449ebde43721a727b989dd8ef8f97d73/contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/65/64/e34ee535519fd14cde3a7f3f8cd3b4ef54483b9df655e4180437eb884aab/cramjam-2.11.0-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7b/3c/67bfc03db3f6527a54a0f9b696809bca55eb6de27928829218ab7e6c40e7/descriptastorus-2.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3e/57/aa70121b5008f44031be645a61a7c4abc24e0e888ad3fc8fda916f4d188e/fastapi-0.124.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/8e/ce64bc647728ee26bfffa9987fb375e7c99bba54b632404bc0d61b6e9fc2/fastparquet-2024.2.0-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/6a/00d144ac1626fbb44c4ff36519712e258128985a5d0ae43344778ae5cbb9/Flask-2.1.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/3f/c16dbbec7221783f37dcc2022d5a55f0d704ffc9feef67930f6eb517e8ce/fonttools-4.57.0-cp38-cp38-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/cd/5b3334d39276067f54618ce0d0b48ed69d91352fbf137468c7095170d0e5/hyperopt-0.2.7-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/6a/4604f9ae2fa62ef47b9de2fa5ad599589d28c9fd1d335f32759813dfa91e/importlib_resources-6.4.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/14/a7/bb8ab10e12cc8764f4da0245d72dee4731cc720bdec0f085d5e9c6005b98/kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/aa/59/4d13e5b6298b1ca5525eea8c68d3806ae93ab6d0bb17ca9846aa3156b92b/matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/79/3f/8d450588206b437dd239a6d44230c63095e71135bd95d5a74347d07adbd5/narwhals-1.42.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a8/05/9d4f9b78ead6b2661d6e8ea772e111fc4a9fbd866ad0c81906c11206b55e/networkx-3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a7/ae/f53b7b265fdc701e663fbb322a8e9d4b14d9cb7b2385f45ddfabfc4327e4/numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7f/12/cba81286cbaf0f0c3f0473846cfd992cb240bdcea816bf2ef7de8ed0f744/optuna-4.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/c3/f8e87361f7fdf42012def602bfa2a593423c729f5cb7c97aed7f51be66ac/pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/5d/e6/71ed4d95676098159b533c4a4c424cf453fec9614edaff1a0633fe228eef/pandas_flavor-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/43/105823d233c5e5d31cea13428f4474ded9d961652307800979a59d6a4276/pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/bd/db/ea0203e495be491c85af87b66e37acfd3bf756fd985f87e46fc5e3bf022c/py4j-0.10.9.9-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/d9/51e35550f2f18b8815a2ab25948f735434db32000c0e91eba3a32634782a/pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/20/26c549249769ed84877f862f7bb93f89a6ee08b4bee1ed8781616b7fbb5e/pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz - - pypi: https://files.pythonhosted.org/packages/bf/cb/c709b60f4815e18c00e1e8639204bdba04cb158e6278791d82f94f51a988/rdkit-2024.3.5-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/63/47d34dc4ddb3da73e78e10c9009dcf8edc42d355a221351c05c822c2a50b/rpds_py-0.20.1-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/a4/62/92e9cec3deca8b45abf62dd8f6469d688b3f28b9c170809fcc46f110b523/scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/93/4a/50c436de1353cce8b66b26e49a687f10b91fe7465bf34e4565d810153003/scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/87/c7/b5c8015d823bfda1a346adb2c634a2101d50bb75d421eb6dcb31acd25ebc/sphinx_rtd_theme-3.1.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/07/d4/76b9618d7eb1e6a3c26734e1186f8ad7869e4426b1ea7dc425bc4c832e67/sqlalchemy-2.0.46-cp38-cp38-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b6/c5/7ae467eeddb57260c8ce17a3a09f9f5edba35820fc022d7c55b7decd5d3a/starlette-0.44.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/14/857d0734989f3d26f2f965b2e3f67568ea7a6e8a60cb9c1ed7f774b6d606/streamlit-1.40.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/44/71/f3e7c9b2ab67e28c572ab4e9d5fa3499e0d252650f96d8a3a03e26677f53/tensorboardX-2.6.2.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c4/88/4d9f66de5fe732462a2713c9931cab614d3fd6a9b5d9ee1f04768ad64daa/torch-2.4.1-cp38-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/ea/07/0055bb513de2b7cf23b2bfc7eeeb6a6ae6ff7b287e2a62ab80cf403d61e9/typed_argument_parser-1.10.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/98/79/2e2620337ef1e4ef7a058b351603b765f59ac28e6e3ac7c5e7cdee9ea1ab/uvicorn-0.33.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fd/21/0a674dfe66e9df9072c46269c882e9f901d36d987d8ea50ead033a9c1e01/werkzeug-2.3.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b4/a7/897f484225bd8e179a4f39f8e9a4ca26c14e9f7055b495384b1d56e1382d/xarray-2023.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - - pypi: . -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - license: None - purls: [] - size: 2562 - timestamp: 1578324546067 -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 23621 - timestamp: 1650670423406 -- pypi: https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl - name: alabaster - version: 0.7.13 - sha256: 1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl - name: alembic - version: 1.14.1 - sha256: 1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5 - requires_dist: - - sqlalchemy>=1.3.0 - - mako - - importlib-metadata ; python_full_version < '3.9' - - importlib-resources ; python_full_version < '3.9' - - typing-extensions>=4 - - backports-zoneinfo ; python_full_version < '3.9' and extra == 'tz' - - tzdata ; extra == 'tz' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/9b/52/4a86a4fa1cc2aae79137cc9510b7080c3e5aede2310d14fae5486feec7f7/altair-5.4.1-py3-none-any.whl - name: altair - version: 5.4.1 - sha256: 0fb130b8297a569d08991fb6fe763582e7569f8a04643bbd9212436e3be04aef - requires_dist: - - jinja2 - - jsonschema>=3.0 - - narwhals>=1.5.2 - - packaging - - typing-extensions>=4.10.0 ; python_full_version < '3.13' - - altair-tiles>=0.3.0 ; extra == 'all' - - anywidget>=0.9.0 ; extra == 'all' - - numpy ; extra == 'all' - - pandas>=0.25.3 ; extra == 'all' - - pyarrow>=11 ; extra == 'all' - - vega-datasets>=0.9.0 ; extra == 'all' - - vegafusion[embed]>=1.6.6 ; extra == 'all' - - vl-convert-python>=1.6.0 ; extra == 'all' - - geopandas ; extra == 'dev' - - hatch ; extra == 'dev' - - ibis-framework[polars] ; extra == 'dev' - - ipython[kernel] ; extra == 'dev' - - mistune ; extra == 'dev' - - mypy ; extra == 'dev' - - pandas-stubs ; extra == 'dev' - - pandas>=0.25.3 ; extra == 'dev' - - polars>=0.20.3 ; extra == 'dev' - - pytest ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - pytest-xdist[psutil]~=3.5 ; extra == 'dev' - - ruff>=0.6.0 ; extra == 'dev' - - types-jsonschema ; extra == 'dev' - - types-setuptools ; extra == 'dev' - - docutils ; extra == 'doc' - - jinja2 ; extra == 'doc' - - myst-parser ; extra == 'doc' - - numpydoc ; extra == 'doc' - - pillow>=9,<10 ; extra == 'doc' - - pydata-sphinx-theme>=0.14.1 ; extra == 'doc' - - scipy ; extra == 'doc' - - sphinx ; extra == 'doc' - - sphinx-copybutton ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinxext-altair ; extra == 'doc' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl - name: annotated-doc - version: 0.0.4 - sha256: 571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - name: annotated-types - version: 0.7.0 - sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 - requires_dist: - - typing-extensions>=4.0.0 ; python_full_version < '3.9' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl - name: anyio - version: 4.5.2 - sha256: c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f - requires_dist: - - idna>=2.8 - - sniffio>=1.1 - - exceptiongroup>=1.0.2 ; python_full_version < '3.11' - - typing-extensions>=4.1 ; python_full_version < '3.11' - - packaging ; extra == 'doc' - - sphinx~=7.4 ; extra == 'doc' - - sphinx-rtd-theme ; extra == 'doc' - - sphinx-autodoc-typehints>=1.2.0 ; extra == 'doc' - - anyio[trio] ; extra == 'test' - - coverage[toml]>=7 ; extra == 'test' - - exceptiongroup>=1.2.0 ; extra == 'test' - - hypothesis>=4.0 ; extra == 'test' - - psutil>=5.9 ; extra == 'test' - - pytest>=7.0 ; extra == 'test' - - pytest-mock>=3.6.1 ; extra == 'test' - - trustme ; extra == 'test' - - uvloop>=0.21.0b1 ; platform_python_implementation == 'CPython' and sys_platform != 'win32' and extra == 'test' - - truststore>=0.9.1 ; python_full_version >= '3.10' and extra == 'test' - - trio>=0.26.1 ; extra == 'trio' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl - name: attrs - version: 25.3.0 - sha256: 427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3 - requires_dist: - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'benchmark' - - hypothesis ; extra == 'benchmark' - - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'benchmark' - - pympler ; extra == 'benchmark' - - pytest-codspeed ; extra == 'benchmark' - - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'benchmark' - - pytest-xdist[psutil] ; extra == 'benchmark' - - pytest>=4.3.0 ; extra == 'benchmark' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'cov' - - coverage[toml]>=5.3 ; extra == 'cov' - - hypothesis ; extra == 'cov' - - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'cov' - - pympler ; extra == 'cov' - - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'cov' - - pytest-xdist[psutil] ; extra == 'cov' - - pytest>=4.3.0 ; extra == 'cov' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'dev' - - hypothesis ; extra == 'dev' - - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'dev' - - pre-commit-uv ; extra == 'dev' - - pympler ; extra == 'dev' - - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'dev' - - pytest-xdist[psutil] ; extra == 'dev' - - pytest>=4.3.0 ; extra == 'dev' - - cogapp ; extra == 'docs' - - furo ; extra == 'docs' - - myst-parser ; extra == 'docs' - - sphinx ; extra == 'docs' - - sphinx-notfound-page ; extra == 'docs' - - sphinxcontrib-towncrier ; extra == 'docs' - - towncrier ; extra == 'docs' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests' - - hypothesis ; extra == 'tests' - - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'tests' - - pympler ; extra == 'tests' - - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'tests' - - pytest-xdist[psutil] ; extra == 'tests' - - pytest>=4.3.0 ; extra == 'tests' - - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' - - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl - name: babel - version: 2.17.0 - sha256: 4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 - requires_dist: - - pytz>=2015.7 ; python_full_version < '3.9' - - tzdata ; sys_platform == 'win32' and extra == 'dev' - - backports-zoneinfo ; python_full_version < '3.9' and extra == 'dev' - - freezegun~=1.0 ; extra == 'dev' - - jinja2>=3.0 ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - pytest>=6.0 ; extra == 'dev' - - pytz ; extra == 'dev' - - setuptools ; extra == 'dev' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl - name: blinker - version: 1.8.2 - sha256: 1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 - md5: 51a19bba1b8ebfb60df25cde030b7ebc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 260341 - timestamp: 1757437258798 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 - md5: 58fd217444c2a5701a44244faf518206 - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 125061 - timestamp: 1757437486465 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 - md5: bddacf101bb4dd0e51811cb69c7790e2 - depends: - - __unix - license: ISC - purls: [] - size: 146519 - timestamp: 1767500828366 -- pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl - name: cachetools - version: 5.5.2 - sha256: d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/e1/76/b21bfd2c35cab2e9a4b68b1977f7488c246c8cffa31e3361ee7610e8b5af/captum-0.7.0-py3-none-any.whl - name: captum - version: 0.7.0 - sha256: 2cbec9aa4b6ec325c2fdf369c1fdabb011017122e2314e2af009496d53a0757c - requires_dist: - - matplotlib - - numpy - - torch>=1.6 - - tqdm - - flask ; extra == 'dev' - - ipython ; extra == 'dev' - - ipywidgets ; extra == 'dev' - - jupyter ; extra == 'dev' - - flask-compress ; extra == 'dev' - - pytest ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - parameterized ; extra == 'dev' - - black==22.3.0 ; extra == 'dev' - - flake8 ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-autodoc-typehints ; extra == 'dev' - - sphinxcontrib-katex ; extra == 'dev' - - mypy>=0.760 ; extra == 'dev' - - usort==1.0.2 ; extra == 'dev' - - ufmt ; extra == 'dev' - - scikit-learn ; extra == 'dev' - - annoy ; extra == 'dev' - - flask ; extra == 'insights' - - ipython ; extra == 'insights' - - ipywidgets ; extra == 'insights' - - jupyter ; extra == 'insights' - - flask-compress ; extra == 'insights' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - parameterized ; extra == 'test' - - flask ; extra == 'tutorials' - - ipython ; extra == 'tutorials' - - ipywidgets ; extra == 'tutorials' - - jupyter ; extra == 'tutorials' - - flask-compress ; extra == 'tutorials' - - torchtext ; extra == 'tutorials' - - torchvision ; extra == 'tutorials' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl - name: certifi - version: 2026.1.4 - sha256: 9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/0a/4e/3926a1c11f0433791985727965263f788af00db3482d89a7545ca5ecc921/charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl - name: charset-normalizer - version: 3.4.4 - sha256: ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/bf/fa/cf5bb2409a385f78750e78c8d2e24780964976acdaaed65dbd6083ae5b40/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: charset-normalizer - version: 3.4.4 - sha256: f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/a0/ad/72361203906e2dbe9baa776c64e9246d555b516808dd0cce385f07f4cf71/chemprop-1.7.0-py3-none-any.whl - name: chemprop - version: 1.7.0 - sha256: 1f6d691c3d0a552d80bf7639960bbae3d90729583ee23c25f8e7250f6a90c259 - requires_dist: - - flask>=1.1.2,<=2.1.3 - - werkzeug<3 - - hyperopt>=0.2.3 - - matplotlib>=3.1.3 - - numpy>=1.18.1 - - pandas>=1.0.3 - - pandas-flavor>=0.2.0 - - scikit-learn>=0.22.2.post1 - - sphinx>=3.1.2 - - sphinx-rtd-theme>=2.0.0 - - tensorboardx>=2.0 - - torch>=1.4.0 - - tqdm>=4.45.0 - - typed-argument-parser>=1.6.1 - - rdkit>=2020.3.1.0 - - scipy<1.11 ; python_full_version == '3.7.*' - - descriptastorus<2.6.1 ; python_full_version == '3.7.*' - - scipy>=1.9 ; python_full_version == '3.8.*' - - descriptastorus>=2.6.1 ; python_full_version == '3.8.*' - - pytest>=6.2.2 ; extra == 'test' - - parameterized>=0.8.1 ; extra == 'test' - requires_python: '>=3.7,<3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec - md5: f3ad426304898027fc619827ff428eca - depends: - - __unix - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/click?source=hash-mapping - size: 84437 - timestamp: 1692311973840 -- pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - name: cloudpickle - version: 3.1.2 - sha256: 9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 - md5: 3faab06a954c2a04039983f2c4a50d99 - depends: - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/colorama?source=hash-mapping - size: 25170 - timestamp: 1666700778190 -- pypi: https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl - name: colorlog - version: 6.10.1 - sha256: 2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c - requires_dist: - - colorama ; sys_platform == 'win32' - - black ; extra == 'development' - - flake8 ; extra == 'development' - - mypy ; extra == 'development' - - pytest ; extra == 'development' - - types-colorama ; extra == 'development' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/8e/71/7f20855592cc929bc206810432b991ec4c702dc26b0567b132e52c85536f/contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: contourpy - version: 1.1.1 - sha256: 41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8 - requires_dist: - - numpy>=1.16,<2.0 ; python_full_version < '3.12' - - numpy>=1.26.0rc1,<2.0 ; python_full_version >= '3.12' - - furo ; extra == 'docs' - - sphinx>=7.2 ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - bokeh ; extra == 'bokeh' - - selenium ; extra == 'bokeh' - - contourpy[bokeh,docs] ; extra == 'mypy' - - docutils-stubs ; extra == 'mypy' - - mypy==1.4.1 ; extra == 'mypy' - - types-pillow ; extra == 'mypy' - - contourpy[test-no-images] ; extra == 'test' - - matplotlib ; extra == 'test' - - pillow ; extra == 'test' - - pytest ; extra == 'test-no-images' - - pytest-cov ; extra == 'test-no-images' - - wurlitzer ; extra == 'test-no-images' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a6/82/29f5ff4ae074c3230e266bc9efef449ebde43721a727b989dd8ef8f97d73/contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl - name: contourpy - version: 1.1.1 - sha256: 8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9 - requires_dist: - - numpy>=1.16,<2.0 ; python_full_version < '3.12' - - numpy>=1.26.0rc1,<2.0 ; python_full_version >= '3.12' - - furo ; extra == 'docs' - - sphinx>=7.2 ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - bokeh ; extra == 'bokeh' - - selenium ; extra == 'bokeh' - - contourpy[bokeh,docs] ; extra == 'mypy' - - docutils-stubs ; extra == 'mypy' - - mypy==1.4.1 ; extra == 'mypy' - - types-pillow ; extra == 'mypy' - - contourpy[test-no-images] ; extra == 'test' - - matplotlib ; extra == 'test' - - pillow ; extra == 'test' - - pytest ; extra == 'test-no-images' - - pytest-cov ; extra == 'test-no-images' - - wurlitzer ; extra == 'test-no-images' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/15/1a/c6eae628480aa1fc5f6f85437c7d8ec0d1172597acd1c61182202a902c0f/cramjam-2.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: cramjam - version: 2.11.0 - sha256: f6a32313a5fdbc4fc4fd681a1895d55ee4bf81275e88638b1643b54ecf850cbe - requires_dist: - - black==22.3.0 ; extra == 'dev' - - numpy ; extra == 'dev' - - pytest>=5.30 ; extra == 'dev' - - pytest-xdist ; extra == 'dev' - - pytest-benchmark ; extra == 'dev' - - hypothesis==6.60.0 ; extra == 'dev' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/65/64/e34ee535519fd14cde3a7f3f8cd3b4ef54483b9df655e4180437eb884aab/cramjam-2.11.0-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - name: cramjam - version: 2.11.0 - sha256: bf81b2e517baadf41eb85c4762ae596dd1dd2c852988ce86a2df6aa7e31d9228 - requires_dist: - - black==22.3.0 ; extra == 'dev' - - numpy ; extra == 'dev' - - pytest>=5.30 ; extra == 'dev' - - pytest-xdist ; extra == 'dev' - - pytest-benchmark ; extra == 'dev' - - hypothesis==6.60.0 ; extra == 'dev' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - name: cycler - version: 0.12.1 - sha256: 85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 - requires_dist: - - ipython ; extra == 'docs' - - matplotlib ; extra == 'docs' - - numpydoc ; extra == 'docs' - - sphinx ; extra == 'docs' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-xdist ; extra == 'tests' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/7b/3c/67bfc03db3f6527a54a0f9b696809bca55eb6de27928829218ab7e6c40e7/descriptastorus-2.8.0-py3-none-any.whl - name: descriptastorus - version: 2.8.0 - sha256: cc0c8201d6d9d8534dc8a45ce629aeaf4cf1e62ba848b9b1e392b2600ca834dc - requires_dist: - - pandas-flavor - - rdkit - - scipy - - numpy -- pypi: https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl - name: docstring-parser - version: 0.17.0 - sha256: cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708 - requires_dist: - - pre-commit>=2.16.0 ; python_full_version >= '3.9' and extra == 'dev' - - pydoctor>=25.4.0 ; extra == 'dev' - - pytest ; extra == 'dev' - - pydoctor>=25.4.0 ; extra == 'docs' - - pytest ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl - name: docutils - version: 0.20.1 - sha256: 96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl - name: et-xmlfile - version: 2.0.0 - sha256: 7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl - name: exceptiongroup - version: 1.3.1 - sha256: a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 - requires_dist: - - typing-extensions>=4.6.0 ; python_full_version < '3.13' - - pytest>=6 ; extra == 'test' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/3e/57/aa70121b5008f44031be645a61a7c4abc24e0e888ad3fc8fda916f4d188e/fastapi-0.124.4-py3-none-any.whl - name: fastapi - version: 0.124.4 - sha256: 6d1e703698443ccb89e50abe4893f3c84d9d6689c0cf1ca4fad6d3c15cf69f15 - requires_dist: - - starlette>=0.40.0,<0.51.0 - - pydantic>=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 - - typing-extensions>=4.8.0 - - annotated-doc>=0.0.2 - - fastapi-cli[standard]>=0.0.8 ; extra == 'standard' - - httpx>=0.23.0,<1.0.0 ; extra == 'standard' - - jinja2>=3.1.5 ; extra == 'standard' - - python-multipart>=0.0.18 ; extra == 'standard' - - email-validator>=2.0.0 ; extra == 'standard' - - uvicorn[standard]>=0.12.0 ; extra == 'standard' - - fastapi-cli[standard-no-fastapi-cloud-cli]>=0.0.8 ; extra == 'standard-no-fastapi-cloud-cli' - - httpx>=0.23.0,<1.0.0 ; extra == 'standard-no-fastapi-cloud-cli' - - jinja2>=3.1.5 ; extra == 'standard-no-fastapi-cloud-cli' - - python-multipart>=0.0.18 ; extra == 'standard-no-fastapi-cloud-cli' - - email-validator>=2.0.0 ; extra == 'standard-no-fastapi-cloud-cli' - - uvicorn[standard]>=0.12.0 ; extra == 'standard-no-fastapi-cloud-cli' - - fastapi-cli[standard]>=0.0.8 ; extra == 'all' - - httpx>=0.23.0,<1.0.0 ; extra == 'all' - - jinja2>=3.1.5 ; extra == 'all' - - python-multipart>=0.0.18 ; extra == 'all' - - itsdangerous>=1.1.0 ; extra == 'all' - - pyyaml>=5.3.1 ; extra == 'all' - - ujson>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0 ; extra == 'all' - - orjson>=3.2.1 ; extra == 'all' - - email-validator>=2.0.0 ; extra == 'all' - - uvicorn[standard]>=0.12.0 ; extra == 'all' - - pydantic-settings>=2.0.0 ; extra == 'all' - - pydantic-extra-types>=2.0.0 ; extra == 'all' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/27/8e/ce64bc647728ee26bfffa9987fb375e7c99bba54b632404bc0d61b6e9fc2/fastparquet-2024.2.0-cp38-cp38-macosx_11_0_arm64.whl - name: fastparquet - version: 2024.2.0 - sha256: ee36f1ea8f08cb9b8710161eee4e752e74f34ef3e7aebc58db4e5468d29ff34c - requires_dist: - - pandas>=1.5.0 - - numpy>=1.20.3 - - cramjam>=2.3 - - fsspec - - packaging - - python-lzo ; extra == 'lzo' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a7/31/673a677c137d8b2429813f56be77986f44bcb43f5c113336a4c8347e0eb0/fastparquet-2024.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: fastparquet - version: 2024.2.0 - sha256: 6509837887e35bdcb08ba252eeb930b1056e129b6d31c14901443339567ee95a - requires_dist: - - pandas>=1.5.0 - - numpy>=1.20.3 - - cramjam>=2.3 - - fsspec - - packaging - - python-lzo ; extra == 'lzo' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl - name: filelock - version: 3.16.1 - sha256: 2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0 - requires_dist: - - furo>=2024.8.6 ; extra == 'docs' - - sphinx-autodoc-typehints>=2.4.1 ; extra == 'docs' - - sphinx>=8.0.2 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'testing' - - coverage>=7.6.1 ; extra == 'testing' - - diff-cover>=9.2 ; extra == 'testing' - - pytest-asyncio>=0.24 ; extra == 'testing' - - pytest-cov>=5 ; extra == 'testing' - - pytest-mock>=3.14 ; extra == 'testing' - - pytest-timeout>=2.3.1 ; extra == 'testing' - - pytest>=8.3.3 ; extra == 'testing' - - virtualenv>=20.26.4 ; extra == 'testing' - - typing-extensions>=4.12.2 ; python_full_version < '3.11' and extra == 'typing' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/af/6a/00d144ac1626fbb44c4ff36519712e258128985a5d0ae43344778ae5cbb9/Flask-2.1.3-py3-none-any.whl - name: flask - version: 2.1.3 - sha256: 9013281a7402ad527f8fd56375164f3aa021ecfaff89bfe3825346c24f87e04c - requires_dist: - - werkzeug>=2.0 - - jinja2>=3.0 - - itsdangerous>=2.0 - - click>=8.0 - - importlib-metadata>=3.6.0 ; python_full_version < '3.10' - - asgiref>=3.2 ; extra == 'async' - - python-dotenv ; extra == 'dotenv' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/8a/3f/c16dbbec7221783f37dcc2022d5a55f0d704ffc9feef67930f6eb517e8ce/fonttools-4.57.0-cp38-cp38-macosx_10_9_universal2.whl - name: fonttools - version: 4.57.0 - sha256: 9d57b4e23ebbe985125d3f0cabbf286efa191ab60bbadb9326091050d88e8213 - requires_dist: - - fs>=2.2.0,<3 ; extra == 'all' - - lxml>=4.0 ; extra == 'all' - - zopfli>=0.1.4 ; extra == 'all' - - lz4>=1.7.4.2 ; extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - skia-pathops>=0.5.0 ; extra == 'all' - - uharfbuzz>=0.23.0 ; extra == 'all' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - lz4>=1.7.4.2 ; extra == 'graphite' - - pycairo ; extra == 'interpolatable' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - lxml>=4.0 ; extra == 'lxml' - - skia-pathops>=0.5.0 ; extra == 'pathops' - - matplotlib ; extra == 'plot' - - uharfbuzz>=0.23.0 ; extra == 'repacker' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - fs>=2.2.0,<3 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - - zopfli>=0.1.4 ; extra == 'woff' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a5/0e/b6314a09a4d561aaa7e09de43fa700917be91e701f07df6178865962666c/fonttools-4.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: fonttools - version: 4.57.0 - sha256: a1968f2a2003c97c4ce6308dc2498d5fd4364ad309900930aa5a503c9851aec8 - requires_dist: - - fs>=2.2.0,<3 ; extra == 'all' - - lxml>=4.0 ; extra == 'all' - - zopfli>=0.1.4 ; extra == 'all' - - lz4>=1.7.4.2 ; extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - skia-pathops>=0.5.0 ; extra == 'all' - - uharfbuzz>=0.23.0 ; extra == 'all' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - lz4>=1.7.4.2 ; extra == 'graphite' - - pycairo ; extra == 'interpolatable' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - lxml>=4.0 ; extra == 'lxml' - - skia-pathops>=0.5.0 ; extra == 'pathops' - - matplotlib ; extra == 'plot' - - uharfbuzz>=0.23.0 ; extra == 'repacker' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - fs>=2.2.0,<3 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - - zopfli>=0.1.4 ; extra == 'woff' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl - name: fsspec - version: 2025.3.0 - sha256: efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3 - requires_dist: - - adlfs ; extra == 'abfs' - - adlfs ; extra == 'adl' - - pyarrow>=1 ; extra == 'arrow' - - dask ; extra == 'dask' - - distributed ; extra == 'dask' - - pre-commit ; extra == 'dev' - - ruff ; extra == 'dev' - - numpydoc ; extra == 'doc' - - sphinx ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinx-rtd-theme ; extra == 'doc' - - yarl ; extra == 'doc' - - dropbox ; extra == 'dropbox' - - dropboxdrivefs ; extra == 'dropbox' - - requests ; extra == 'dropbox' - - adlfs ; extra == 'full' - - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'full' - - dask ; extra == 'full' - - distributed ; extra == 'full' - - dropbox ; extra == 'full' - - dropboxdrivefs ; extra == 'full' - - fusepy ; extra == 'full' - - gcsfs ; extra == 'full' - - libarchive-c ; extra == 'full' - - ocifs ; extra == 'full' - - panel ; extra == 'full' - - paramiko ; extra == 'full' - - pyarrow>=1 ; extra == 'full' - - pygit2 ; extra == 'full' - - requests ; extra == 'full' - - s3fs ; extra == 'full' - - smbprotocol ; extra == 'full' - - tqdm ; extra == 'full' - - fusepy ; extra == 'fuse' - - gcsfs ; extra == 'gcs' - - pygit2 ; extra == 'git' - - requests ; extra == 'github' - - gcsfs ; extra == 'gs' - - panel ; extra == 'gui' - - pyarrow>=1 ; extra == 'hdfs' - - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'http' - - libarchive-c ; extra == 'libarchive' - - ocifs ; extra == 'oci' - - s3fs ; extra == 's3' - - paramiko ; extra == 'sftp' - - smbprotocol ; extra == 'smb' - - paramiko ; extra == 'ssh' - - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test' - - numpy ; extra == 'test' - - pytest ; extra == 'test' - - pytest-asyncio!=0.22.0 ; extra == 'test' - - pytest-benchmark ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-mock ; extra == 'test' - - pytest-recording ; extra == 'test' - - pytest-rerunfailures ; extra == 'test' - - requests ; extra == 'test' - - aiobotocore>=2.5.4,<3.0.0 ; extra == 'test-downstream' - - dask[dataframe,test] ; extra == 'test-downstream' - - moto[server]>4,<5 ; extra == 'test-downstream' - - pytest-timeout ; extra == 'test-downstream' - - xarray ; extra == 'test-downstream' - - adlfs ; extra == 'test-full' - - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test-full' - - cloudpickle ; extra == 'test-full' - - dask ; extra == 'test-full' - - distributed ; extra == 'test-full' - - dropbox ; extra == 'test-full' - - dropboxdrivefs ; extra == 'test-full' - - fastparquet ; extra == 'test-full' - - fusepy ; extra == 'test-full' - - gcsfs ; extra == 'test-full' - - jinja2 ; extra == 'test-full' - - kerchunk ; extra == 'test-full' - - libarchive-c ; extra == 'test-full' - - lz4 ; extra == 'test-full' - - notebook ; extra == 'test-full' - - numpy ; extra == 'test-full' - - ocifs ; extra == 'test-full' - - pandas ; extra == 'test-full' - - panel ; extra == 'test-full' - - paramiko ; extra == 'test-full' - - pyarrow ; extra == 'test-full' - - pyarrow>=1 ; extra == 'test-full' - - pyftpdlib ; extra == 'test-full' - - pygit2 ; extra == 'test-full' - - pytest ; extra == 'test-full' - - pytest-asyncio!=0.22.0 ; extra == 'test-full' - - pytest-benchmark ; extra == 'test-full' - - pytest-cov ; extra == 'test-full' - - pytest-mock ; extra == 'test-full' - - pytest-recording ; extra == 'test-full' - - pytest-rerunfailures ; extra == 'test-full' - - python-snappy ; extra == 'test-full' - - requests ; extra == 'test-full' - - smbprotocol ; extra == 'test-full' - - tqdm ; extra == 'test-full' - - urllib3 ; extra == 'test-full' - - zarr ; extra == 'test-full' - - zstandard ; extra == 'test-full' - - tqdm ; extra == 'tqdm' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl - name: future - version: 1.0.0 - sha256: 929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216 - requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*' -- pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl - name: gitdb - version: 4.0.12 - sha256: 67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf - requires_dist: - - smmap>=3.0.1,<6 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl - name: gitpython - version: 3.1.46 - sha256: 79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058 - requires_dist: - - gitdb>=4.0.1,<5 - - typing-extensions>=3.10.0.2 ; python_full_version < '3.10' - - coverage[toml] ; extra == 'test' - - ddt>=1.1.1,!=1.4.3 ; extra == 'test' - - mock ; python_full_version < '3.8' and extra == 'test' - - mypy==1.18.2 ; python_full_version >= '3.9' and extra == 'test' - - pre-commit ; extra == 'test' - - pytest>=7.3.1 ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-instafail ; extra == 'test' - - pytest-mock ; extra == 'test' - - pytest-sugar ; extra == 'test' - - typing-extensions ; python_full_version < '3.11' and extra == 'test' - - sphinx>=7.1.2,<7.2 ; extra == 'doc' - - sphinx-rtd-theme ; extra == 'doc' - - sphinx-autodoc-typehints ; extra == 'doc' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/d8/88/0ce16c0afb2d71d85562a7bcd9b092fec80a7767ab5b5f7e1bbbca8200f8/greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: greenlet - version: 3.1.1 - sha256: 85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1 - requires_dist: - - sphinx ; extra == 'docs' - - furo ; extra == 'docs' - - objgraph ; extra == 'test' - - psutil ; extra == 'test' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - name: h11 - version: 0.16.0 - sha256: 63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - name: httpcore - version: 1.0.9 - sha256: 2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 - requires_dist: - - certifi - - h11>=0.16 - - anyio>=4.0,<5.0 ; extra == 'asyncio' - - h2>=3,<5 ; extra == 'http2' - - socksio==1.* ; extra == 'socks' - - trio>=0.22.0,<1.0 ; extra == 'trio' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - name: httpx - version: 0.28.1 - sha256: d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad - requires_dist: - - anyio - - certifi - - httpcore==1.* - - idna - - brotli ; platform_python_implementation == 'CPython' and extra == 'brotli' - - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'brotli' - - click==8.* ; extra == 'cli' - - pygments==2.* ; extra == 'cli' - - rich>=10,<14 ; extra == 'cli' - - h2>=3,<5 ; extra == 'http2' - - socksio==1.* ; extra == 'socks' - - zstandard>=0.18.0 ; extra == 'zstd' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b6/cd/5b3334d39276067f54618ce0d0b48ed69d91352fbf137468c7095170d0e5/hyperopt-0.2.7-py2.py3-none-any.whl - name: hyperopt - version: 0.2.7 - sha256: f3046d91fe4167dbf104365016596856b2524a609d22f047a066fc1ac796427c - requires_dist: - - numpy - - scipy - - six - - networkx>=2.2 - - future - - tqdm - - cloudpickle - - py4j - - lightgbm ; extra == 'atpe' - - scikit-learn ; extra == 'atpe' - - pymongo ; extra == 'mongotrials' - - pyspark ; extra == 'sparktrials' - - black ; extra == 'dev' - - pre-commit ; extra == 'dev' - - nose ; extra == 'dev' - - pytest ; extra == 'dev' -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 - md5: 186a18e3ba246eccfc7cff00cd19a870 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - size: 12728445 - timestamp: 1767969922681 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - sha256: d4cefbca587429d1192509edc52c88de52bc96c2447771ddc1f8bee928aed5ef - md5: 1e93aca311da0210e660d2247812fa02 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 12358010 - timestamp: 1767970350308 -- pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - name: idna - version: '3.11' - sha256: 771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea - requires_dist: - - ruff>=0.6.2 ; extra == 'all' - - mypy>=1.11.2 ; extra == 'all' - - pytest>=8.3.2 ; extra == 'all' - - flake8>=7.1.1 ; extra == 'all' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - name: imagesize - version: 1.4.1 - sha256: 0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' -- pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl - name: importlib-metadata - version: 8.5.0 - sha256: 45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b - requires_dist: - - zipp>=3.20 - - typing-extensions>=3.6.4 ; python_full_version < '3.8' - - pytest-checkdocs>=2.4 ; extra == 'check' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - - pytest-cov ; extra == 'cover' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pytest-enabler>=2.2 ; extra == 'enabler' - - ipython ; extra == 'perf' - - pytest>=6,!=8.1.* ; extra == 'test' - - packaging ; extra == 'test' - - pyfakefs ; extra == 'test' - - flufl-flake8 ; extra == 'test' - - pytest-perf>=0.9.2 ; extra == 'test' - - jaraco-test>=5.4 ; extra == 'test' - - importlib-resources>=1.3 ; python_full_version < '3.9' and extra == 'test' - - pytest-mypy ; extra == 'type' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e1/6a/4604f9ae2fa62ef47b9de2fa5ad599589d28c9fd1d335f32759813dfa91e/importlib_resources-6.4.5-py3-none-any.whl - name: importlib-resources - version: 6.4.5 - sha256: ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717 - requires_dist: - - zipp>=3.1.0 ; python_full_version < '3.10' - - pytest-checkdocs>=2.4 ; extra == 'check' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - - pytest-cov ; extra == 'cover' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pytest-enabler>=2.2 ; extra == 'enabler' - - pytest>=6,!=8.1.* ; extra == 'test' - - zipp>=3.17 ; extra == 'test' - - jaraco-test>=5.4 ; extra == 'test' - - pytest-mypy ; extra == 'type' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl - name: itsdangerous - version: 2.2.0 - sha256: c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - name: jinja2 - version: 3.1.6 - sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 - requires_dist: - - markupsafe>=2.0 - - babel>=2.7 ; extra == 'i18n' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl - name: joblib - version: 1.4.2 - sha256: 06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl - name: jsonschema - version: 4.23.0 - sha256: fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 - requires_dist: - - attrs>=22.2.0 - - importlib-resources>=1.4.0 ; python_full_version < '3.9' - - jsonschema-specifications>=2023.3.6 - - pkgutil-resolve-name>=1.3.10 ; python_full_version < '3.9' - - referencing>=0.28.4 - - rpds-py>=0.7.1 - - fqdn ; extra == 'format' - - idna ; extra == 'format' - - isoduration ; extra == 'format' - - jsonpointer>1.13 ; extra == 'format' - - rfc3339-validator ; extra == 'format' - - rfc3987 ; extra == 'format' - - uri-template ; extra == 'format' - - webcolors>=1.11 ; extra == 'format' - - fqdn ; extra == 'format-nongpl' - - idna ; extra == 'format-nongpl' - - isoduration ; extra == 'format-nongpl' - - jsonpointer>1.13 ; extra == 'format-nongpl' - - rfc3339-validator ; extra == 'format-nongpl' - - rfc3986-validator>0.1.0 ; extra == 'format-nongpl' - - uri-template ; extra == 'format-nongpl' - - webcolors>=24.6.0 ; extra == 'format-nongpl' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl - name: jsonschema-specifications - version: 2023.12.1 - sha256: 87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c - requires_dist: - - importlib-resources>=1.4.0 ; python_full_version < '3.9' - - referencing>=0.31.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/14/a7/bb8ab10e12cc8764f4da0245d72dee4731cc720bdec0f085d5e9c6005b98/kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl - name: kiwisolver - version: 1.4.7 - sha256: b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/76/36/ae40d7a3171e06f55ac77fe5536079e7be1d8be2a8210e08975c7f9b4d54/kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl - name: kiwisolver - version: 1.4.7 - sha256: a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - sha256: 1027bd8aa0d5144e954e426ab6218fd5c14e54a98f571985675468b339c808ca - md5: 3ec0aa5037d39b06554109a01e6fb0c6 - depends: - - __glibc >=2.17,<3.0.a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - binutils_impl_linux-64 2.45 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 730831 - timestamp: 1766513089214 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 - md5: 35f29eec58405aaf55e01cb470d8c26a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - size: 57821 - timestamp: 1760295480630 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f - md5: 411ff7cd5d1472bba0f55c0faf04453b - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 40251 - timestamp: 1760295839166 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 - md5: 6d0363467e6ed84f11435eb309f2ff06 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==15.2.0=*_16 - - libgomp 15.2.0 he0feb66_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 1042798 - timestamp: 1765256792743 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - sha256: 5f07f9317f596a201cc6e095e5fc92621afca64829785e483738d935f8cab361 - md5: 5a68259fac2da8f2ee6f7bfe49c9eb8b - depends: - - libgcc 15.2.0 he0feb66_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 27256 - timestamp: 1765256804124 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 - md5: 26c46f90d0e727e95c6c9498a33a09f3 - depends: - - __glibc >=2.17,<3.0.a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 603284 - timestamp: 1765256703881 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 - md5: 1a580f7796c7bf6393fddb8bbbde58dc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - xz 5.8.1.* - license: 0BSD - purls: [] - size: 112894 - timestamp: 1749230047870 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 - md5: d6df911d4564d77c4374b02552cb17d1 - depends: - - __osx >=11.0 - constrains: - - xz 5.8.1.* - license: 0BSD - purls: [] - size: 92286 - timestamp: 1749230283517 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.1-hb9d3cd8_2.conda - sha256: 329e66330a8f9cbb6a8d5995005478188eb4ba8a6b6391affa849744f4968492 - md5: f61edadbb301530bd65a32646bd81552 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - liblzma 5.8.1 hb9d3cd8_2 - license: 0BSD - purls: [] - size: 439868 - timestamp: 1749230061968 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.8.1-h39f12f2_2.conda - sha256: 974804430e24f0b00f3a48b67ec10c9f5441c9bb3d82cc0af51ba45b8a75a241 - md5: 1201137f1a5ec9556032ffc04dcdde8d - depends: - - __osx >=11.0 - - liblzma 5.8.1 h39f12f2_2 - license: 0BSD - purls: [] - size: 116244 - timestamp: 1749230297170 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 - md5: d864d34357c3b65a4b731f78c0801dc4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: LGPL-2.1-only - license_family: GPL - purls: [] - size: 33731 - timestamp: 1750274110928 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 - md5: da5be73701eecd0e8454423fd6ffcf30 - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.2,<79.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: blessing - purls: [] - size: 942808 - timestamp: 1768147973361 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - sha256: 6e9b9f269732cbc4698c7984aa5b9682c168e2a8d1e0406e1ff10091ca046167 - md5: 4b0bf313c53c3e89692f020fb55d5f2c - depends: - - __osx >=11.0 - - icu >=78.2,<79.0a0 - - libzlib >=1.3.1,<2.0a0 - license: blessing - purls: [] - size: 909777 - timestamp: 1768148320535 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 - md5: 68f68355000ec3f1d6f26ea13e8f525f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_16 - constrains: - - libstdcxx-ng ==15.2.0=*_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 5856456 - timestamp: 1765256838573 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee - md5: db409b7c1720428638e7c0d509d3e1b5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 40311 - timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - purls: [] - size: 100393 - timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 60963 - timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b - md5: 369964e85dc26bfe78f41399b366c435 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 46438 - timestamp: 1727963202283 -- pypi: . - name: lnp-ml - version: 0.0.1 - sha256: 07282d62de3ae8b33614654c41729a9b7a300ddb70ce6a7cd53d61218c18f893 - requires_python: '>=3.8' - editable: true -- conda: https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py38h578d9bd_1.conda - sha256: 63bb68b6de508e7282b196b91ad980b3bc0f508073c9ed08fa85ecaf139f445a - md5: 7efdc20a45de05fd6237c1553c166941 - depends: - - python >=3.8,<3.9.0a0 - - python_abi 3.8.* *_cp38 - license: MIT - license_family: MIT - purls: - - pkg:pypi/loguru?source=hash-mapping - size: 97279 - timestamp: 1695547470382 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/loguru-0.7.2-py38h10201cd_1.conda - sha256: 21ff138566123e2ea085564dd8b78c37c96c0a8b0929351ab8a8979443808ff7 - md5: 9c9f9d27ed59f85fe6162ddf7207429f - depends: - - python >=3.8,<3.9.0a0 - - python >=3.8,<3.9.0a0 *_cpython - - python_abi 3.8.* *_cp38 - license: MIT - license_family: MIT - purls: - - pkg:pypi/loguru?source=hash-mapping - size: 97617 - timestamp: 1695547715271 -- pypi: https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl - name: mako - version: 1.3.10 - sha256: baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59 - requires_dist: - - markupsafe>=0.9.2 - - pytest ; extra == 'testing' - - babel ; extra == 'babel' - - lingua ; extra == 'lingua' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 - md5: 93a8e71256479c62074356ef6ebf501b - depends: - - mdurl >=0.1,<1 - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/markdown-it-py?source=hash-mapping - size: 64356 - timestamp: 1686175179621 -- pypi: https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: markupsafe - version: 2.1.5 - sha256: fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl - name: markupsafe - version: 2.1.5 - sha256: 656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/30/33/cc27211d2ffeee4fd7402dca137b6e8a83f6dcae3d4be8d0ad5068555561/matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl - name: matplotlib - version: 3.7.5 - sha256: 53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.0.1 - - numpy>=1.20,<2 - - packaging>=20.0 - - pillow>=6.2.0 - - pyparsing>=2.3.1 - - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_full_version < '3.10' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/aa/59/4d13e5b6298b1ca5525eea8c68d3806ae93ab6d0bb17ca9846aa3156b92b/matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl - name: matplotlib - version: 3.7.5 - sha256: 4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13 - requires_dist: - - contourpy>=1.0.1 - - cycler>=0.10 - - fonttools>=4.22.0 - - kiwisolver>=1.0.1 - - numpy>=1.20,<2 - - packaging>=20.0 - - pillow>=6.2.0 - - pyparsing>=2.3.1 - - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_full_version < '3.10' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 - md5: 776a8dd9e824f77abac30e6ef43a8f7a - depends: - - python >=3.6 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mdurl?source=hash-mapping - size: 14680 - timestamp: 1704317789138 -- pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - name: mpmath - version: 1.3.0 - sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c - requires_dist: - - pytest>=4.6 ; extra == 'develop' - - pycodestyle ; extra == 'develop' - - pytest-cov ; extra == 'develop' - - codecov ; extra == 'develop' - - wheel ; extra == 'develop' - - sphinx ; extra == 'docs' - - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' - - pytest>=4.6 ; extra == 'tests' -- pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl - name: mypy-extensions - version: 1.1.0 - sha256: 1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/79/3f/8d450588206b437dd239a6d44230c63095e71135bd95d5a74347d07adbd5/narwhals-1.42.1-py3-none-any.whl - name: narwhals - version: 1.42.1 - sha256: 7a270d44b94ccdb277a799ae890c42e8504c537c1849f195eb14717c6184977a - requires_dist: - - cudf>=24.10.0 ; extra == 'cudf' - - dask[dataframe]>=2024.8 ; extra == 'dask' - - duckdb>=1.0 ; extra == 'duckdb' - - ibis-framework>=6.0.0 ; extra == 'ibis' - - packaging ; extra == 'ibis' - - pyarrow-hotfix ; extra == 'ibis' - - rich ; extra == 'ibis' - - modin ; extra == 'modin' - - pandas>=0.25.3 ; extra == 'pandas' - - polars>=0.20.3 ; extra == 'polars' - - pyarrow>=11.0.0 ; extra == 'pyarrow' - - pyspark>=3.5.0 ; extra == 'pyspark' - - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect' - - sqlframe>=3.22.0 ; extra == 'sqlframe' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 - md5: 47e340acb35de30501a76c7c799c41d7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: X11 AND BSD-3-Clause - purls: [] - size: 891641 - timestamp: 1738195959188 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 - md5: 068d497125e4bf8a66bf707254fff5ae - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - purls: [] - size: 797030 - timestamp: 1738196177597 -- pypi: https://files.pythonhosted.org/packages/a8/05/9d4f9b78ead6b2661d6e8ea772e111fc4a9fbd866ad0c81906c11206b55e/networkx-3.1-py3-none-any.whl - name: networkx - version: '3.1' - sha256: 4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36 - requires_dist: - - numpy>=1.20 ; extra == 'default' - - scipy>=1.8 ; extra == 'default' - - matplotlib>=3.4 ; extra == 'default' - - pandas>=1.3 ; extra == 'default' - - pre-commit>=3.2 ; extra == 'developer' - - mypy>=1.1 ; extra == 'developer' - - sphinx>=6.1 ; extra == 'doc' - - pydata-sphinx-theme>=0.13 ; extra == 'doc' - - sphinx-gallery>=0.12 ; extra == 'doc' - - numpydoc>=1.5 ; extra == 'doc' - - pillow>=9.4 ; extra == 'doc' - - nb2plots>=0.6 ; extra == 'doc' - - texext>=0.6.7 ; extra == 'doc' - - lxml>=4.6 ; extra == 'extra' - - pygraphviz>=1.10 ; extra == 'extra' - - pydot>=1.4.2 ; extra == 'extra' - - sympy>=1.10 ; extra == 'extra' - - pytest>=7.2 ; extra == 'test' - - pytest-cov>=4.0 ; extra == 'test' - - codecov>=2.1 ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/98/5d/5738903efe0ecb73e51eb44feafba32bdba2081263d40c5043568ff60faf/numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: numpy - version: 1.24.4 - sha256: dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a7/ae/f53b7b265fdc701e663fbb322a8e9d4b14d9cb7b2385f45ddfabfc4327e4/numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl - name: numpy - version: 1.24.4 - sha256: 04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl - name: nvidia-cublas-cu12 - version: 12.1.3.1 - sha256: ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - name: nvidia-cuda-cupti-cu12 - version: 12.1.105 - sha256: e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - name: nvidia-cuda-nvrtc-cu12 - version: 12.1.105 - sha256: 339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/eb/d5/c68b1d2cdfcc59e72e8a5949a37ddb22ae6cade80cd4a57a84d4c8b55472/nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - name: nvidia-cuda-runtime-cu12 - version: 12.1.105 - sha256: 6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl - name: nvidia-cudnn-cu12 - version: 9.1.0.70 - sha256: 165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f - requires_dist: - - nvidia-cublas-cu12 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/86/94/eb540db023ce1d162e7bea9f8f5aa781d57c65aed513c33ee9a5123ead4d/nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl - name: nvidia-cufft-cu12 - version: 11.0.2.54 - sha256: 794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/44/31/4890b1c9abc496303412947fc7dcea3d14861720642b49e8ceed89636705/nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl - name: nvidia-curand-cu12 - version: 10.3.2.106 - sha256: 9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl - name: nvidia-cusolver-cu12 - version: 11.4.5.107 - sha256: 8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd - requires_dist: - - nvidia-cublas-cu12 - - nvidia-nvjitlink-cu12 - - nvidia-cusparse-cu12 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl - name: nvidia-cusparse-cu12 - version: 12.1.0.106 - sha256: f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c - requires_dist: - - nvidia-nvjitlink-cu12 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl - name: nvidia-nccl-cu12 - version: 2.20.5 - sha256: 057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - name: nvidia-nvjitlink-cu12 - version: 12.9.86 - sha256: e3f1171dbdc83c5932a45f0f4c99180a70de9bd2718c1ab77d14104f6d7147f9 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/da/d3/8057f0587683ed2fcd4dbfbdfdfa807b9160b809976099d36b8f60d08f03/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl - name: nvidia-nvtx-cu12 - version: 12.1.105 - sha256: dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl - name: openpyxl - version: 3.1.5 - sha256: 5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 - requires_dist: - - et-xmlfile - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d - md5: 9ee58d5c534af06558933af3c845a780 - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 3165399 - timestamp: 1762839186699 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 - md5: b34dc4172653c13dcf453862f251af2b - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - size: 3108371 - timestamp: 1762839712322 -- pypi: https://files.pythonhosted.org/packages/7f/12/cba81286cbaf0f0c3f0473846cfd992cb240bdcea816bf2ef7de8ed0f744/optuna-4.5.0-py3-none-any.whl - name: optuna - version: 4.5.0 - sha256: 5b8a783e84e448b0742501bc27195344a28d2c77bd2feef5b558544d954851b0 - requires_dist: - - alembic>=1.5.0 - - colorlog - - numpy - - packaging>=20.0 - - sqlalchemy>=1.4.2 - - tqdm - - pyyaml - - asv>=0.5.0 ; extra == 'benchmark' - - cma ; extra == 'benchmark' - - virtualenv ; extra == 'benchmark' - - black ; extra == 'checking' - - blackdoc ; extra == 'checking' - - flake8 ; extra == 'checking' - - isort ; extra == 'checking' - - mypy ; extra == 'checking' - - mypy-boto3-s3 ; extra == 'checking' - - scipy-stubs ; python_full_version >= '3.10' and extra == 'checking' - - types-pyyaml ; extra == 'checking' - - types-redis ; extra == 'checking' - - types-setuptools ; extra == 'checking' - - types-tqdm ; extra == 'checking' - - typing-extensions>=3.10.0.0 ; extra == 'checking' - - ase ; extra == 'document' - - cmaes>=0.12.0 ; extra == 'document' - - fvcore ; extra == 'document' - - kaleido<0.4 ; extra == 'document' - - lightgbm ; extra == 'document' - - matplotlib!=3.6.0 ; extra == 'document' - - pandas ; extra == 'document' - - pillow ; extra == 'document' - - plotly>=4.9.0 ; extra == 'document' - - scikit-learn ; extra == 'document' - - sphinx ; extra == 'document' - - sphinx-copybutton ; extra == 'document' - - sphinx-gallery ; extra == 'document' - - sphinx-notfound-page ; extra == 'document' - - sphinx-rtd-theme>=1.2.0 ; extra == 'document' - - torch ; extra == 'document' - - torchvision ; extra == 'document' - - boto3 ; extra == 'optional' - - cmaes>=0.12.0 ; extra == 'optional' - - google-cloud-storage ; extra == 'optional' - - matplotlib!=3.6.0 ; extra == 'optional' - - pandas ; extra == 'optional' - - plotly>=4.9.0 ; extra == 'optional' - - redis ; extra == 'optional' - - scikit-learn>=0.24.2 ; extra == 'optional' - - scipy ; extra == 'optional' - - torch ; extra == 'optional' - - grpcio ; extra == 'optional' - - protobuf>=5.28.1 ; extra == 'optional' - - coverage ; extra == 'test' - - fakeredis[lua] ; extra == 'test' - - kaleido<0.4 ; extra == 'test' - - moto ; extra == 'test' - - pytest ; extra == 'test' - - pytest-xdist ; extra == 'test' - - scipy>=1.9.2 ; extra == 'test' - - torch ; extra == 'test' - - grpcio ; extra == 'test' - - protobuf>=5.28.1 ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - name: packaging - version: '24.2' - sha256: 09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/53/c3/f8e87361f7fdf42012def602bfa2a593423c729f5cb7c97aed7f51be66ac/pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl - name: pandas - version: 2.0.3 - sha256: 32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5 - requires_dist: - - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.1 - - numpy>=1.20.3 ; python_full_version < '3.10' - - numpy>=1.21.0 ; python_full_version >= '3.10' - - numpy>=1.23.2 ; python_full_version >= '3.11' - - beautifulsoup4>=4.9.3 ; extra == 'all' - - bottleneck>=1.3.2 ; extra == 'all' - - brotlipy>=0.7.0 ; extra == 'all' - - fastparquet>=0.6.3 ; extra == 'all' - - fsspec>=2021.7.0 ; extra == 'all' - - gcsfs>=2021.7.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.34.2 ; extra == 'all' - - jinja2>=3.0.0 ; extra == 'all' - - lxml>=4.6.3 ; extra == 'all' - - matplotlib>=3.6.1 ; extra == 'all' - - numba>=0.53.1 ; extra == 'all' - - numexpr>=2.7.3 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.0.7 ; extra == 'all' - - pandas-gbq>=0.15.0 ; extra == 'all' - - psycopg2>=2.8.6 ; extra == 'all' - - pyarrow>=7.0.0 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' - - pyqt5>=5.15.1 ; extra == 'all' - - pyreadstat>=1.1.2 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - pytest-asyncio>=0.17.0 ; extra == 'all' - - python-snappy>=0.6.0 ; extra == 'all' - - pyxlsb>=1.0.8 ; extra == 'all' - - qtpy>=2.2.0 ; extra == 'all' - - scipy>=1.7.1 ; extra == 'all' - - s3fs>=2021.8.0 ; extra == 'all' - - sqlalchemy>=1.4.16 ; extra == 'all' - - tables>=3.6.1 ; extra == 'all' - - tabulate>=0.8.9 ; extra == 'all' - - xarray>=0.21.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=1.4.3 ; extra == 'all' - - zstandard>=0.15.2 ; extra == 'all' - - s3fs>=2021.8.0 ; extra == 'aws' - - pyqt5>=5.15.1 ; extra == 'clipboard' - - qtpy>=2.2.0 ; extra == 'clipboard' - - brotlipy>=0.7.0 ; extra == 'compression' - - python-snappy>=0.6.0 ; extra == 'compression' - - zstandard>=0.15.2 ; extra == 'compression' - - scipy>=1.7.1 ; extra == 'computation' - - xarray>=0.21.0 ; extra == 'computation' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.0.7 ; extra == 'excel' - - pyxlsb>=1.0.8 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=1.4.3 ; extra == 'excel' - - pyarrow>=7.0.0 ; extra == 'feather' - - fsspec>=2021.7.0 ; extra == 'fss' - - gcsfs>=2021.7.0 ; extra == 'gcp' - - pandas-gbq>=0.15.0 ; extra == 'gcp' - - tables>=3.6.1 ; extra == 'hdf5' - - beautifulsoup4>=4.9.3 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=4.6.3 ; extra == 'html' - - sqlalchemy>=1.4.16 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - jinja2>=3.0.0 ; extra == 'output-formatting' - - tabulate>=0.8.9 ; extra == 'output-formatting' - - pyarrow>=7.0.0 ; extra == 'parquet' - - bottleneck>=1.3.2 ; extra == 'performance' - - numba>=0.53.1 ; extra == 'performance' - - numexpr>=2.7.1 ; extra == 'performance' - - matplotlib>=3.6.1 ; extra == 'plot' - - sqlalchemy>=1.4.16 ; extra == 'postgresql' - - psycopg2>=2.8.6 ; extra == 'postgresql' - - pyreadstat>=1.1.2 ; extra == 'spss' - - sqlalchemy>=1.4.16 ; extra == 'sql-other' - - hypothesis>=6.34.2 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pytest-asyncio>=0.17.0 ; extra == 'test' - - lxml>=4.6.3 ; extra == 'xml' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f8/7f/5b047effafbdd34e52c9e2d7e44f729a0655efafb22198c45cf692cdc157/pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: pandas - version: 2.0.3 - sha256: 9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0 - requires_dist: - - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.1 - - numpy>=1.20.3 ; python_full_version < '3.10' - - numpy>=1.21.0 ; python_full_version >= '3.10' - - numpy>=1.23.2 ; python_full_version >= '3.11' - - beautifulsoup4>=4.9.3 ; extra == 'all' - - bottleneck>=1.3.2 ; extra == 'all' - - brotlipy>=0.7.0 ; extra == 'all' - - fastparquet>=0.6.3 ; extra == 'all' - - fsspec>=2021.7.0 ; extra == 'all' - - gcsfs>=2021.7.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.34.2 ; extra == 'all' - - jinja2>=3.0.0 ; extra == 'all' - - lxml>=4.6.3 ; extra == 'all' - - matplotlib>=3.6.1 ; extra == 'all' - - numba>=0.53.1 ; extra == 'all' - - numexpr>=2.7.3 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.0.7 ; extra == 'all' - - pandas-gbq>=0.15.0 ; extra == 'all' - - psycopg2>=2.8.6 ; extra == 'all' - - pyarrow>=7.0.0 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' - - pyqt5>=5.15.1 ; extra == 'all' - - pyreadstat>=1.1.2 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - pytest-asyncio>=0.17.0 ; extra == 'all' - - python-snappy>=0.6.0 ; extra == 'all' - - pyxlsb>=1.0.8 ; extra == 'all' - - qtpy>=2.2.0 ; extra == 'all' - - scipy>=1.7.1 ; extra == 'all' - - s3fs>=2021.8.0 ; extra == 'all' - - sqlalchemy>=1.4.16 ; extra == 'all' - - tables>=3.6.1 ; extra == 'all' - - tabulate>=0.8.9 ; extra == 'all' - - xarray>=0.21.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=1.4.3 ; extra == 'all' - - zstandard>=0.15.2 ; extra == 'all' - - s3fs>=2021.8.0 ; extra == 'aws' - - pyqt5>=5.15.1 ; extra == 'clipboard' - - qtpy>=2.2.0 ; extra == 'clipboard' - - brotlipy>=0.7.0 ; extra == 'compression' - - python-snappy>=0.6.0 ; extra == 'compression' - - zstandard>=0.15.2 ; extra == 'compression' - - scipy>=1.7.1 ; extra == 'computation' - - xarray>=0.21.0 ; extra == 'computation' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.0.7 ; extra == 'excel' - - pyxlsb>=1.0.8 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=1.4.3 ; extra == 'excel' - - pyarrow>=7.0.0 ; extra == 'feather' - - fsspec>=2021.7.0 ; extra == 'fss' - - gcsfs>=2021.7.0 ; extra == 'gcp' - - pandas-gbq>=0.15.0 ; extra == 'gcp' - - tables>=3.6.1 ; extra == 'hdf5' - - beautifulsoup4>=4.9.3 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=4.6.3 ; extra == 'html' - - sqlalchemy>=1.4.16 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - jinja2>=3.0.0 ; extra == 'output-formatting' - - tabulate>=0.8.9 ; extra == 'output-formatting' - - pyarrow>=7.0.0 ; extra == 'parquet' - - bottleneck>=1.3.2 ; extra == 'performance' - - numba>=0.53.1 ; extra == 'performance' - - numexpr>=2.7.1 ; extra == 'performance' - - matplotlib>=3.6.1 ; extra == 'plot' - - sqlalchemy>=1.4.16 ; extra == 'postgresql' - - psycopg2>=2.8.6 ; extra == 'postgresql' - - pyreadstat>=1.1.2 ; extra == 'spss' - - sqlalchemy>=1.4.16 ; extra == 'sql-other' - - hypothesis>=6.34.2 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pytest-asyncio>=0.17.0 ; extra == 'test' - - lxml>=4.6.3 ; extra == 'xml' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/5d/e6/71ed4d95676098159b533c4a4c424cf453fec9614edaff1a0633fe228eef/pandas_flavor-0.7.0-py3-none-any.whl - name: pandas-flavor - version: 0.7.0 - sha256: 7ee81e834b111e424679776f49c51abcffec88203b3ff0df2c9cb75550e06b1a - requires_dist: - - pandas>=0.23 - - xarray -- pypi: https://files.pythonhosted.org/packages/10/43/105823d233c5e5d31cea13428f4474ded9d961652307800979a59d6a4276/pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl - name: pillow - version: 10.4.0 - sha256: 7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=7.3 ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - check-manifest ; extra == 'tests' - - coverage ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/fb/ad/435fe29865f98a8fbdc64add8875a6e4f8c97749a93577a8919ec6f32c64/pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl - name: pillow - version: 10.4.0 - sha256: 950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd - requires_dist: - - furo ; extra == 'docs' - - olefile ; extra == 'docs' - - sphinx>=7.3 ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - sphinx-inline-tabs ; extra == 'docs' - - sphinxext-opengraph ; extra == 'docs' - - olefile ; extra == 'fpx' - - olefile ; extra == 'mic' - - check-manifest ; extra == 'tests' - - coverage ; extra == 'tests' - - defusedxml ; extra == 'tests' - - markdown2 ; extra == 'tests' - - olefile ; extra == 'tests' - - packaging ; extra == 'tests' - - pyroma ; extra == 'tests' - - pytest ; extra == 'tests' - - pytest-cov ; extra == 'tests' - - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - - defusedxml ; extra == 'xmp' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 - md5: 5dd546fe99b44fda83963d15f84263b7 - depends: - - python >=3.8,<3.13.0a0 - - setuptools - - wheel - license: MIT - license_family: MIT - purls: - - pkg:pypi/pip?source=hash-mapping - size: 1243168 - timestamp: 1730203795600 -- pypi: https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl - name: pkgutil-resolve-name - version: 1.3.10 - sha256: ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl - name: protobuf - version: 5.29.5 - sha256: 63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl - name: protobuf - version: 5.29.5 - sha256: e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/bd/db/ea0203e495be491c85af87b66e37acfd3bf756fd985f87e46fc5e3bf022c/py4j-0.10.9.9-py2.py3-none-any.whl - name: py4j - version: 0.10.9.9 - sha256: c7c26e4158defb37b0bb124933163641a2ff6e3a3913f7811b0ddbe07ed61533 -- pypi: https://files.pythonhosted.org/packages/64/d9/51e35550f2f18b8815a2ab25948f735434db32000c0e91eba3a32634782a/pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl - name: pyarrow - version: 17.0.0 - sha256: edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8 - requires_dist: - - numpy>=1.16.6 - - pytest ; extra == 'test' - - hypothesis ; extra == 'test' - - cffi ; extra == 'test' - - pytz ; extra == 'test' - - pandas ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e6/c1/4c6bcdf7a820034aa91a8b4d25fef38809be79b42ca7aaa16d4680b0bbac/pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl - name: pyarrow - version: 17.0.0 - sha256: d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c - requires_dist: - - numpy>=1.16.6 - - pytest ; extra == 'test' - - hypothesis ; extra == 'test' - - cffi ; extra == 'test' - - pytz ; extra == 'test' - - pandas ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl - name: pydantic - version: 2.10.6 - sha256: 427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 - requires_dist: - - annotated-types>=0.6.0 - - pydantic-core==2.27.2 - - typing-extensions>=4.12.2 - - email-validator>=2.0.0 ; extra == 'email' - - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f4/20/26c549249769ed84877f862f7bb93f89a6ee08b4bee1ed8781616b7fbb5e/pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl - name: pydantic-core - version: 2.27.2 - sha256: 521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320 - requires_dist: - - typing-extensions>=4.6.0,!=4.7.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f7/a3/5f19bc495793546825ab160e530330c2afcee2281c02b5ffafd0b32ac05e/pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: pydantic-core - version: 2.27.2 - sha256: 9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5 - requires_dist: - - typing-extensions>=4.6.0,!=4.7.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl - name: pydeck - version: 0.9.1 - sha256: b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038 - requires_dist: - - jinja2>=2.10.1 - - numpy>=1.16.4 - - pydeck-carto ; extra == 'carto' - - ipywidgets>=7,<8 ; extra == 'jupyter' - - traitlets>=4.3.2 ; extra == 'jupyter' - - ipython>=5.8.0 ; python_full_version < '3.4' and extra == 'jupyter' - - ipykernel>=5.1.2 ; python_full_version >= '3.4' and extra == 'jupyter' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b - md5: b7f5c092b8f9800150d998a71b76d5a1 - depends: - - python >=3.8 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/pygments?source=hash-mapping - size: 879295 - timestamp: 1714846885370 -- pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl - name: pyparsing - version: 3.1.4 - sha256: a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c - requires_dist: - - railroad-diagrams ; extra == 'diagrams' - - jinja2 ; extra == 'diagrams' - requires_python: '>=3.6.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.8.20-h4a871b0_2_cpython.conda - build_number: 2 - sha256: 8043dcdb29e1e026d0def1056620d81b24c04f71fd98cc45888c58373b479845 - md5: 05ffff2f44ad60b94ecb53d029c6bdf7 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.8.* *_cp38 - license: Python-2.0 - purls: [] - size: 22176012 - timestamp: 1727719857908 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.8.20-h7d35d02_2_cpython.conda - build_number: 2 - sha256: cf8692e732697d47f0290ef83caa4b3115c7b277a3fb155b7de0f09fa1b5e27c - md5: 29ed2994beffea2a256a7e14f9468df8 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.8.* *_cp38 - license: Python-2.0 - purls: [] - size: 11774160 - timestamp: 1727718758277 -- pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - name: python-dateutil - version: 2.9.0.post0 - sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 - requires_dist: - - six>=1.5 - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' -- pypi: https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl - name: python-dotenv - version: 1.0.1 - sha256: f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a - requires_dist: - - click>=5.0 ; extra == 'cli' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda - build_number: 8 - sha256: 83c22066a672ce0b16e693c84aa6d5efb68e02eff037a55e047d7095d0fdb5ca - md5: 4f7b6e3de4f15cc44e0f93b39f07205d - constrains: - - python 3.8.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6960 - timestamp: 1752805923703 -- pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - name: pytz - version: '2025.2' - sha256: 5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 -- pypi: https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz - name: pyyaml - version: 6.0.3 - sha256: d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/25/a2/b725b61ac76a75583ae7104b3209f75ea44b13cfd026aa535ece22b7f22e/PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: pyyaml - version: 6.0.3 - sha256: 22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3d/84/63b2e66f5c7cb97ce994769afbbef85a1ac364fedbcb7d4a3c0f15d318a5/rdkit-2024.3.5-cp38-cp38-manylinux_2_28_x86_64.whl - name: rdkit - version: 2024.3.5 - sha256: f662ed10e14c7874d0e011c1f8260a6cf4a5547100806f9f4540f8550a3f1d36 - requires_dist: - - numpy - - pillow -- pypi: https://files.pythonhosted.org/packages/bf/cb/c709b60f4815e18c00e1e8639204bdba04cb158e6278791d82f94f51a988/rdkit-2024.3.5-cp38-cp38-macosx_11_0_arm64.whl - name: rdkit - version: 2024.3.5 - sha256: 53638d0d94f7c511273ff5765abc6a1fe60fe6c8633db13cad03bc527550a7a9 - requires_dist: - - numpy - - pillow -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 - md5: d7d95fc8287ea7bf33e0e7116d2b95ec - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 345073 - timestamp: 1765813471974 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 - md5: f8381319127120ce51e081dce4865cf4 - depends: - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 313930 - timestamp: 1765813902568 -- pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl - name: referencing - version: 0.35.1 - sha256: eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de - requires_dist: - - attrs>=22.2.0 - - rpds-py>=0.7.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl - name: requests - version: 2.32.4 - sha256: 27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c - requires_dist: - - charset-normalizer>=2,<4 - - idna>=2.5,<4 - - urllib3>=1.21.1,<3 - - certifi>=2017.4.17 - - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' - - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - sha256: c009488fc07fd5557434c9c1ad32ab1dd50241d6a766e4b2b4125cd6498585a8 - md5: bcf8cc8924b5d20ead3d122130b8320b - depends: - - markdown-it-py >=2.2.0 - - pygments >=2.13.0,<3.0.0 - - python >=3.8 - - typing_extensions >=4.0.0,<5.0.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/rich?source=hash-mapping - size: 185481 - timestamp: 1730592349978 -- pypi: https://files.pythonhosted.org/packages/54/63/47d34dc4ddb3da73e78e10c9009dcf8edc42d355a221351c05c822c2a50b/rpds_py-0.20.1-cp38-cp38-macosx_11_0_arm64.whl - name: rpds-py - version: 0.20.1 - sha256: 3e310838a5801795207c66c73ea903deda321e6146d6f282e85fa7e3e4854804 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/c4/ce/af016c81fda833bf125b20d1677d816f230cad2ab189f46bcbfea3c7a375/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: rpds-py - version: 0.20.1 - sha256: 02a0629ec053fc013808a85178524e3cb63a61dbc35b22499870194a63578fb9 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.12-h4196e79_0.conda - noarch: python - sha256: 26c9f201a249cf54acacfa5055e96ad6e8e272cac3a25ac7caee8fe048e66b5a - md5: b8b77763e87e13ecac834a190155600b - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ruff?source=compressed-mapping - size: 11513418 - timestamp: 1768513907806 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.14.12-hb0cad00_0.conda - noarch: python - sha256: 8da228ab3930cf1fbf52bd00e2b141af458a04ef698122d9beff151d6517fa84 - md5: b7049a4bfa0de48b8d27f158c1e9daf7 - depends: - - python - - __osx >=11.0 - constrains: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ruff?source=compressed-mapping - size: 10452516 - timestamp: 1768513987014 -- pypi: https://files.pythonhosted.org/packages/3f/48/6fdd99f5717045f9984616b5c2ec683d6286d30c0ac234563062132b83ab/scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: scikit-learn - version: 1.3.2 - sha256: 785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf - requires_dist: - - numpy>=1.17.3,<2.0 - - scipy>=1.5.0 - - joblib>=1.1.1 - - threadpoolctl>=2.0.0 - - matplotlib>=3.1.3 ; extra == 'benchmark' - - pandas>=1.0.5 ; extra == 'benchmark' - - memory-profiler>=0.57.0 ; extra == 'benchmark' - - matplotlib>=3.1.3 ; extra == 'docs' - - scikit-image>=0.16.2 ; extra == 'docs' - - pandas>=1.0.5 ; extra == 'docs' - - seaborn>=0.9.0 ; extra == 'docs' - - memory-profiler>=0.57.0 ; extra == 'docs' - - sphinx>=6.0.0 ; extra == 'docs' - - sphinx-copybutton>=0.5.2 ; extra == 'docs' - - sphinx-gallery>=0.10.1 ; extra == 'docs' - - numpydoc>=1.2.0 ; extra == 'docs' - - pillow>=7.1.2 ; extra == 'docs' - - pooch>=1.6.0 ; extra == 'docs' - - sphinx-prompt>=1.3.0 ; extra == 'docs' - - sphinxext-opengraph>=0.4.2 ; extra == 'docs' - - plotly>=5.14.0 ; extra == 'docs' - - matplotlib>=3.1.3 ; extra == 'examples' - - scikit-image>=0.16.2 ; extra == 'examples' - - pandas>=1.0.5 ; extra == 'examples' - - seaborn>=0.9.0 ; extra == 'examples' - - pooch>=1.6.0 ; extra == 'examples' - - plotly>=5.14.0 ; extra == 'examples' - - matplotlib>=3.1.3 ; extra == 'tests' - - scikit-image>=0.16.2 ; extra == 'tests' - - pandas>=1.0.5 ; extra == 'tests' - - pytest>=7.1.2 ; extra == 'tests' - - pytest-cov>=2.9.0 ; extra == 'tests' - - ruff>=0.0.272 ; extra == 'tests' - - black>=23.3.0 ; extra == 'tests' - - mypy>=1.3 ; extra == 'tests' - - pyamg>=4.0.0 ; extra == 'tests' - - numpydoc>=1.2.0 ; extra == 'tests' - - pooch>=1.6.0 ; extra == 'tests' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a4/62/92e9cec3deca8b45abf62dd8f6469d688b3f28b9c170809fcc46f110b523/scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl - name: scikit-learn - version: 1.3.2 - sha256: b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073 - requires_dist: - - numpy>=1.17.3,<2.0 - - scipy>=1.5.0 - - joblib>=1.1.1 - - threadpoolctl>=2.0.0 - - matplotlib>=3.1.3 ; extra == 'benchmark' - - pandas>=1.0.5 ; extra == 'benchmark' - - memory-profiler>=0.57.0 ; extra == 'benchmark' - - matplotlib>=3.1.3 ; extra == 'docs' - - scikit-image>=0.16.2 ; extra == 'docs' - - pandas>=1.0.5 ; extra == 'docs' - - seaborn>=0.9.0 ; extra == 'docs' - - memory-profiler>=0.57.0 ; extra == 'docs' - - sphinx>=6.0.0 ; extra == 'docs' - - sphinx-copybutton>=0.5.2 ; extra == 'docs' - - sphinx-gallery>=0.10.1 ; extra == 'docs' - - numpydoc>=1.2.0 ; extra == 'docs' - - pillow>=7.1.2 ; extra == 'docs' - - pooch>=1.6.0 ; extra == 'docs' - - sphinx-prompt>=1.3.0 ; extra == 'docs' - - sphinxext-opengraph>=0.4.2 ; extra == 'docs' - - plotly>=5.14.0 ; extra == 'docs' - - matplotlib>=3.1.3 ; extra == 'examples' - - scikit-image>=0.16.2 ; extra == 'examples' - - pandas>=1.0.5 ; extra == 'examples' - - seaborn>=0.9.0 ; extra == 'examples' - - pooch>=1.6.0 ; extra == 'examples' - - plotly>=5.14.0 ; extra == 'examples' - - matplotlib>=3.1.3 ; extra == 'tests' - - scikit-image>=0.16.2 ; extra == 'tests' - - pandas>=1.0.5 ; extra == 'tests' - - pytest>=7.1.2 ; extra == 'tests' - - pytest-cov>=2.9.0 ; extra == 'tests' - - ruff>=0.0.272 ; extra == 'tests' - - black>=23.3.0 ; extra == 'tests' - - mypy>=1.3 ; extra == 'tests' - - pyamg>=4.0.0 ; extra == 'tests' - - numpydoc>=1.2.0 ; extra == 'tests' - - pooch>=1.6.0 ; extra == 'tests' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/69/f0/fb07a9548e48b687b8bf2fa81d71aba9cfc548d365046ca1c791e24db99d/scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: scipy - version: 1.10.1 - sha256: 07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f - requires_dist: - - numpy>=1.19.5,<1.27.0 - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest-xdist ; extra == 'test' - - asv ; extra == 'test' - - mpmath ; extra == 'test' - - gmpy2 ; extra == 'test' - - threadpoolctl ; extra == 'test' - - scikit-umfpack ; extra == 'test' - - pooch ; extra == 'test' - - sphinx!=4.1.0 ; extra == 'doc' - - pydata-sphinx-theme==0.9.0 ; extra == 'doc' - - sphinx-design>=0.2.0 ; extra == 'doc' - - matplotlib>2 ; extra == 'doc' - - numpydoc ; extra == 'doc' - - mypy ; extra == 'dev' - - typing-extensions ; extra == 'dev' - - pycodestyle ; extra == 'dev' - - flake8 ; extra == 'dev' - - rich-click ; extra == 'dev' - - click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' - requires_python: '>=3.8,<3.12' -- pypi: https://files.pythonhosted.org/packages/93/4a/50c436de1353cce8b66b26e49a687f10b91fe7465bf34e4565d810153003/scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl - name: scipy - version: 1.10.1 - sha256: 39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88 - requires_dist: - - numpy>=1.19.5,<1.27.0 - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-timeout ; extra == 'test' - - pytest-xdist ; extra == 'test' - - asv ; extra == 'test' - - mpmath ; extra == 'test' - - gmpy2 ; extra == 'test' - - threadpoolctl ; extra == 'test' - - scikit-umfpack ; extra == 'test' - - pooch ; extra == 'test' - - sphinx!=4.1.0 ; extra == 'doc' - - pydata-sphinx-theme==0.9.0 ; extra == 'doc' - - sphinx-design>=0.2.0 ; extra == 'doc' - - matplotlib>2 ; extra == 'doc' - - numpydoc ; extra == 'doc' - - mypy ; extra == 'dev' - - typing-extensions ; extra == 'dev' - - pycodestyle ; extra == 'dev' - - flake8 ; extra == 'dev' - - rich-click ; extra == 'dev' - - click ; extra == 'dev' - - doit>=0.36.0 ; extra == 'dev' - - pydevtool ; extra == 'dev' - requires_python: '>=3.8,<3.12' -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - sha256: a36d020b9f32fc3f1a6488a1c4a9c13988c6468faf6895bf30ca69521a61230e - md5: 2ce9825396daf72baabaade36cee16da - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/setuptools?source=hash-mapping - size: 779561 - timestamp: 1730382173961 -- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb - md5: d08db09a552699ee9e7eec56b4eb3899 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/shellingham?source=hash-mapping - size: 14568 - timestamp: 1698144516278 -- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - name: six - version: 1.17.0 - sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' -- pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl - name: smmap - version: 5.0.2 - sha256: b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - name: sniffio - version: 1.3.1 - sha256: 2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - name: snowballstemmer - version: 3.0.1 - sha256: 6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064 - requires_python: '!=3.0.*,!=3.1.*,!=3.2.*' -- pypi: https://files.pythonhosted.org/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl - name: sphinx - version: 7.1.2 - sha256: d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe - requires_dist: - - sphinxcontrib-applehelp - - sphinxcontrib-devhelp - - sphinxcontrib-jsmath - - sphinxcontrib-htmlhelp>=2.0.0 - - sphinxcontrib-serializinghtml>=1.1.5 - - sphinxcontrib-qthelp - - jinja2>=3.0 - - pygments>=2.13 - - docutils>=0.18.1,<0.21 - - snowballstemmer>=2.0 - - babel>=2.9 - - alabaster>=0.7,<0.8 - - imagesize>=1.3 - - requests>=2.25.0 - - packaging>=21.0 - - importlib-metadata>=4.8 ; python_full_version < '3.10' - - colorama>=0.4.5 ; sys_platform == 'win32' - - sphinxcontrib-websupport ; extra == 'docs' - - flake8>=3.5.0 ; extra == 'lint' - - flake8-simplify ; extra == 'lint' - - isort ; extra == 'lint' - - ruff ; extra == 'lint' - - mypy>=0.990 ; extra == 'lint' - - sphinx-lint ; extra == 'lint' - - docutils-stubs ; extra == 'lint' - - types-requests ; extra == 'lint' - - pytest>=4.6 ; extra == 'test' - - html5lib ; extra == 'test' - - cython ; extra == 'test' - - filelock ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/87/c7/b5c8015d823bfda1a346adb2c634a2101d50bb75d421eb6dcb31acd25ebc/sphinx_rtd_theme-3.1.0-py2.py3-none-any.whl - name: sphinx-rtd-theme - version: 3.1.0 - sha256: 1785824ae8e6632060490f67cf3a72d404a85d2d9fc26bce3619944de5682b89 - requires_dist: - - sphinx>=6,<10 - - docutils>0.18,<0.23 - - sphinxcontrib-jquery>=4,<5 - - transifex-client ; extra == 'dev' - - bump2version ; extra == 'dev' - - wheel ; extra == 'dev' - - twine ; extra == 'dev' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl - name: sphinxcontrib-applehelp - version: 1.0.4 - sha256: 29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228 - requires_dist: - - flake8 ; extra == 'lint' - - mypy ; extra == 'lint' - - docutils-stubs ; extra == 'lint' - - pytest ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl - name: sphinxcontrib-devhelp - version: 1.0.2 - sha256: 8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e - requires_dist: - - flake8 ; extra == 'lint' - - mypy ; extra == 'lint' - - docutils-stubs ; extra == 'lint' - - pytest ; extra == 'test' - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl - name: sphinxcontrib-htmlhelp - version: 2.0.1 - sha256: c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903 - requires_dist: - - flake8 ; extra == 'lint' - - mypy ; extra == 'lint' - - docutils-stubs ; extra == 'lint' - - pytest ; extra == 'test' - - html5lib ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl - name: sphinxcontrib-jquery - version: '4.1' - sha256: f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae - requires_dist: - - sphinx>=1.8 - requires_python: '>=2.7' -- pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - name: sphinxcontrib-jsmath - version: 1.0.1 - sha256: 2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 - requires_dist: - - pytest ; extra == 'test' - - flake8 ; extra == 'test' - - mypy ; extra == 'test' - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl - name: sphinxcontrib-qthelp - version: 1.0.3 - sha256: bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6 - requires_dist: - - flake8 ; extra == 'lint' - - mypy ; extra == 'lint' - - docutils-stubs ; extra == 'lint' - - pytest ; extra == 'test' - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl - name: sphinxcontrib-serializinghtml - version: 1.1.5 - sha256: 352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd - requires_dist: - - flake8 ; extra == 'lint' - - mypy ; extra == 'lint' - - docutils-stubs ; extra == 'lint' - - pytest ; extra == 'test' - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/07/d4/76b9618d7eb1e6a3c26734e1186f8ad7869e4426b1ea7dc425bc4c832e67/sqlalchemy-2.0.46-cp38-cp38-macosx_11_0_arm64.whl - name: sqlalchemy - version: 2.0.46 - sha256: 6ac245604295b521de49b465bab845e3afe6916bcb2147e5929c8041b4ec0545 - requires_dist: - - typing-extensions>=4.6.0 - - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' - - importlib-metadata ; python_full_version < '3.8' - - greenlet>=1 ; extra == 'aiomysql' - - aiomysql>=0.2.0 ; extra == 'aiomysql' - - greenlet>=1 ; extra == 'aioodbc' - - aioodbc ; extra == 'aioodbc' - - greenlet>=1 ; extra == 'aiosqlite' - - aiosqlite ; extra == 'aiosqlite' - - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' - - greenlet>=1 ; extra == 'asyncio' - - greenlet>=1 ; extra == 'asyncmy' - - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy' - - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector' - - pyodbc ; extra == 'mssql' - - pymssql ; extra == 'mssql-pymssql' - - pyodbc ; extra == 'mssql-pyodbc' - - mypy>=0.910 ; extra == 'mypy' - - mysqlclient>=1.4.0 ; extra == 'mysql' - - mysql-connector-python ; extra == 'mysql-connector' - - cx-oracle>=8 ; extra == 'oracle' - - oracledb>=1.0.1 ; extra == 'oracle-oracledb' - - psycopg2>=2.7 ; extra == 'postgresql' - - greenlet>=1 ; extra == 'postgresql-asyncpg' - - asyncpg ; extra == 'postgresql-asyncpg' - - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' - - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' - - psycopg2-binary ; extra == 'postgresql-psycopg2binary' - - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' - - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' - - pymysql ; extra == 'pymysql' - - sqlcipher3-binary ; extra == 'sqlcipher' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/8a/7b/b9e0eb7f9a15f2e82856603c728edf14c54a07c6738ab228e4f2de049338/sqlalchemy-2.0.46-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: sqlalchemy - version: 2.0.46 - sha256: 716be5bcabf327b6d5d265dbdc6213a01199be587224eb991ad0d37e83d728fd - requires_dist: - - typing-extensions>=4.6.0 - - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' - - importlib-metadata ; python_full_version < '3.8' - - greenlet>=1 ; extra == 'aiomysql' - - aiomysql>=0.2.0 ; extra == 'aiomysql' - - greenlet>=1 ; extra == 'aioodbc' - - aioodbc ; extra == 'aioodbc' - - greenlet>=1 ; extra == 'aiosqlite' - - aiosqlite ; extra == 'aiosqlite' - - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' - - greenlet>=1 ; extra == 'asyncio' - - greenlet>=1 ; extra == 'asyncmy' - - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy' - - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector' - - pyodbc ; extra == 'mssql' - - pymssql ; extra == 'mssql-pymssql' - - pyodbc ; extra == 'mssql-pyodbc' - - mypy>=0.910 ; extra == 'mypy' - - mysqlclient>=1.4.0 ; extra == 'mysql' - - mysql-connector-python ; extra == 'mysql-connector' - - cx-oracle>=8 ; extra == 'oracle' - - oracledb>=1.0.1 ; extra == 'oracle-oracledb' - - psycopg2>=2.7 ; extra == 'postgresql' - - greenlet>=1 ; extra == 'postgresql-asyncpg' - - asyncpg ; extra == 'postgresql-asyncpg' - - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' - - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' - - psycopg2-binary ; extra == 'postgresql-psycopg2binary' - - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' - - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' - - pymysql ; extra == 'pymysql' - - sqlcipher3-binary ; extra == 'sqlcipher' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/b6/c5/7ae467eeddb57260c8ce17a3a09f9f5edba35820fc022d7c55b7decd5d3a/starlette-0.44.0-py3-none-any.whl - name: starlette - version: 0.44.0 - sha256: 19edeb75844c16dcd4f9dd72f22f9108c1539f3fc9c4c88885654fef64f85aea - requires_dist: - - anyio>=3.4.0,<5 - - typing-extensions>=3.10.0 ; python_full_version < '3.10' - - httpx>=0.27.0,<0.29.0 ; extra == 'full' - - itsdangerous ; extra == 'full' - - jinja2 ; extra == 'full' - - python-multipart>=0.0.18 ; extra == 'full' - - pyyaml ; extra == 'full' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/9a/14/857d0734989f3d26f2f965b2e3f67568ea7a6e8a60cb9c1ed7f774b6d606/streamlit-1.40.1-py2.py3-none-any.whl - name: streamlit - version: 1.40.1 - sha256: b9d7a317a0cc88edd7857c7e07dde9cf95647d3ae51cbfa8a3db82fbb8a2990d - requires_dist: - - altair>=4.0,<6 - - blinker>=1.0.0,<2 - - cachetools>=4.0,<6 - - click>=7.0,<9 - - numpy>=1.20,<3 - - packaging>=20,<25 - - pandas>=1.4.0,<3 - - pillow>=7.1.0,<12 - - protobuf>=3.20,<6 - - pyarrow>=7.0 - - requests>=2.27,<3 - - rich>=10.14.0,<14 - - tenacity>=8.1.0,<10 - - toml>=0.10.1,<2 - - typing-extensions>=4.3.0,<5 - - gitpython>=3.0.7,!=3.1.19,<4 - - pydeck>=0.8.0b4,<1 - - tornado>=6.0.3,<7 - - watchdog>=2.1.5,<7 ; sys_platform != 'darwin' - - snowflake-snowpark-python[modin]>=1.17.0 ; python_full_version < '3.12' and extra == 'snowflake' - - snowflake-connector-python>=2.8.0 ; python_full_version < '3.12' and extra == 'snowflake' - requires_python: '>=3.8,!=3.9.7' -- pypi: https://files.pythonhosted.org/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl - name: sympy - version: 1.13.3 - sha256: 54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73 - requires_dist: - - mpmath>=1.1.0,<1.4 - - pytest>=7.1.0 ; extra == 'dev' - - hypothesis>=6.70.0 ; extra == 'dev' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl - name: tenacity - version: 9.0.0 - sha256: 93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539 - requires_dist: - - reno ; extra == 'doc' - - sphinx ; extra == 'doc' - - pytest ; extra == 'test' - - tornado>=4.5 ; extra == 'test' - - typeguard ; extra == 'test' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/44/71/f3e7c9b2ab67e28c572ab4e9d5fa3499e0d252650f96d8a3a03e26677f53/tensorboardX-2.6.2.2-py2.py3-none-any.whl - name: tensorboardx - version: 2.6.2.2 - sha256: 160025acbf759ede23fd3526ae9d9bfbfd8b68eb16c38a010ebe326dc6395db8 - requires_dist: - - numpy - - packaging - - protobuf>=3.20 -- pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl - name: threadpoolctl - version: 3.5.0 - sha256: 56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 - md5: 86bc20552bf46075e3d92b67f089172d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3284905 - timestamp: 1763054914403 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 - md5: a73d54a5abba6543cb2f0af1bfbd6851 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3125484 - timestamp: 1763055028377 -- pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - name: toml - version: 0.10.2 - sha256: 806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b - requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*' -- pypi: https://files.pythonhosted.org/packages/a9/71/45aac46b75742e08d2d6f9fc2b612223b5e36115b8b2ed673b23c21b5387/torch-2.4.1-cp38-cp38-manylinux1_x86_64.whl - name: torch - version: 2.4.1 - sha256: c99e1db4bf0c5347107845d715b4aa1097e601bdc36343d758963055e9599d93 - requires_dist: - - filelock - - typing-extensions>=4.8.0 - - sympy - - networkx - - jinja2 - - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-nccl-cu12==2.20.5 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - triton==3.0.0 ; python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux' - - opt-einsum>=3.3 ; extra == 'opt-einsum' - - optree>=0.11.0 ; extra == 'optree' - requires_python: '>=3.8.0' -- pypi: https://files.pythonhosted.org/packages/c4/88/4d9f66de5fe732462a2713c9931cab614d3fd6a9b5d9ee1f04768ad64daa/torch-2.4.1-cp38-none-macosx_11_0_arm64.whl - name: torch - version: 2.4.1 - sha256: 5fc1d4d7ed265ef853579caf272686d1ed87cebdcd04f2a498f800ffc53dab71 - requires_dist: - - filelock - - typing-extensions>=4.8.0 - - sympy - - networkx - - jinja2 - - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-nccl-cu12==2.20.5 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' - - triton==3.0.0 ; python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux' - - opt-einsum>=3.3 ; extra == 'opt-einsum' - - optree>=0.11.0 ; extra == 'optree' - requires_python: '>=3.8.0' -- pypi: https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: tornado - version: 6.4.2 - sha256: bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl - name: tornado - version: 6.4.2 - sha256: e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda - sha256: 5673b7104350a6998cb86cccf1d0058217d86950e8d6c927d8530606028edb1d - md5: 4085c9db273a148e149c03627350e22c - depends: - - colorama - - python >=3.7 - license: MPL-2.0 or MIT - purls: - - pkg:pypi/tqdm?source=hash-mapping - size: 89484 - timestamp: 1732497312317 -- pypi: https://files.pythonhosted.org/packages/4d/b4/c37e2776a1390bab7e78a6d52bd525441cb3cad7260a6a00b11b0b702e7c/triton-3.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: triton - version: 3.0.0 - sha256: bcbf3b1c48af6a28011a5c40a5b3b9b5330530c3827716b5fbf6d7adcc1e53e9 - requires_dist: - - filelock - - cmake>=3.20 ; extra == 'build' - - lit ; extra == 'build' - - autopep8 ; extra == 'tests' - - flake8 ; extra == 'tests' - - isort ; extra == 'tests' - - numpy ; extra == 'tests' - - pytest ; extra == 'tests' - - scipy>=1.7.1 ; extra == 'tests' - - llnl-hatchet ; extra == 'tests' - - matplotlib ; extra == 'tutorials' - - pandas ; extra == 'tutorials' - - tabulate ; extra == 'tutorials' -- pypi: https://files.pythonhosted.org/packages/ea/07/0055bb513de2b7cf23b2bfc7eeeb6a6ae6ff7b287e2a62ab80cf403d61e9/typed_argument_parser-1.10.1-py3-none-any.whl - name: typed-argument-parser - version: 1.10.1 - sha256: 152cad218c84f23d9d4cbbfcb153a1a53fa0b330f0f7a4b85190dd4cb86f0c0a - requires_dist: - - docstring-parser>=0.15 - - packaging - - typing-inspect>=0.7.1 - - typed-argument-parser[dev-no-pydantic] ; extra == 'dev' - - pydantic>=2.5.0 ; extra == 'dev' - - pytest ; extra == 'dev-no-pydantic' - - pytest-cov ; extra == 'dev-no-pydantic' - - flake8 ; extra == 'dev-no-pydantic' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda - sha256: da9ff9e27c5fa8268c2d5898335485a897d9496eef3b5b446cd9387a89d168de - md5: be70216cc1a5fe502c849676baabf498 - depends: - - python >=3.7 - - typer-slim-standard 0.12.5 hd8ed1ab_0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/typer?source=hash-mapping - size: 53350 - timestamp: 1724613663049 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda - sha256: 7be1876627495047f3f07c52c93ddc2ae2017b93affe58110a5474e5ebcb2662 - md5: a46aa56c0ca7cc2bd38baffc2686f0a6 - depends: - - click >=8.0.0 - - python >=3.7 - - typing_extensions >=3.7.4.3 - constrains: - - rich >=10.11.0 - - typer >=0.12.5,<0.12.6.0a0 - - shellingham >=1.3.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/typer-slim?source=hash-mapping - size: 45641 - timestamp: 1724613646022 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda - sha256: bb298b116159ec1085f6b29eaeb982006651a0997eda08de8b70cfb6177297f3 - md5: 2dc1ee4046de0692077e9aa9ba351d36 - depends: - - rich - - shellingham - - typer-slim 0.12.5 pyhd8ed1ab_0 - license: MIT - license_family: MIT - purls: [] - size: 46817 - timestamp: 1724613648907 -- pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl - name: typing-inspect - version: 0.9.0 - sha256: 9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f - requires_dist: - - mypy-extensions>=0.3.0 - - typing-extensions>=3.7.4 - - typing>=3.7.4 ; python_full_version < '3.5' -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - sha256: 0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb - md5: ebe6952715e1d5eb567eeebf25250fa7 - depends: - - python >=3.8 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/typing-extensions?source=hash-mapping - size: 39888 - timestamp: 1717802653893 -- pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl - name: tzdata - version: '2025.3' - sha256: 06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 - requires_python: '>=2' -- pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - name: urllib3 - version: 2.2.3 - sha256: ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac - requires_dist: - - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' - - h2>=4,<5 ; extra == 'h2' - - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' - - zstandard>=0.18.0 ; extra == 'zstd' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/98/79/2e2620337ef1e4ef7a058b351603b765f59ac28e6e3ac7c5e7cdee9ea1ab/uvicorn-0.33.0-py3-none-any.whl - name: uvicorn - version: 0.33.0 - sha256: 2c30de4aeea83661a520abab179b24084a0019c0c1bbe137e5409f741cbde5f8 - requires_dist: - - click>=7.0 - - h11>=0.8 - - typing-extensions>=4.0 ; python_full_version < '3.11' - - colorama>=0.4 ; sys_platform == 'win32' and extra == 'standard' - - httptools>=0.6.3 ; extra == 'standard' - - python-dotenv>=0.13 ; extra == 'standard' - - pyyaml>=5.1 ; extra == 'standard' - - uvloop>=0.14.0,!=0.15.0,!=0.15.1 ; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32' and extra == 'standard' - - watchfiles>=0.13 ; extra == 'standard' - - websockets>=10.4 ; extra == 'standard' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/01/d2/c8931ff840a7e5bd5dcb93f2bb2a1fd18faf8312e9f7f53ff1cf76ecc8ed/watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl - name: watchdog - version: 4.0.2 - sha256: c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8 - requires_dist: - - pyyaml>=3.10 ; extra == 'watchmedo' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/fd/21/0a674dfe66e9df9072c46269c882e9f901d36d987d8ea50ead033a9c1e01/werkzeug-2.3.8-py3-none-any.whl - name: werkzeug - version: 2.3.8 - sha256: bba1f19f8ec89d4d607a3bd62f1904bd2e609472d93cd85e9d4e178f472c3748 - requires_dist: - - markupsafe>=2.1.1 - - watchdog>=2.3 ; extra == 'watchdog' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda - sha256: 24f6851a336a50c53d6b50b142c1654872494a62528d57c3ff40240cbd8b13be - md5: bdb2f437ce62fd2f1fef9119a37a12d9 - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/wheel?source=hash-mapping - size: 62998 - timestamp: 1732339880578 -- pypi: https://files.pythonhosted.org/packages/b4/a7/897f484225bd8e179a4f39f8e9a4ca26c14e9f7055b495384b1d56e1382d/xarray-2023.1.0-py3-none-any.whl - name: xarray - version: 2023.1.0 - sha256: 7e530b1deafdd43e5c2b577d0944e6b528fbe88045fd849e49a8d11871ecd522 - requires_dist: - - numpy>=1.20 - - pandas>=1.3 - - packaging>=21.3 - - scipy ; extra == 'accel' - - bottleneck ; extra == 'accel' - - numbagg ; extra == 'accel' - - flox ; extra == 'accel' - - netcdf4 ; extra == 'complete' - - h5netcdf ; extra == 'complete' - - scipy ; extra == 'complete' - - zarr ; extra == 'complete' - - fsspec ; extra == 'complete' - - cftime ; extra == 'complete' - - rasterio ; extra == 'complete' - - cfgrib ; extra == 'complete' - - pooch ; extra == 'complete' - - bottleneck ; extra == 'complete' - - numbagg ; extra == 'complete' - - flox ; extra == 'complete' - - dask[complete] ; extra == 'complete' - - matplotlib ; extra == 'complete' - - seaborn ; extra == 'complete' - - nc-time-axis ; extra == 'complete' - - pydap ; python_full_version < '3.10' and extra == 'complete' - - netcdf4 ; extra == 'docs' - - h5netcdf ; extra == 'docs' - - scipy ; extra == 'docs' - - zarr ; extra == 'docs' - - fsspec ; extra == 'docs' - - cftime ; extra == 'docs' - - rasterio ; extra == 'docs' - - cfgrib ; extra == 'docs' - - pooch ; extra == 'docs' - - bottleneck ; extra == 'docs' - - numbagg ; extra == 'docs' - - flox ; extra == 'docs' - - dask[complete] ; extra == 'docs' - - matplotlib ; extra == 'docs' - - seaborn ; extra == 'docs' - - nc-time-axis ; extra == 'docs' - - sphinx-autosummary-accessors ; extra == 'docs' - - sphinx-rtd-theme ; extra == 'docs' - - ipython ; extra == 'docs' - - ipykernel ; extra == 'docs' - - jupyter-client ; extra == 'docs' - - nbsphinx ; extra == 'docs' - - scanpydoc ; extra == 'docs' - - pydap ; python_full_version < '3.10' and extra == 'docs' - - netcdf4 ; extra == 'io' - - h5netcdf ; extra == 'io' - - scipy ; extra == 'io' - - zarr ; extra == 'io' - - fsspec ; extra == 'io' - - cftime ; extra == 'io' - - rasterio ; extra == 'io' - - cfgrib ; extra == 'io' - - pooch ; extra == 'io' - - pydap ; python_full_version < '3.10' and extra == 'io' - - dask[complete] ; extra == 'parallel' - - matplotlib ; extra == 'viz' - - seaborn ; extra == 'viz' - - nc-time-axis ; extra == 'viz' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.1-hbcc6ac9_2.conda - sha256: 802725371682ea06053971db5b4fb7fbbcaee9cb1804ec688f55e51d74660617 - md5: 68eae977d7d1196d32b636a026dc015d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - liblzma 5.8.1 hb9d3cd8_2 - - liblzma-devel 5.8.1 hb9d3cd8_2 - - xz-gpl-tools 5.8.1 hbcc6ac9_2 - - xz-tools 5.8.1 hb9d3cd8_2 - license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later - purls: [] - size: 23987 - timestamp: 1749230104359 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.8.1-h9a6d368_2.conda - sha256: afb747cf017b67cc31d54c6e6c4bd1b1e179fe487a3d23a856232ed7fd0b099b - md5: 39435c82e5a007ef64cbb153ecc40cfd - depends: - - __osx >=11.0 - - liblzma 5.8.1 h39f12f2_2 - - liblzma-devel 5.8.1 h39f12f2_2 - - xz-gpl-tools 5.8.1 h9a6d368_2 - - xz-tools 5.8.1 h39f12f2_2 - license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later - purls: [] - size: 23995 - timestamp: 1749230346887 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.1-hbcc6ac9_2.conda - sha256: 840838dca829ec53f1160f3fca6dbfc43f2388b85f15d3e867e69109b168b87b - md5: bf627c16aa26231720af037a2709ab09 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - liblzma 5.8.1 hb9d3cd8_2 - constrains: - - xz 5.8.1.* - license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later - purls: [] - size: 33911 - timestamp: 1749230090353 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.8.1-h9a6d368_2.conda - sha256: a0790cfb48d240e7b655b0d797a00040219cf39e3ee38e2104e548515df4f9c2 - md5: 09b1442c1d49ac7c5f758c44695e77d1 - depends: - - __osx >=11.0 - - liblzma 5.8.1 h39f12f2_2 - constrains: - - xz 5.8.1.* - license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later - purls: [] - size: 34103 - timestamp: 1749230329933 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.1-hb9d3cd8_2.conda - sha256: 58034f3fca491075c14e61568ad8b25de00cb3ae479de3e69be6d7ee5d3ace28 - md5: 1bad2995c8f1c8075c6c331bf96e46fb - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - liblzma 5.8.1 hb9d3cd8_2 - constrains: - - xz 5.8.1.* - license: 0BSD AND LGPL-2.1-or-later - purls: [] - size: 96433 - timestamp: 1749230076687 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.8.1-h39f12f2_2.conda - sha256: 9d1232705e3d175f600dc8e344af9182d0341cdaa73d25330591a28532951063 - md5: 37996935aa33138fca43e4b4563b6a28 - depends: - - __osx >=11.0 - - liblzma 5.8.1 h39f12f2_2 - constrains: - - xz 5.8.1.* - license: 0BSD AND LGPL-2.1-or-later - purls: [] - size: 86425 - timestamp: 1749230316106 -- pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl - name: zipp - version: 3.20.2 - sha256: a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 - requires_dist: - - pytest-checkdocs>=2.4 ; extra == 'check' - - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' - - pytest-cov ; extra == 'cover' - - sphinx>=3.5 ; extra == 'doc' - - jaraco-packaging>=9.3 ; extra == 'doc' - - rst-linker>=1.9 ; extra == 'doc' - - furo ; extra == 'doc' - - sphinx-lint ; extra == 'doc' - - jaraco-tidelift>=1.4 ; extra == 'doc' - - pytest-enabler>=2.2 ; extra == 'enabler' - - pytest>=6,!=8.1.* ; extra == 'test' - - jaraco-itertools ; extra == 'test' - - jaraco-functools ; extra == 'test' - - more-itertools ; extra == 'test' - - big-o ; extra == 'test' - - pytest-ignore-flaky ; extra == 'test' - - jaraco-test ; extra == 'test' - - importlib-resources ; python_full_version < '3.9' and extra == 'test' - - pytest-mypy ; extra == 'type' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 - md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 - depends: - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 601375 - timestamp: 1764777111296 +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py38h578d9bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.8.20-h4a871b0_2_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.12-h4196e79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.1-hbcc6ac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.1-hbcc6ac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - pypi: https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/52/4a86a4fa1cc2aae79137cc9510b7080c3e5aede2310d14fae5486feec7f7/altair-5.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/76/b21bfd2c35cab2e9a4b68b1977f7488c246c8cffa31e3361ee7610e8b5af/captum-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bf/fa/cf5bb2409a385f78750e78c8d2e24780964976acdaaed65dbd6083ae5b40/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a0/ad/72361203906e2dbe9baa776c64e9246d555b516808dd0cce385f07f4cf71/chemprop-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/71/7f20855592cc929bc206810432b991ec4c702dc26b0567b132e52c85536f/contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/15/1a/c6eae628480aa1fc5f6f85437c7d8ec0d1172597acd1c61182202a902c0f/cramjam-2.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/3c/67bfc03db3f6527a54a0f9b696809bca55eb6de27928829218ab7e6c40e7/descriptastorus-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/57/aa70121b5008f44031be645a61a7c4abc24e0e888ad3fc8fda916f4d188e/fastapi-0.124.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a7/31/673a677c137d8b2429813f56be77986f44bcb43f5c113336a4c8347e0eb0/fastparquet-2024.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/6a/00d144ac1626fbb44c4ff36519712e258128985a5d0ae43344778ae5cbb9/Flask-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a5/0e/b6314a09a4d561aaa7e09de43fa700917be91e701f07df6178865962666c/fonttools-4.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d8/88/0ce16c0afb2d71d85562a7bcd9b092fec80a7767ab5b5f7e1bbbca8200f8/greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/cd/5b3334d39276067f54618ce0d0b48ed69d91352fbf137468c7095170d0e5/hyperopt-0.2.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/6a/4604f9ae2fa62ef47b9de2fa5ad599589d28c9fd1d335f32759813dfa91e/importlib_resources-6.4.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/36/ae40d7a3171e06f55ac77fe5536079e7be1d8be2a8210e08975c7f9b4d54/kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/33/cc27211d2ffeee4fd7402dca137b6e8a83f6dcae3d4be8d0ad5068555561/matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/3f/8d450588206b437dd239a6d44230c63095e71135bd95d5a74347d07adbd5/narwhals-1.42.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/05/9d4f9b78ead6b2661d6e8ea772e111fc4a9fbd866ad0c81906c11206b55e/networkx-3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/98/5d/5738903efe0ecb73e51eb44feafba32bdba2081263d40c5043568ff60faf/numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/eb/d5/c68b1d2cdfcc59e72e8a5949a37ddb22ae6cade80cd4a57a84d4c8b55472/nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/86/94/eb540db023ce1d162e7bea9f8f5aa781d57c65aed513c33ee9a5123ead4d/nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/44/31/4890b1c9abc496303412947fc7dcea3d14861720642b49e8ceed89636705/nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/d3/8057f0587683ed2fcd4dbfbdfdfa807b9160b809976099d36b8f60d08f03/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/12/cba81286cbaf0f0c3f0473846cfd992cb240bdcea816bf2ef7de8ed0f744/optuna-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/7f/5b047effafbdd34e52c9e2d7e44f729a0655efafb22198c45cf692cdc157/pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5d/e6/71ed4d95676098159b533c4a4c424cf453fec9614edaff1a0633fe228eef/pandas_flavor-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/ad/435fe29865f98a8fbdc64add8875a6e4f8c97749a93577a8919ec6f32c64/pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bd/db/ea0203e495be491c85af87b66e37acfd3bf756fd985f87e46fc5e3bf022c/py4j-0.10.9.9-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/c1/4c6bcdf7a820034aa91a8b4d25fef38809be79b42ca7aaa16d4680b0bbac/pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f7/a3/5f19bc495793546825ab160e530330c2afcee2281c02b5ffafd0b32ac05e/pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/25/a2/b725b61ac76a75583ae7104b3209f75ea44b13cfd026aa535ece22b7f22e/PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3d/84/63b2e66f5c7cb97ce994769afbbef85a1ac364fedbcb7d4a3c0f15d318a5/rdkit-2024.3.5-cp38-cp38-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/ce/af016c81fda833bf125b20d1677d816f230cad2ab189f46bcbfea3c7a375/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3f/48/6fdd99f5717045f9984616b5c2ec683d6286d30c0ac234563062132b83ab/scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/69/f0/fb07a9548e48b687b8bf2fa81d71aba9cfc548d365046ca1c791e24db99d/scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/c7/b5c8015d823bfda1a346adb2c634a2101d50bb75d421eb6dcb31acd25ebc/sphinx_rtd_theme-3.1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/7b/b9e0eb7f9a15f2e82856603c728edf14c54a07c6738ab228e4f2de049338/sqlalchemy-2.0.46-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b6/c5/7ae467eeddb57260c8ce17a3a09f9f5edba35820fc022d7c55b7decd5d3a/starlette-0.44.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/14/857d0734989f3d26f2f965b2e3f67568ea7a6e8a60cb9c1ed7f774b6d606/streamlit-1.40.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/71/f3e7c9b2ab67e28c572ab4e9d5fa3499e0d252650f96d8a3a03e26677f53/tensorboardX-2.6.2.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a9/71/45aac46b75742e08d2d6f9fc2b612223b5e36115b8b2ed673b23c21b5387/torch-2.4.1-cp38-cp38-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/b4/c37e2776a1390bab7e78a6d52bd525441cb3cad7260a6a00b11b0b702e7c/triton-3.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ea/07/0055bb513de2b7cf23b2bfc7eeeb6a6ae6ff7b287e2a62ab80cf403d61e9/typed_argument_parser-1.10.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/98/79/2e2620337ef1e4ef7a058b351603b765f59ac28e6e3ac7c5e7cdee9ea1ab/uvicorn-0.33.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/01/d2/c8931ff840a7e5bd5dcb93f2bb2a1fd18faf8312e9f7f53ff1cf76ecc8ed/watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fd/21/0a674dfe66e9df9072c46269c882e9f901d36d987d8ea50ead033a9c1e01/werkzeug-2.3.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/a7/897f484225bd8e179a4f39f8e9a4ca26c14e9f7055b495384b1d56e1382d/xarray-2023.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl + - pypi: . + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/loguru-0.7.2-py38h10201cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.8.20-h7d35d02_2_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.14.12-hb0cad00_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.8.1-h9a6d368_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.8.1-h9a6d368_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.8.1-h39f12f2_2.conda + - pypi: https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/52/4a86a4fa1cc2aae79137cc9510b7080c3e5aede2310d14fae5486feec7f7/altair-5.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/76/b21bfd2c35cab2e9a4b68b1977f7488c246c8cffa31e3361ee7610e8b5af/captum-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/4e/3926a1c11f0433791985727965263f788af00db3482d89a7545ca5ecc921/charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/a0/ad/72361203906e2dbe9baa776c64e9246d555b516808dd0cce385f07f4cf71/chemprop-1.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a6/82/29f5ff4ae074c3230e266bc9efef449ebde43721a727b989dd8ef8f97d73/contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/65/64/e34ee535519fd14cde3a7f3f8cd3b4ef54483b9df655e4180437eb884aab/cramjam-2.11.0-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/3c/67bfc03db3f6527a54a0f9b696809bca55eb6de27928829218ab7e6c40e7/descriptastorus-2.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/57/aa70121b5008f44031be645a61a7c4abc24e0e888ad3fc8fda916f4d188e/fastapi-0.124.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/8e/ce64bc647728ee26bfffa9987fb375e7c99bba54b632404bc0d61b6e9fc2/fastparquet-2024.2.0-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/6a/00d144ac1626fbb44c4ff36519712e258128985a5d0ae43344778ae5cbb9/Flask-2.1.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/3f/c16dbbec7221783f37dcc2022d5a55f0d704ffc9feef67930f6eb517e8ce/fonttools-4.57.0-cp38-cp38-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/cd/5b3334d39276067f54618ce0d0b48ed69d91352fbf137468c7095170d0e5/hyperopt-0.2.7-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e1/6a/4604f9ae2fa62ef47b9de2fa5ad599589d28c9fd1d335f32759813dfa91e/importlib_resources-6.4.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/a7/bb8ab10e12cc8764f4da0245d72dee4731cc720bdec0f085d5e9c6005b98/kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/aa/59/4d13e5b6298b1ca5525eea8c68d3806ae93ab6d0bb17ca9846aa3156b92b/matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/3f/8d450588206b437dd239a6d44230c63095e71135bd95d5a74347d07adbd5/narwhals-1.42.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a8/05/9d4f9b78ead6b2661d6e8ea772e111fc4a9fbd866ad0c81906c11206b55e/networkx-3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a7/ae/f53b7b265fdc701e663fbb322a8e9d4b14d9cb7b2385f45ddfabfc4327e4/numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/12/cba81286cbaf0f0c3f0473846cfd992cb240bdcea816bf2ef7de8ed0f744/optuna-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/c3/f8e87361f7fdf42012def602bfa2a593423c729f5cb7c97aed7f51be66ac/pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/5d/e6/71ed4d95676098159b533c4a4c424cf453fec9614edaff1a0633fe228eef/pandas_flavor-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/43/105823d233c5e5d31cea13428f4474ded9d961652307800979a59d6a4276/pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/bd/db/ea0203e495be491c85af87b66e37acfd3bf756fd985f87e46fc5e3bf022c/py4j-0.10.9.9-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/d9/51e35550f2f18b8815a2ab25948f735434db32000c0e91eba3a32634782a/pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/20/26c549249769ed84877f862f7bb93f89a6ee08b4bee1ed8781616b7fbb5e/pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz + - pypi: https://files.pythonhosted.org/packages/bf/cb/c709b60f4815e18c00e1e8639204bdba04cb158e6278791d82f94f51a988/rdkit-2024.3.5-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/63/47d34dc4ddb3da73e78e10c9009dcf8edc42d355a221351c05c822c2a50b/rpds_py-0.20.1-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a4/62/92e9cec3deca8b45abf62dd8f6469d688b3f28b9c170809fcc46f110b523/scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/93/4a/50c436de1353cce8b66b26e49a687f10b91fe7465bf34e4565d810153003/scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/c7/b5c8015d823bfda1a346adb2c634a2101d50bb75d421eb6dcb31acd25ebc/sphinx_rtd_theme-3.1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/07/d4/76b9618d7eb1e6a3c26734e1186f8ad7869e4426b1ea7dc425bc4c832e67/sqlalchemy-2.0.46-cp38-cp38-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b6/c5/7ae467eeddb57260c8ce17a3a09f9f5edba35820fc022d7c55b7decd5d3a/starlette-0.44.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/14/857d0734989f3d26f2f965b2e3f67568ea7a6e8a60cb9c1ed7f774b6d606/streamlit-1.40.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/71/f3e7c9b2ab67e28c572ab4e9d5fa3499e0d252650f96d8a3a03e26677f53/tensorboardX-2.6.2.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/88/4d9f66de5fe732462a2713c9931cab614d3fd6a9b5d9ee1f04768ad64daa/torch-2.4.1-cp38-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/ea/07/0055bb513de2b7cf23b2bfc7eeeb6a6ae6ff7b287e2a62ab80cf403d61e9/typed_argument_parser-1.10.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/98/79/2e2620337ef1e4ef7a058b351603b765f59ac28e6e3ac7c5e7cdee9ea1ab/uvicorn-0.33.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/21/0a674dfe66e9df9072c46269c882e9f901d36d987d8ea50ead033a9c1e01/werkzeug-2.3.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/a7/897f484225bd8e179a4f39f8e9a4ca26c14e9f7055b495384b1d56e1382d/xarray-2023.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl + - pypi: . +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- pypi: https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl + name: alabaster + version: 0.7.13 + sha256: 1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/54/7e/ac0991d1745f7d755fc1cd381b3990a45b404b4d008fc75e2a983516fbfe/alembic-1.14.1-py3-none-any.whl + name: alembic + version: 1.14.1 + sha256: 1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5 + requires_dist: + - sqlalchemy>=1.3.0 + - mako + - importlib-metadata ; python_full_version < '3.9' + - importlib-resources ; python_full_version < '3.9' + - typing-extensions>=4 + - backports-zoneinfo ; python_full_version < '3.9' and extra == 'tz' + - tzdata ; extra == 'tz' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/9b/52/4a86a4fa1cc2aae79137cc9510b7080c3e5aede2310d14fae5486feec7f7/altair-5.4.1-py3-none-any.whl + name: altair + version: 5.4.1 + sha256: 0fb130b8297a569d08991fb6fe763582e7569f8a04643bbd9212436e3be04aef + requires_dist: + - jinja2 + - jsonschema>=3.0 + - narwhals>=1.5.2 + - packaging + - typing-extensions>=4.10.0 ; python_full_version < '3.13' + - altair-tiles>=0.3.0 ; extra == 'all' + - anywidget>=0.9.0 ; extra == 'all' + - numpy ; extra == 'all' + - pandas>=0.25.3 ; extra == 'all' + - pyarrow>=11 ; extra == 'all' + - vega-datasets>=0.9.0 ; extra == 'all' + - vegafusion[embed]>=1.6.6 ; extra == 'all' + - vl-convert-python>=1.6.0 ; extra == 'all' + - geopandas ; extra == 'dev' + - hatch ; extra == 'dev' + - ibis-framework[polars] ; extra == 'dev' + - ipython[kernel] ; extra == 'dev' + - mistune ; extra == 'dev' + - mypy ; extra == 'dev' + - pandas-stubs ; extra == 'dev' + - pandas>=0.25.3 ; extra == 'dev' + - polars>=0.20.3 ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest-xdist[psutil]~=3.5 ; extra == 'dev' + - ruff>=0.6.0 ; extra == 'dev' + - types-jsonschema ; extra == 'dev' + - types-setuptools ; extra == 'dev' + - docutils ; extra == 'doc' + - jinja2 ; extra == 'doc' + - myst-parser ; extra == 'doc' + - numpydoc ; extra == 'doc' + - pillow>=9,<10 ; extra == 'doc' + - pydata-sphinx-theme>=0.14.1 ; extra == 'doc' + - scipy ; extra == 'doc' + - sphinx ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinxext-altair ; extra == 'doc' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl + name: annotated-doc + version: 0.0.4 + sha256: 571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + name: annotated-types + version: 0.7.0 + sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 + requires_dist: + - typing-extensions>=4.0.0 ; python_full_version < '3.9' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl + name: anyio + version: 4.5.2 + sha256: c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f + requires_dist: + - idna>=2.8 + - sniffio>=1.1 + - exceptiongroup>=1.0.2 ; python_full_version < '3.11' + - typing-extensions>=4.1 ; python_full_version < '3.11' + - packaging ; extra == 'doc' + - sphinx~=7.4 ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - sphinx-autodoc-typehints>=1.2.0 ; extra == 'doc' + - anyio[trio] ; extra == 'test' + - coverage[toml]>=7 ; extra == 'test' + - exceptiongroup>=1.2.0 ; extra == 'test' + - hypothesis>=4.0 ; extra == 'test' + - psutil>=5.9 ; extra == 'test' + - pytest>=7.0 ; extra == 'test' + - pytest-mock>=3.6.1 ; extra == 'test' + - trustme ; extra == 'test' + - uvloop>=0.21.0b1 ; platform_python_implementation == 'CPython' and sys_platform != 'win32' and extra == 'test' + - truststore>=0.9.1 ; python_full_version >= '3.10' and extra == 'test' + - trio>=0.26.1 ; extra == 'trio' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl + name: attrs + version: 25.3.0 + sha256: 427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3 + requires_dist: + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'benchmark' + - hypothesis ; extra == 'benchmark' + - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'benchmark' + - pympler ; extra == 'benchmark' + - pytest-codspeed ; extra == 'benchmark' + - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'benchmark' + - pytest-xdist[psutil] ; extra == 'benchmark' + - pytest>=4.3.0 ; extra == 'benchmark' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'cov' + - coverage[toml]>=5.3 ; extra == 'cov' + - hypothesis ; extra == 'cov' + - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'cov' + - pympler ; extra == 'cov' + - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'cov' + - pytest-xdist[psutil] ; extra == 'cov' + - pytest>=4.3.0 ; extra == 'cov' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'dev' + - hypothesis ; extra == 'dev' + - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'dev' + - pre-commit-uv ; extra == 'dev' + - pympler ; extra == 'dev' + - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'dev' + - pytest-xdist[psutil] ; extra == 'dev' + - pytest>=4.3.0 ; extra == 'dev' + - cogapp ; extra == 'docs' + - furo ; extra == 'docs' + - myst-parser ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-notfound-page ; extra == 'docs' + - sphinxcontrib-towncrier ; extra == 'docs' + - towncrier ; extra == 'docs' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests' + - hypothesis ; extra == 'tests' + - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'tests' + - pympler ; extra == 'tests' + - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'tests' + - pytest-xdist[psutil] ; extra == 'tests' + - pytest>=4.3.0 ; extra == 'tests' + - mypy>=1.11.1 ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' + - pytest-mypy-plugins ; python_full_version >= '3.10' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl + name: babel + version: 2.17.0 + sha256: 4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 + requires_dist: + - pytz>=2015.7 ; python_full_version < '3.9' + - tzdata ; sys_platform == 'win32' and extra == 'dev' + - backports-zoneinfo ; python_full_version < '3.9' and extra == 'dev' + - freezegun~=1.0 ; extra == 'dev' + - jinja2>=3.0 ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest>=6.0 ; extra == 'dev' + - pytz ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl + name: blinker + version: 1.8.2 + sha256: 1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01 + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260341 + timestamp: 1757437258798 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 125061 + timestamp: 1757437486465 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 + md5: bddacf101bb4dd0e51811cb69c7790e2 + depends: + - __unix + license: ISC + purls: [] + size: 146519 + timestamp: 1767500828366 +- pypi: https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl + name: cachetools + version: 5.5.2 + sha256: d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/e1/76/b21bfd2c35cab2e9a4b68b1977f7488c246c8cffa31e3361ee7610e8b5af/captum-0.7.0-py3-none-any.whl + name: captum + version: 0.7.0 + sha256: 2cbec9aa4b6ec325c2fdf369c1fdabb011017122e2314e2af009496d53a0757c + requires_dist: + - matplotlib + - numpy + - torch>=1.6 + - tqdm + - flask ; extra == 'dev' + - ipython ; extra == 'dev' + - ipywidgets ; extra == 'dev' + - jupyter ; extra == 'dev' + - flask-compress ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - parameterized ; extra == 'dev' + - black==22.3.0 ; extra == 'dev' + - flake8 ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-autodoc-typehints ; extra == 'dev' + - sphinxcontrib-katex ; extra == 'dev' + - mypy>=0.760 ; extra == 'dev' + - usort==1.0.2 ; extra == 'dev' + - ufmt ; extra == 'dev' + - scikit-learn ; extra == 'dev' + - annoy ; extra == 'dev' + - flask ; extra == 'insights' + - ipython ; extra == 'insights' + - ipywidgets ; extra == 'insights' + - jupyter ; extra == 'insights' + - flask-compress ; extra == 'insights' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - parameterized ; extra == 'test' + - flask ; extra == 'tutorials' + - ipython ; extra == 'tutorials' + - ipywidgets ; extra == 'tutorials' + - jupyter ; extra == 'tutorials' + - flask-compress ; extra == 'tutorials' + - torchtext ; extra == 'tutorials' + - torchvision ; extra == 'tutorials' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl + name: certifi + version: 2026.1.4 + sha256: 9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/0a/4e/3926a1c11f0433791985727965263f788af00db3482d89a7545ca5ecc921/charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl + name: charset-normalizer + version: 3.4.4 + sha256: ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/bf/fa/cf5bb2409a385f78750e78c8d2e24780964976acdaaed65dbd6083ae5b40/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: charset-normalizer + version: 3.4.4 + sha256: f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/a0/ad/72361203906e2dbe9baa776c64e9246d555b516808dd0cce385f07f4cf71/chemprop-1.7.0-py3-none-any.whl + name: chemprop + version: 1.7.0 + sha256: 1f6d691c3d0a552d80bf7639960bbae3d90729583ee23c25f8e7250f6a90c259 + requires_dist: + - flask>=1.1.2,<=2.1.3 + - werkzeug<3 + - hyperopt>=0.2.3 + - matplotlib>=3.1.3 + - numpy>=1.18.1 + - pandas>=1.0.3 + - pandas-flavor>=0.2.0 + - scikit-learn>=0.22.2.post1 + - sphinx>=3.1.2 + - sphinx-rtd-theme>=2.0.0 + - tensorboardx>=2.0 + - torch>=1.4.0 + - tqdm>=4.45.0 + - typed-argument-parser>=1.6.1 + - rdkit>=2020.3.1.0 + - scipy<1.11 ; python_full_version == '3.7.*' + - descriptastorus<2.6.1 ; python_full_version == '3.7.*' + - scipy>=1.9 ; python_full_version == '3.8.*' + - descriptastorus>=2.6.1 ; python_full_version == '3.8.*' + - pytest>=6.2.2 ; extra == 'test' + - parameterized>=0.8.1 ; extra == 'test' + requires_python: '>=3.7,<3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + md5: f3ad426304898027fc619827ff428eca + depends: + - __unix + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84437 + timestamp: 1692311973840 +- pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl + name: cloudpickle + version: 3.1.2 + sha256: 9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 25170 + timestamp: 1666700778190 +- pypi: https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl + name: colorlog + version: 6.10.1 + sha256: 2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c + requires_dist: + - colorama ; sys_platform == 'win32' + - black ; extra == 'development' + - flake8 ; extra == 'development' + - mypy ; extra == 'development' + - pytest ; extra == 'development' + - types-colorama ; extra == 'development' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/8e/71/7f20855592cc929bc206810432b991ec4c702dc26b0567b132e52c85536f/contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: contourpy + version: 1.1.1 + sha256: 41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8 + requires_dist: + - numpy>=1.16,<2.0 ; python_full_version < '3.12' + - numpy>=1.26.0rc1,<2.0 ; python_full_version >= '3.12' + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.4.1 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/a6/82/29f5ff4ae074c3230e266bc9efef449ebde43721a727b989dd8ef8f97d73/contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl + name: contourpy + version: 1.1.1 + sha256: 8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9 + requires_dist: + - numpy>=1.16,<2.0 ; python_full_version < '3.12' + - numpy>=1.26.0rc1,<2.0 ; python_full_version >= '3.12' + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.4.1 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/15/1a/c6eae628480aa1fc5f6f85437c7d8ec0d1172597acd1c61182202a902c0f/cramjam-2.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: cramjam + version: 2.11.0 + sha256: f6a32313a5fdbc4fc4fd681a1895d55ee4bf81275e88638b1643b54ecf850cbe + requires_dist: + - black==22.3.0 ; extra == 'dev' + - numpy ; extra == 'dev' + - pytest>=5.30 ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - pytest-benchmark ; extra == 'dev' + - hypothesis==6.60.0 ; extra == 'dev' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/65/64/e34ee535519fd14cde3a7f3f8cd3b4ef54483b9df655e4180437eb884aab/cramjam-2.11.0-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + name: cramjam + version: 2.11.0 + sha256: bf81b2e517baadf41eb85c4762ae596dd1dd2c852988ce86a2df6aa7e31d9228 + requires_dist: + - black==22.3.0 ; extra == 'dev' + - numpy ; extra == 'dev' + - pytest>=5.30 ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - pytest-benchmark ; extra == 'dev' + - hypothesis==6.60.0 ; extra == 'dev' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + name: cycler + version: 0.12.1 + sha256: 85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 + requires_dist: + - ipython ; extra == 'docs' + - matplotlib ; extra == 'docs' + - numpydoc ; extra == 'docs' + - sphinx ; extra == 'docs' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7b/3c/67bfc03db3f6527a54a0f9b696809bca55eb6de27928829218ab7e6c40e7/descriptastorus-2.8.0-py3-none-any.whl + name: descriptastorus + version: 2.8.0 + sha256: cc0c8201d6d9d8534dc8a45ce629aeaf4cf1e62ba848b9b1e392b2600ca834dc + requires_dist: + - pandas-flavor + - rdkit + - scipy + - numpy +- pypi: https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl + name: docstring-parser + version: 0.17.0 + sha256: cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708 + requires_dist: + - pre-commit>=2.16.0 ; python_full_version >= '3.9' and extra == 'dev' + - pydoctor>=25.4.0 ; extra == 'dev' + - pytest ; extra == 'dev' + - pydoctor>=25.4.0 ; extra == 'docs' + - pytest ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl + name: docutils + version: 0.20.1 + sha256: 96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl + name: et-xmlfile + version: 2.0.0 + sha256: 7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl + name: exceptiongroup + version: 1.3.1 + sha256: a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 + requires_dist: + - typing-extensions>=4.6.0 ; python_full_version < '3.13' + - pytest>=6 ; extra == 'test' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/3e/57/aa70121b5008f44031be645a61a7c4abc24e0e888ad3fc8fda916f4d188e/fastapi-0.124.4-py3-none-any.whl + name: fastapi + version: 0.124.4 + sha256: 6d1e703698443ccb89e50abe4893f3c84d9d6689c0cf1ca4fad6d3c15cf69f15 + requires_dist: + - starlette>=0.40.0,<0.51.0 + - pydantic>=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 + - typing-extensions>=4.8.0 + - annotated-doc>=0.0.2 + - fastapi-cli[standard]>=0.0.8 ; extra == 'standard' + - httpx>=0.23.0,<1.0.0 ; extra == 'standard' + - jinja2>=3.1.5 ; extra == 'standard' + - python-multipart>=0.0.18 ; extra == 'standard' + - email-validator>=2.0.0 ; extra == 'standard' + - uvicorn[standard]>=0.12.0 ; extra == 'standard' + - fastapi-cli[standard-no-fastapi-cloud-cli]>=0.0.8 ; extra == 'standard-no-fastapi-cloud-cli' + - httpx>=0.23.0,<1.0.0 ; extra == 'standard-no-fastapi-cloud-cli' + - jinja2>=3.1.5 ; extra == 'standard-no-fastapi-cloud-cli' + - python-multipart>=0.0.18 ; extra == 'standard-no-fastapi-cloud-cli' + - email-validator>=2.0.0 ; extra == 'standard-no-fastapi-cloud-cli' + - uvicorn[standard]>=0.12.0 ; extra == 'standard-no-fastapi-cloud-cli' + - fastapi-cli[standard]>=0.0.8 ; extra == 'all' + - httpx>=0.23.0,<1.0.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - python-multipart>=0.0.18 ; extra == 'all' + - itsdangerous>=1.1.0 ; extra == 'all' + - pyyaml>=5.3.1 ; extra == 'all' + - ujson>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0 ; extra == 'all' + - orjson>=3.2.1 ; extra == 'all' + - email-validator>=2.0.0 ; extra == 'all' + - uvicorn[standard]>=0.12.0 ; extra == 'all' + - pydantic-settings>=2.0.0 ; extra == 'all' + - pydantic-extra-types>=2.0.0 ; extra == 'all' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/27/8e/ce64bc647728ee26bfffa9987fb375e7c99bba54b632404bc0d61b6e9fc2/fastparquet-2024.2.0-cp38-cp38-macosx_11_0_arm64.whl + name: fastparquet + version: 2024.2.0 + sha256: ee36f1ea8f08cb9b8710161eee4e752e74f34ef3e7aebc58db4e5468d29ff34c + requires_dist: + - pandas>=1.5.0 + - numpy>=1.20.3 + - cramjam>=2.3 + - fsspec + - packaging + - python-lzo ; extra == 'lzo' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/a7/31/673a677c137d8b2429813f56be77986f44bcb43f5c113336a4c8347e0eb0/fastparquet-2024.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: fastparquet + version: 2024.2.0 + sha256: 6509837887e35bdcb08ba252eeb930b1056e129b6d31c14901443339567ee95a + requires_dist: + - pandas>=1.5.0 + - numpy>=1.20.3 + - cramjam>=2.3 + - fsspec + - packaging + - python-lzo ; extra == 'lzo' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl + name: filelock + version: 3.16.1 + sha256: 2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0 + requires_dist: + - furo>=2024.8.6 ; extra == 'docs' + - sphinx-autodoc-typehints>=2.4.1 ; extra == 'docs' + - sphinx>=8.0.2 ; extra == 'docs' + - covdefaults>=2.3 ; extra == 'testing' + - coverage>=7.6.1 ; extra == 'testing' + - diff-cover>=9.2 ; extra == 'testing' + - pytest-asyncio>=0.24 ; extra == 'testing' + - pytest-cov>=5 ; extra == 'testing' + - pytest-mock>=3.14 ; extra == 'testing' + - pytest-timeout>=2.3.1 ; extra == 'testing' + - pytest>=8.3.3 ; extra == 'testing' + - virtualenv>=20.26.4 ; extra == 'testing' + - typing-extensions>=4.12.2 ; python_full_version < '3.11' and extra == 'typing' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/af/6a/00d144ac1626fbb44c4ff36519712e258128985a5d0ae43344778ae5cbb9/Flask-2.1.3-py3-none-any.whl + name: flask + version: 2.1.3 + sha256: 9013281a7402ad527f8fd56375164f3aa021ecfaff89bfe3825346c24f87e04c + requires_dist: + - werkzeug>=2.0 + - jinja2>=3.0 + - itsdangerous>=2.0 + - click>=8.0 + - importlib-metadata>=3.6.0 ; python_full_version < '3.10' + - asgiref>=3.2 ; extra == 'async' + - python-dotenv ; extra == 'dotenv' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/8a/3f/c16dbbec7221783f37dcc2022d5a55f0d704ffc9feef67930f6eb517e8ce/fonttools-4.57.0-cp38-cp38-macosx_10_9_universal2.whl + name: fonttools + version: 4.57.0 + sha256: 9d57b4e23ebbe985125d3f0cabbf286efa191ab60bbadb9326091050d88e8213 + requires_dist: + - fs>=2.2.0,<3 ; extra == 'all' + - lxml>=4.0 ; extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.23.0 ; extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml>=4.0 ; extra == 'lxml' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz>=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs>=2.2.0,<3 ; extra == 'ufo' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' + - zopfli>=0.1.4 ; extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/a5/0e/b6314a09a4d561aaa7e09de43fa700917be91e701f07df6178865962666c/fonttools-4.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: fonttools + version: 4.57.0 + sha256: a1968f2a2003c97c4ce6308dc2498d5fd4364ad309900930aa5a503c9851aec8 + requires_dist: + - fs>=2.2.0,<3 ; extra == 'all' + - lxml>=4.0 ; extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.23.0 ; extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml>=4.0 ; extra == 'lxml' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz>=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs>=2.2.0,<3 ; extra == 'ufo' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' + - zopfli>=0.1.4 ; extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl + name: fsspec + version: 2025.3.0 + sha256: efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3 + requires_dist: + - adlfs ; extra == 'abfs' + - adlfs ; extra == 'adl' + - pyarrow>=1 ; extra == 'arrow' + - dask ; extra == 'dask' + - distributed ; extra == 'dask' + - pre-commit ; extra == 'dev' + - ruff ; extra == 'dev' + - numpydoc ; extra == 'doc' + - sphinx ; extra == 'doc' + - sphinx-design ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - yarl ; extra == 'doc' + - dropbox ; extra == 'dropbox' + - dropboxdrivefs ; extra == 'dropbox' + - requests ; extra == 'dropbox' + - adlfs ; extra == 'full' + - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'full' + - dask ; extra == 'full' + - distributed ; extra == 'full' + - dropbox ; extra == 'full' + - dropboxdrivefs ; extra == 'full' + - fusepy ; extra == 'full' + - gcsfs ; extra == 'full' + - libarchive-c ; extra == 'full' + - ocifs ; extra == 'full' + - panel ; extra == 'full' + - paramiko ; extra == 'full' + - pyarrow>=1 ; extra == 'full' + - pygit2 ; extra == 'full' + - requests ; extra == 'full' + - s3fs ; extra == 'full' + - smbprotocol ; extra == 'full' + - tqdm ; extra == 'full' + - fusepy ; extra == 'fuse' + - gcsfs ; extra == 'gcs' + - pygit2 ; extra == 'git' + - requests ; extra == 'github' + - gcsfs ; extra == 'gs' + - panel ; extra == 'gui' + - pyarrow>=1 ; extra == 'hdfs' + - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'http' + - libarchive-c ; extra == 'libarchive' + - ocifs ; extra == 'oci' + - s3fs ; extra == 's3' + - paramiko ; extra == 'sftp' + - smbprotocol ; extra == 'smb' + - paramiko ; extra == 'ssh' + - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test' + - numpy ; extra == 'test' + - pytest ; extra == 'test' + - pytest-asyncio!=0.22.0 ; extra == 'test' + - pytest-benchmark ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-recording ; extra == 'test' + - pytest-rerunfailures ; extra == 'test' + - requests ; extra == 'test' + - aiobotocore>=2.5.4,<3.0.0 ; extra == 'test-downstream' + - dask[dataframe,test] ; extra == 'test-downstream' + - moto[server]>4,<5 ; extra == 'test-downstream' + - pytest-timeout ; extra == 'test-downstream' + - xarray ; extra == 'test-downstream' + - adlfs ; extra == 'test-full' + - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test-full' + - cloudpickle ; extra == 'test-full' + - dask ; extra == 'test-full' + - distributed ; extra == 'test-full' + - dropbox ; extra == 'test-full' + - dropboxdrivefs ; extra == 'test-full' + - fastparquet ; extra == 'test-full' + - fusepy ; extra == 'test-full' + - gcsfs ; extra == 'test-full' + - jinja2 ; extra == 'test-full' + - kerchunk ; extra == 'test-full' + - libarchive-c ; extra == 'test-full' + - lz4 ; extra == 'test-full' + - notebook ; extra == 'test-full' + - numpy ; extra == 'test-full' + - ocifs ; extra == 'test-full' + - pandas ; extra == 'test-full' + - panel ; extra == 'test-full' + - paramiko ; extra == 'test-full' + - pyarrow ; extra == 'test-full' + - pyarrow>=1 ; extra == 'test-full' + - pyftpdlib ; extra == 'test-full' + - pygit2 ; extra == 'test-full' + - pytest ; extra == 'test-full' + - pytest-asyncio!=0.22.0 ; extra == 'test-full' + - pytest-benchmark ; extra == 'test-full' + - pytest-cov ; extra == 'test-full' + - pytest-mock ; extra == 'test-full' + - pytest-recording ; extra == 'test-full' + - pytest-rerunfailures ; extra == 'test-full' + - python-snappy ; extra == 'test-full' + - requests ; extra == 'test-full' + - smbprotocol ; extra == 'test-full' + - tqdm ; extra == 'test-full' + - urllib3 ; extra == 'test-full' + - zarr ; extra == 'test-full' + - zstandard ; extra == 'test-full' + - tqdm ; extra == 'tqdm' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl + name: future + version: 1.0.0 + sha256: 929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216 + requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl + name: gitdb + version: 4.0.12 + sha256: 67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf + requires_dist: + - smmap>=3.0.1,<6 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl + name: gitpython + version: 3.1.46 + sha256: 79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058 + requires_dist: + - gitdb>=4.0.1,<5 + - typing-extensions>=3.10.0.2 ; python_full_version < '3.10' + - coverage[toml] ; extra == 'test' + - ddt>=1.1.1,!=1.4.3 ; extra == 'test' + - mock ; python_full_version < '3.8' and extra == 'test' + - mypy==1.18.2 ; python_full_version >= '3.9' and extra == 'test' + - pre-commit ; extra == 'test' + - pytest>=7.3.1 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-instafail ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-sugar ; extra == 'test' + - typing-extensions ; python_full_version < '3.11' and extra == 'test' + - sphinx>=7.1.2,<7.2 ; extra == 'doc' + - sphinx-rtd-theme ; extra == 'doc' + - sphinx-autodoc-typehints ; extra == 'doc' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/d8/88/0ce16c0afb2d71d85562a7bcd9b092fec80a7767ab5b5f7e1bbbca8200f8/greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: greenlet + version: 3.1.1 + sha256: 85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1 + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl + name: h11 + version: 0.16.0 + sha256: 63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl + name: httpcore + version: 1.0.9 + sha256: 2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 + requires_dist: + - certifi + - h11>=0.16 + - anyio>=4.0,<5.0 ; extra == 'asyncio' + - h2>=3,<5 ; extra == 'http2' + - socksio==1.* ; extra == 'socks' + - trio>=0.22.0,<1.0 ; extra == 'trio' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl + name: httpx + version: 0.28.1 + sha256: d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad + requires_dist: + - anyio + - certifi + - httpcore==1.* + - idna + - brotli ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'brotli' + - click==8.* ; extra == 'cli' + - pygments==2.* ; extra == 'cli' + - rich>=10,<14 ; extra == 'cli' + - h2>=3,<5 ; extra == 'http2' + - socksio==1.* ; extra == 'socks' + - zstandard>=0.18.0 ; extra == 'zstd' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b6/cd/5b3334d39276067f54618ce0d0b48ed69d91352fbf137468c7095170d0e5/hyperopt-0.2.7-py2.py3-none-any.whl + name: hyperopt + version: 0.2.7 + sha256: f3046d91fe4167dbf104365016596856b2524a609d22f047a066fc1ac796427c + requires_dist: + - numpy + - scipy + - six + - networkx>=2.2 + - future + - tqdm + - cloudpickle + - py4j + - lightgbm ; extra == 'atpe' + - scikit-learn ; extra == 'atpe' + - pymongo ; extra == 'mongotrials' + - pyspark ; extra == 'sparktrials' + - black ; extra == 'dev' + - pre-commit ; extra == 'dev' + - nose ; extra == 'dev' + - pytest ; extra == 'dev' +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 + md5: 186a18e3ba246eccfc7cff00cd19a870 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 12728445 + timestamp: 1767969922681 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda + sha256: d4cefbca587429d1192509edc52c88de52bc96c2447771ddc1f8bee928aed5ef + md5: 1e93aca311da0210e660d2247812fa02 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 12358010 + timestamp: 1767970350308 +- pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl + name: idna + version: '3.11' + sha256: 771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea + requires_dist: + - ruff>=0.6.2 ; extra == 'all' + - mypy>=1.11.2 ; extra == 'all' + - pytest>=8.3.2 ; extra == 'all' + - flake8>=7.1.1 ; extra == 'all' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl + name: imagesize + version: 1.4.1 + sha256: 0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- pypi: https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl + name: importlib-metadata + version: 8.5.0 + sha256: 45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b + requires_dist: + - zipp>=3.20 + - typing-extensions>=3.6.4 ; python_full_version < '3.8' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-enabler>=2.2 ; extra == 'enabler' + - ipython ; extra == 'perf' + - pytest>=6,!=8.1.* ; extra == 'test' + - packaging ; extra == 'test' + - pyfakefs ; extra == 'test' + - flufl-flake8 ; extra == 'test' + - pytest-perf>=0.9.2 ; extra == 'test' + - jaraco-test>=5.4 ; extra == 'test' + - importlib-resources>=1.3 ; python_full_version < '3.9' and extra == 'test' + - pytest-mypy ; extra == 'type' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e1/6a/4604f9ae2fa62ef47b9de2fa5ad599589d28c9fd1d335f32759813dfa91e/importlib_resources-6.4.5-py3-none-any.whl + name: importlib-resources + version: 6.4.5 + sha256: ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717 + requires_dist: + - zipp>=3.1.0 ; python_full_version < '3.10' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest>=6,!=8.1.* ; extra == 'test' + - zipp>=3.17 ; extra == 'test' + - jaraco-test>=5.4 ; extra == 'test' + - pytest-mypy ; extra == 'type' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl + name: itsdangerous + version: 2.2.0 + sha256: c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + name: jinja2 + version: 3.1.6 + sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl + name: joblib + version: 1.4.2 + sha256: 06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl + name: jsonschema + version: 4.23.0 + sha256: fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 + requires_dist: + - attrs>=22.2.0 + - importlib-resources>=1.4.0 ; python_full_version < '3.9' + - jsonschema-specifications>=2023.3.6 + - pkgutil-resolve-name>=1.3.10 ; python_full_version < '3.9' + - referencing>=0.28.4 + - rpds-py>=0.7.1 + - fqdn ; extra == 'format' + - idna ; extra == 'format' + - isoduration ; extra == 'format' + - jsonpointer>1.13 ; extra == 'format' + - rfc3339-validator ; extra == 'format' + - rfc3987 ; extra == 'format' + - uri-template ; extra == 'format' + - webcolors>=1.11 ; extra == 'format' + - fqdn ; extra == 'format-nongpl' + - idna ; extra == 'format-nongpl' + - isoduration ; extra == 'format-nongpl' + - jsonpointer>1.13 ; extra == 'format-nongpl' + - rfc3339-validator ; extra == 'format-nongpl' + - rfc3986-validator>0.1.0 ; extra == 'format-nongpl' + - uri-template ; extra == 'format-nongpl' + - webcolors>=24.6.0 ; extra == 'format-nongpl' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl + name: jsonschema-specifications + version: 2023.12.1 + sha256: 87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c + requires_dist: + - importlib-resources>=1.4.0 ; python_full_version < '3.9' + - referencing>=0.31.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/14/a7/bb8ab10e12cc8764f4da0245d72dee4731cc720bdec0f085d5e9c6005b98/kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl + name: kiwisolver + version: 1.4.7 + sha256: b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/76/36/ae40d7a3171e06f55ac77fe5536079e7be1d8be2a8210e08975c7f9b4d54/kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl + name: kiwisolver + version: 1.4.7 + sha256: a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda + sha256: 1027bd8aa0d5144e954e426ab6218fd5c14e54a98f571985675468b339c808ca + md5: 3ec0aa5037d39b06554109a01e6fb0c6 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 730831 + timestamp: 1766513089214 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + md5: 35f29eec58405aaf55e01cb470d8c26a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 57821 + timestamp: 1760295480630 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f + md5: 411ff7cd5d1472bba0f55c0faf04453b + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 40251 + timestamp: 1760295839166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda + sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 + md5: 6d0363467e6ed84f11435eb309f2ff06 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_16 + - libgomp 15.2.0 he0feb66_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1042798 + timestamp: 1765256792743 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda + sha256: 5f07f9317f596a201cc6e095e5fc92621afca64829785e483738d935f8cab361 + md5: 5a68259fac2da8f2ee6f7bfe49c9eb8b + depends: + - libgcc 15.2.0 he0feb66_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 27256 + timestamp: 1765256804124 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 + md5: 26c46f90d0e727e95c6c9498a33a09f3 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 603284 + timestamp: 1765256703881 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 112894 + timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 92286 + timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.1-hb9d3cd8_2.conda + sha256: 329e66330a8f9cbb6a8d5995005478188eb4ba8a6b6391affa849744f4968492 + md5: f61edadbb301530bd65a32646bd81552 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - liblzma 5.8.1 hb9d3cd8_2 + license: 0BSD + purls: [] + size: 439868 + timestamp: 1749230061968 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.8.1-h39f12f2_2.conda + sha256: 974804430e24f0b00f3a48b67ec10c9f5441c9bb3d82cc0af51ba45b8a75a241 + md5: 1201137f1a5ec9556032ffc04dcdde8d + depends: + - __osx >=11.0 + - liblzma 5.8.1 h39f12f2_2 + license: 0BSD + purls: [] + size: 116244 + timestamp: 1749230297170 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33731 + timestamp: 1750274110928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda + sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 + md5: da5be73701eecd0e8454423fd6ffcf30 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.2,<79.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 942808 + timestamp: 1768147973361 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + sha256: 6e9b9f269732cbc4698c7984aa5b9682c168e2a8d1e0406e1ff10091ca046167 + md5: 4b0bf313c53c3e89692f020fb55d5f2c + depends: + - __osx >=11.0 + - icu >=78.2,<79.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 909777 + timestamp: 1768148320535 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda + sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 + md5: 68f68355000ec3f1d6f26ea13e8f525f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_16 + constrains: + - libstdcxx-ng ==15.2.0=*_16 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 5856456 + timestamp: 1765256838573 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee + md5: db409b7c1720428638e7c0d509d3e1b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 40311 + timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- pypi: . + name: lnp-ml + version: 0.0.1 + sha256: 07282d62de3ae8b33614654c41729a9b7a300ddb70ce6a7cd53d61218c18f893 + requires_python: '>=3.8' + editable: true +- conda: https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py38h578d9bd_1.conda + sha256: 63bb68b6de508e7282b196b91ad980b3bc0f508073c9ed08fa85ecaf139f445a + md5: 7efdc20a45de05fd6237c1553c166941 + depends: + - python >=3.8,<3.9.0a0 + - python_abi 3.8.* *_cp38 + license: MIT + license_family: MIT + purls: + - pkg:pypi/loguru?source=hash-mapping + size: 97279 + timestamp: 1695547470382 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/loguru-0.7.2-py38h10201cd_1.conda + sha256: 21ff138566123e2ea085564dd8b78c37c96c0a8b0929351ab8a8979443808ff7 + md5: 9c9f9d27ed59f85fe6162ddf7207429f + depends: + - python >=3.8,<3.9.0a0 + - python >=3.8,<3.9.0a0 *_cpython + - python_abi 3.8.* *_cp38 + license: MIT + license_family: MIT + purls: + - pkg:pypi/loguru?source=hash-mapping + size: 97617 + timestamp: 1695547715271 +- pypi: https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl + name: mako + version: 1.3.10 + sha256: baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59 + requires_dist: + - markupsafe>=0.9.2 + - pytest ; extra == 'testing' + - babel ; extra == 'babel' + - lingua ; extra == 'lingua' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 + md5: 93a8e71256479c62074356ef6ebf501b + depends: + - mdurl >=0.1,<1 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=hash-mapping + size: 64356 + timestamp: 1686175179621 +- pypi: https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: markupsafe + version: 2.1.5 + sha256: fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl + name: markupsafe + version: 2.1.5 + sha256: 656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/30/33/cc27211d2ffeee4fd7402dca137b6e8a83f6dcae3d4be8d0ad5068555561/matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl + name: matplotlib + version: 3.7.5 + sha256: 53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.0.1 + - numpy>=1.20,<2 + - packaging>=20.0 + - pillow>=6.2.0 + - pyparsing>=2.3.1 + - python-dateutil>=2.7 + - importlib-resources>=3.2.0 ; python_full_version < '3.10' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/aa/59/4d13e5b6298b1ca5525eea8c68d3806ae93ab6d0bb17ca9846aa3156b92b/matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl + name: matplotlib + version: 3.7.5 + sha256: 4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.0.1 + - numpy>=1.20,<2 + - packaging>=20.0 + - pillow>=6.2.0 + - pyparsing>=2.3.1 + - python-dateutil>=2.7 + - importlib-resources>=3.2.0 ; python_full_version < '3.10' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 + md5: 776a8dd9e824f77abac30e6ef43a8f7a + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + size: 14680 + timestamp: 1704317789138 +- pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl + name: mpmath + version: 1.3.0 + sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + requires_dist: + - pytest>=4.6 ; extra == 'develop' + - pycodestyle ; extra == 'develop' + - pytest-cov ; extra == 'develop' + - codecov ; extra == 'develop' + - wheel ; extra == 'develop' + - sphinx ; extra == 'docs' + - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' + - pytest>=4.6 ; extra == 'tests' +- pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl + name: mypy-extensions + version: 1.1.0 + sha256: 1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/79/3f/8d450588206b437dd239a6d44230c63095e71135bd95d5a74347d07adbd5/narwhals-1.42.1-py3-none-any.whl + name: narwhals + version: 1.42.1 + sha256: 7a270d44b94ccdb277a799ae890c42e8504c537c1849f195eb14717c6184977a + requires_dist: + - cudf>=24.10.0 ; extra == 'cudf' + - dask[dataframe]>=2024.8 ; extra == 'dask' + - duckdb>=1.0 ; extra == 'duckdb' + - ibis-framework>=6.0.0 ; extra == 'ibis' + - packaging ; extra == 'ibis' + - pyarrow-hotfix ; extra == 'ibis' + - rich ; extra == 'ibis' + - modin ; extra == 'modin' + - pandas>=0.25.3 ; extra == 'pandas' + - polars>=0.20.3 ; extra == 'polars' + - pyarrow>=11.0.0 ; extra == 'pyarrow' + - pyspark>=3.5.0 ; extra == 'pyspark' + - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect' + - sqlframe>=3.22.0 ; extra == 'sqlframe' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- pypi: https://files.pythonhosted.org/packages/a8/05/9d4f9b78ead6b2661d6e8ea772e111fc4a9fbd866ad0c81906c11206b55e/networkx-3.1-py3-none-any.whl + name: networkx + version: '3.1' + sha256: 4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36 + requires_dist: + - numpy>=1.20 ; extra == 'default' + - scipy>=1.8 ; extra == 'default' + - matplotlib>=3.4 ; extra == 'default' + - pandas>=1.3 ; extra == 'default' + - pre-commit>=3.2 ; extra == 'developer' + - mypy>=1.1 ; extra == 'developer' + - sphinx>=6.1 ; extra == 'doc' + - pydata-sphinx-theme>=0.13 ; extra == 'doc' + - sphinx-gallery>=0.12 ; extra == 'doc' + - numpydoc>=1.5 ; extra == 'doc' + - pillow>=9.4 ; extra == 'doc' + - nb2plots>=0.6 ; extra == 'doc' + - texext>=0.6.7 ; extra == 'doc' + - lxml>=4.6 ; extra == 'extra' + - pygraphviz>=1.10 ; extra == 'extra' + - pydot>=1.4.2 ; extra == 'extra' + - sympy>=1.10 ; extra == 'extra' + - pytest>=7.2 ; extra == 'test' + - pytest-cov>=4.0 ; extra == 'test' + - codecov>=2.1 ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/98/5d/5738903efe0ecb73e51eb44feafba32bdba2081263d40c5043568ff60faf/numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: numpy + version: 1.24.4 + sha256: dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/a7/ae/f53b7b265fdc701e663fbb322a8e9d4b14d9cb7b2385f45ddfabfc4327e4/numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl + name: numpy + version: 1.24.4 + sha256: 04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/37/6d/121efd7382d5b0284239f4ab1fc1590d86d34ed4a4a2fdb13b30ca8e5740/nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl + name: nvidia-cublas-cu12 + version: 12.1.3.1 + sha256: ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/7e/00/6b218edd739ecfc60524e585ba8e6b00554dd908de2c9c66c1af3e44e18d/nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl + name: nvidia-cuda-cupti-cu12 + version: 12.1.105 + sha256: e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/b6/9f/c64c03f49d6fbc56196664d05dba14e3a561038a81a638eeb47f4d4cfd48/nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl + name: nvidia-cuda-nvrtc-cu12 + version: 12.1.105 + sha256: 339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/eb/d5/c68b1d2cdfcc59e72e8a5949a37ddb22ae6cade80cd4a57a84d4c8b55472/nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl + name: nvidia-cuda-runtime-cu12 + version: 12.1.105 + sha256: 6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl + name: nvidia-cudnn-cu12 + version: 9.1.0.70 + sha256: 165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f + requires_dist: + - nvidia-cublas-cu12 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/86/94/eb540db023ce1d162e7bea9f8f5aa781d57c65aed513c33ee9a5123ead4d/nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl + name: nvidia-cufft-cu12 + version: 11.0.2.54 + sha256: 794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/44/31/4890b1c9abc496303412947fc7dcea3d14861720642b49e8ceed89636705/nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl + name: nvidia-curand-cu12 + version: 10.3.2.106 + sha256: 9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl + name: nvidia-cusolver-cu12 + version: 11.4.5.107 + sha256: 8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd + requires_dist: + - nvidia-cublas-cu12 + - nvidia-nvjitlink-cu12 + - nvidia-cusparse-cu12 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl + name: nvidia-cusparse-cu12 + version: 12.1.0.106 + sha256: f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c + requires_dist: + - nvidia-nvjitlink-cu12 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl + name: nvidia-nccl-cu12 + version: 2.20.5 + sha256: 057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/46/0c/c75bbfb967457a0b7670b8ad267bfc4fffdf341c074e0a80db06c24ccfd4/nvidia_nvjitlink_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl + name: nvidia-nvjitlink-cu12 + version: 12.9.86 + sha256: e3f1171dbdc83c5932a45f0f4c99180a70de9bd2718c1ab77d14104f6d7147f9 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/da/d3/8057f0587683ed2fcd4dbfbdfdfa807b9160b809976099d36b8f60d08f03/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl + name: nvidia-nvtx-cu12 + version: 12.1.105 + sha256: dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5 + requires_python: '>=3' +- pypi: https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl + name: openpyxl + version: 3.1.5 + sha256: 5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 + requires_dist: + - et-xmlfile + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3165399 + timestamp: 1762839186699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3108371 + timestamp: 1762839712322 +- pypi: https://files.pythonhosted.org/packages/7f/12/cba81286cbaf0f0c3f0473846cfd992cb240bdcea816bf2ef7de8ed0f744/optuna-4.5.0-py3-none-any.whl + name: optuna + version: 4.5.0 + sha256: 5b8a783e84e448b0742501bc27195344a28d2c77bd2feef5b558544d954851b0 + requires_dist: + - alembic>=1.5.0 + - colorlog + - numpy + - packaging>=20.0 + - sqlalchemy>=1.4.2 + - tqdm + - pyyaml + - asv>=0.5.0 ; extra == 'benchmark' + - cma ; extra == 'benchmark' + - virtualenv ; extra == 'benchmark' + - black ; extra == 'checking' + - blackdoc ; extra == 'checking' + - flake8 ; extra == 'checking' + - isort ; extra == 'checking' + - mypy ; extra == 'checking' + - mypy-boto3-s3 ; extra == 'checking' + - scipy-stubs ; python_full_version >= '3.10' and extra == 'checking' + - types-pyyaml ; extra == 'checking' + - types-redis ; extra == 'checking' + - types-setuptools ; extra == 'checking' + - types-tqdm ; extra == 'checking' + - typing-extensions>=3.10.0.0 ; extra == 'checking' + - ase ; extra == 'document' + - cmaes>=0.12.0 ; extra == 'document' + - fvcore ; extra == 'document' + - kaleido<0.4 ; extra == 'document' + - lightgbm ; extra == 'document' + - matplotlib!=3.6.0 ; extra == 'document' + - pandas ; extra == 'document' + - pillow ; extra == 'document' + - plotly>=4.9.0 ; extra == 'document' + - scikit-learn ; extra == 'document' + - sphinx ; extra == 'document' + - sphinx-copybutton ; extra == 'document' + - sphinx-gallery ; extra == 'document' + - sphinx-notfound-page ; extra == 'document' + - sphinx-rtd-theme>=1.2.0 ; extra == 'document' + - torch ; extra == 'document' + - torchvision ; extra == 'document' + - boto3 ; extra == 'optional' + - cmaes>=0.12.0 ; extra == 'optional' + - google-cloud-storage ; extra == 'optional' + - matplotlib!=3.6.0 ; extra == 'optional' + - pandas ; extra == 'optional' + - plotly>=4.9.0 ; extra == 'optional' + - redis ; extra == 'optional' + - scikit-learn>=0.24.2 ; extra == 'optional' + - scipy ; extra == 'optional' + - torch ; extra == 'optional' + - grpcio ; extra == 'optional' + - protobuf>=5.28.1 ; extra == 'optional' + - coverage ; extra == 'test' + - fakeredis[lua] ; extra == 'test' + - kaleido<0.4 ; extra == 'test' + - moto ; extra == 'test' + - pytest ; extra == 'test' + - pytest-xdist ; extra == 'test' + - scipy>=1.9.2 ; extra == 'test' + - torch ; extra == 'test' + - grpcio ; extra == 'test' + - protobuf>=5.28.1 ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl + name: packaging + version: '24.2' + sha256: 09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/53/c3/f8e87361f7fdf42012def602bfa2a593423c729f5cb7c97aed7f51be66ac/pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl + name: pandas + version: 2.0.3 + sha256: 32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5 + requires_dist: + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.1 + - numpy>=1.20.3 ; python_full_version < '3.10' + - numpy>=1.21.0 ; python_full_version >= '3.10' + - numpy>=1.23.2 ; python_full_version >= '3.11' + - beautifulsoup4>=4.9.3 ; extra == 'all' + - bottleneck>=1.3.2 ; extra == 'all' + - brotlipy>=0.7.0 ; extra == 'all' + - fastparquet>=0.6.3 ; extra == 'all' + - fsspec>=2021.7.0 ; extra == 'all' + - gcsfs>=2021.7.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.34.2 ; extra == 'all' + - jinja2>=3.0.0 ; extra == 'all' + - lxml>=4.6.3 ; extra == 'all' + - matplotlib>=3.6.1 ; extra == 'all' + - numba>=0.53.1 ; extra == 'all' + - numexpr>=2.7.3 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.0.7 ; extra == 'all' + - pandas-gbq>=0.15.0 ; extra == 'all' + - psycopg2>=2.8.6 ; extra == 'all' + - pyarrow>=7.0.0 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.1 ; extra == 'all' + - pyreadstat>=1.1.2 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - pytest-asyncio>=0.17.0 ; extra == 'all' + - python-snappy>=0.6.0 ; extra == 'all' + - pyxlsb>=1.0.8 ; extra == 'all' + - qtpy>=2.2.0 ; extra == 'all' + - scipy>=1.7.1 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'all' + - sqlalchemy>=1.4.16 ; extra == 'all' + - tables>=3.6.1 ; extra == 'all' + - tabulate>=0.8.9 ; extra == 'all' + - xarray>=0.21.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=1.4.3 ; extra == 'all' + - zstandard>=0.15.2 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'aws' + - pyqt5>=5.15.1 ; extra == 'clipboard' + - qtpy>=2.2.0 ; extra == 'clipboard' + - brotlipy>=0.7.0 ; extra == 'compression' + - python-snappy>=0.6.0 ; extra == 'compression' + - zstandard>=0.15.2 ; extra == 'compression' + - scipy>=1.7.1 ; extra == 'computation' + - xarray>=0.21.0 ; extra == 'computation' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.0.7 ; extra == 'excel' + - pyxlsb>=1.0.8 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=1.4.3 ; extra == 'excel' + - pyarrow>=7.0.0 ; extra == 'feather' + - fsspec>=2021.7.0 ; extra == 'fss' + - gcsfs>=2021.7.0 ; extra == 'gcp' + - pandas-gbq>=0.15.0 ; extra == 'gcp' + - tables>=3.6.1 ; extra == 'hdf5' + - beautifulsoup4>=4.9.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.6.3 ; extra == 'html' + - sqlalchemy>=1.4.16 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - jinja2>=3.0.0 ; extra == 'output-formatting' + - tabulate>=0.8.9 ; extra == 'output-formatting' + - pyarrow>=7.0.0 ; extra == 'parquet' + - bottleneck>=1.3.2 ; extra == 'performance' + - numba>=0.53.1 ; extra == 'performance' + - numexpr>=2.7.1 ; extra == 'performance' + - matplotlib>=3.6.1 ; extra == 'plot' + - sqlalchemy>=1.4.16 ; extra == 'postgresql' + - psycopg2>=2.8.6 ; extra == 'postgresql' + - pyreadstat>=1.1.2 ; extra == 'spss' + - sqlalchemy>=1.4.16 ; extra == 'sql-other' + - hypothesis>=6.34.2 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pytest-asyncio>=0.17.0 ; extra == 'test' + - lxml>=4.6.3 ; extra == 'xml' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f8/7f/5b047effafbdd34e52c9e2d7e44f729a0655efafb22198c45cf692cdc157/pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pandas + version: 2.0.3 + sha256: 9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0 + requires_dist: + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.1 + - numpy>=1.20.3 ; python_full_version < '3.10' + - numpy>=1.21.0 ; python_full_version >= '3.10' + - numpy>=1.23.2 ; python_full_version >= '3.11' + - beautifulsoup4>=4.9.3 ; extra == 'all' + - bottleneck>=1.3.2 ; extra == 'all' + - brotlipy>=0.7.0 ; extra == 'all' + - fastparquet>=0.6.3 ; extra == 'all' + - fsspec>=2021.7.0 ; extra == 'all' + - gcsfs>=2021.7.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.34.2 ; extra == 'all' + - jinja2>=3.0.0 ; extra == 'all' + - lxml>=4.6.3 ; extra == 'all' + - matplotlib>=3.6.1 ; extra == 'all' + - numba>=0.53.1 ; extra == 'all' + - numexpr>=2.7.3 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.0.7 ; extra == 'all' + - pandas-gbq>=0.15.0 ; extra == 'all' + - psycopg2>=2.8.6 ; extra == 'all' + - pyarrow>=7.0.0 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.1 ; extra == 'all' + - pyreadstat>=1.1.2 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - pytest-asyncio>=0.17.0 ; extra == 'all' + - python-snappy>=0.6.0 ; extra == 'all' + - pyxlsb>=1.0.8 ; extra == 'all' + - qtpy>=2.2.0 ; extra == 'all' + - scipy>=1.7.1 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'all' + - sqlalchemy>=1.4.16 ; extra == 'all' + - tables>=3.6.1 ; extra == 'all' + - tabulate>=0.8.9 ; extra == 'all' + - xarray>=0.21.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=1.4.3 ; extra == 'all' + - zstandard>=0.15.2 ; extra == 'all' + - s3fs>=2021.8.0 ; extra == 'aws' + - pyqt5>=5.15.1 ; extra == 'clipboard' + - qtpy>=2.2.0 ; extra == 'clipboard' + - brotlipy>=0.7.0 ; extra == 'compression' + - python-snappy>=0.6.0 ; extra == 'compression' + - zstandard>=0.15.2 ; extra == 'compression' + - scipy>=1.7.1 ; extra == 'computation' + - xarray>=0.21.0 ; extra == 'computation' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.0.7 ; extra == 'excel' + - pyxlsb>=1.0.8 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=1.4.3 ; extra == 'excel' + - pyarrow>=7.0.0 ; extra == 'feather' + - fsspec>=2021.7.0 ; extra == 'fss' + - gcsfs>=2021.7.0 ; extra == 'gcp' + - pandas-gbq>=0.15.0 ; extra == 'gcp' + - tables>=3.6.1 ; extra == 'hdf5' + - beautifulsoup4>=4.9.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.6.3 ; extra == 'html' + - sqlalchemy>=1.4.16 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - jinja2>=3.0.0 ; extra == 'output-formatting' + - tabulate>=0.8.9 ; extra == 'output-formatting' + - pyarrow>=7.0.0 ; extra == 'parquet' + - bottleneck>=1.3.2 ; extra == 'performance' + - numba>=0.53.1 ; extra == 'performance' + - numexpr>=2.7.1 ; extra == 'performance' + - matplotlib>=3.6.1 ; extra == 'plot' + - sqlalchemy>=1.4.16 ; extra == 'postgresql' + - psycopg2>=2.8.6 ; extra == 'postgresql' + - pyreadstat>=1.1.2 ; extra == 'spss' + - sqlalchemy>=1.4.16 ; extra == 'sql-other' + - hypothesis>=6.34.2 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pytest-asyncio>=0.17.0 ; extra == 'test' + - lxml>=4.6.3 ; extra == 'xml' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/5d/e6/71ed4d95676098159b533c4a4c424cf453fec9614edaff1a0633fe228eef/pandas_flavor-0.7.0-py3-none-any.whl + name: pandas-flavor + version: 0.7.0 + sha256: 7ee81e834b111e424679776f49c51abcffec88203b3ff0df2c9cb75550e06b1a + requires_dist: + - pandas>=0.23 + - xarray +- pypi: https://files.pythonhosted.org/packages/10/43/105823d233c5e5d31cea13428f4474ded9d961652307800979a59d6a4276/pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl + name: pillow + version: 10.4.0 + sha256: 7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=7.3 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - check-manifest ; extra == 'tests' + - coverage ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/fb/ad/435fe29865f98a8fbdc64add8875a6e4f8c97749a93577a8919ec6f32c64/pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl + name: pillow + version: 10.4.0 + sha256: 950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=7.3 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - check-manifest ; extra == 'tests' + - coverage ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 + md5: 5dd546fe99b44fda83963d15f84263b7 + depends: + - python >=3.8,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip?source=hash-mapping + size: 1243168 + timestamp: 1730203795600 +- pypi: https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl + name: pkgutil-resolve-name + version: 1.3.10 + sha256: ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl + name: protobuf + version: 5.29.5 + sha256: 63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl + name: protobuf + version: 5.29.5 + sha256: e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/bd/db/ea0203e495be491c85af87b66e37acfd3bf756fd985f87e46fc5e3bf022c/py4j-0.10.9.9-py2.py3-none-any.whl + name: py4j + version: 0.10.9.9 + sha256: c7c26e4158defb37b0bb124933163641a2ff6e3a3913f7811b0ddbe07ed61533 +- pypi: https://files.pythonhosted.org/packages/64/d9/51e35550f2f18b8815a2ab25948f735434db32000c0e91eba3a32634782a/pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl + name: pyarrow + version: 17.0.0 + sha256: edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8 + requires_dist: + - numpy>=1.16.6 + - pytest ; extra == 'test' + - hypothesis ; extra == 'test' + - cffi ; extra == 'test' + - pytz ; extra == 'test' + - pandas ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e6/c1/4c6bcdf7a820034aa91a8b4d25fef38809be79b42ca7aaa16d4680b0bbac/pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl + name: pyarrow + version: 17.0.0 + sha256: d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c + requires_dist: + - numpy>=1.16.6 + - pytest ; extra == 'test' + - hypothesis ; extra == 'test' + - cffi ; extra == 'test' + - pytz ; extra == 'test' + - pandas ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl + name: pydantic + version: 2.10.6 + sha256: 427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 + requires_dist: + - annotated-types>=0.6.0 + - pydantic-core==2.27.2 + - typing-extensions>=4.12.2 + - email-validator>=2.0.0 ; extra == 'email' + - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f4/20/26c549249769ed84877f862f7bb93f89a6ee08b4bee1ed8781616b7fbb5e/pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl + name: pydantic-core + version: 2.27.2 + sha256: 521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320 + requires_dist: + - typing-extensions>=4.6.0,!=4.7.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f7/a3/5f19bc495793546825ab160e530330c2afcee2281c02b5ffafd0b32ac05e/pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pydantic-core + version: 2.27.2 + sha256: 9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5 + requires_dist: + - typing-extensions>=4.6.0,!=4.7.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl + name: pydeck + version: 0.9.1 + sha256: b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038 + requires_dist: + - jinja2>=2.10.1 + - numpy>=1.16.4 + - pydeck-carto ; extra == 'carto' + - ipywidgets>=7,<8 ; extra == 'jupyter' + - traitlets>=4.3.2 ; extra == 'jupyter' + - ipython>=5.8.0 ; python_full_version < '3.4' and extra == 'jupyter' + - ipykernel>=5.1.2 ; python_full_version >= '3.4' and extra == 'jupyter' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b + md5: b7f5c092b8f9800150d998a71b76d5a1 + depends: + - python >=3.8 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 879295 + timestamp: 1714846885370 +- pypi: https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl + name: pyparsing + version: 3.1.4 + sha256: a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c + requires_dist: + - railroad-diagrams ; extra == 'diagrams' + - jinja2 ; extra == 'diagrams' + requires_python: '>=3.6.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.8.20-h4a871b0_2_cpython.conda + build_number: 2 + sha256: 8043dcdb29e1e026d0def1056620d81b24c04f71fd98cc45888c58373b479845 + md5: 05ffff2f44ad60b94ecb53d029c6bdf7 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.8.* *_cp38 + license: Python-2.0 + purls: [] + size: 22176012 + timestamp: 1727719857908 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.8.20-h7d35d02_2_cpython.conda + build_number: 2 + sha256: cf8692e732697d47f0290ef83caa4b3115c7b277a3fb155b7de0f09fa1b5e27c + md5: 29ed2994beffea2a256a7e14f9468df8 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.8.* *_cp38 + license: Python-2.0 + purls: [] + size: 11774160 + timestamp: 1727718758277 +- pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + name: python-dateutil + version: 2.9.0.post0 + sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + requires_dist: + - six>=1.5 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl + name: python-dotenv + version: 1.0.1 + sha256: f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a + requires_dist: + - click>=5.0 ; extra == 'cli' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.8-8_cp38.conda + build_number: 8 + sha256: 83c22066a672ce0b16e693c84aa6d5efb68e02eff037a55e047d7095d0fdb5ca + md5: 4f7b6e3de4f15cc44e0f93b39f07205d + constrains: + - python 3.8.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6960 + timestamp: 1752805923703 +- pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl + name: pytz + version: '2025.2' + sha256: 5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +- pypi: https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz + name: pyyaml + version: 6.0.3 + sha256: d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/25/a2/b725b61ac76a75583ae7104b3209f75ea44b13cfd026aa535ece22b7f22e/PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: 22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/3d/84/63b2e66f5c7cb97ce994769afbbef85a1ac364fedbcb7d4a3c0f15d318a5/rdkit-2024.3.5-cp38-cp38-manylinux_2_28_x86_64.whl + name: rdkit + version: 2024.3.5 + sha256: f662ed10e14c7874d0e011c1f8260a6cf4a5547100806f9f4540f8550a3f1d36 + requires_dist: + - numpy + - pillow +- pypi: https://files.pythonhosted.org/packages/bf/cb/c709b60f4815e18c00e1e8639204bdba04cb158e6278791d82f94f51a988/rdkit-2024.3.5-cp38-cp38-macosx_11_0_arm64.whl + name: rdkit + version: 2024.3.5 + sha256: 53638d0d94f7c511273ff5765abc6a1fe60fe6c8633db13cad03bc527550a7a9 + requires_dist: + - numpy + - pillow +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 345073 + timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 313930 + timestamp: 1765813902568 +- pypi: https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl + name: referencing + version: 0.35.1 + sha256: eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de + requires_dist: + - attrs>=22.2.0 + - rpds-py>=0.7.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl + name: requests + version: 2.32.4 + sha256: 27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c + requires_dist: + - charset-normalizer>=2,<4 + - idna>=2.5,<4 + - urllib3>=1.21.1,<3 + - certifi>=2017.4.17 + - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' + - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + sha256: c009488fc07fd5557434c9c1ad32ab1dd50241d6a766e4b2b4125cd6498585a8 + md5: bcf8cc8924b5d20ead3d122130b8320b + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.8 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + size: 185481 + timestamp: 1730592349978 +- pypi: https://files.pythonhosted.org/packages/54/63/47d34dc4ddb3da73e78e10c9009dcf8edc42d355a221351c05c822c2a50b/rpds_py-0.20.1-cp38-cp38-macosx_11_0_arm64.whl + name: rpds-py + version: 0.20.1 + sha256: 3e310838a5801795207c66c73ea903deda321e6146d6f282e85fa7e3e4854804 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/c4/ce/af016c81fda833bf125b20d1677d816f230cad2ab189f46bcbfea3c7a375/rpds_py-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: rpds-py + version: 0.20.1 + sha256: 02a0629ec053fc013808a85178524e3cb63a61dbc35b22499870194a63578fb9 + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.12-h4196e79_0.conda + noarch: python + sha256: 26c9f201a249cf54acacfa5055e96ad6e8e272cac3a25ac7caee8fe048e66b5a + md5: b8b77763e87e13ecac834a190155600b + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=compressed-mapping + size: 11513418 + timestamp: 1768513907806 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.14.12-hb0cad00_0.conda + noarch: python + sha256: 8da228ab3930cf1fbf52bd00e2b141af458a04ef698122d9beff151d6517fa84 + md5: b7049a4bfa0de48b8d27f158c1e9daf7 + depends: + - python + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ruff?source=compressed-mapping + size: 10452516 + timestamp: 1768513987014 +- pypi: https://files.pythonhosted.org/packages/3f/48/6fdd99f5717045f9984616b5c2ec683d6286d30c0ac234563062132b83ab/scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: scikit-learn + version: 1.3.2 + sha256: 785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf + requires_dist: + - numpy>=1.17.3,<2.0 + - scipy>=1.5.0 + - joblib>=1.1.1 + - threadpoolctl>=2.0.0 + - matplotlib>=3.1.3 ; extra == 'benchmark' + - pandas>=1.0.5 ; extra == 'benchmark' + - memory-profiler>=0.57.0 ; extra == 'benchmark' + - matplotlib>=3.1.3 ; extra == 'docs' + - scikit-image>=0.16.2 ; extra == 'docs' + - pandas>=1.0.5 ; extra == 'docs' + - seaborn>=0.9.0 ; extra == 'docs' + - memory-profiler>=0.57.0 ; extra == 'docs' + - sphinx>=6.0.0 ; extra == 'docs' + - sphinx-copybutton>=0.5.2 ; extra == 'docs' + - sphinx-gallery>=0.10.1 ; extra == 'docs' + - numpydoc>=1.2.0 ; extra == 'docs' + - pillow>=7.1.2 ; extra == 'docs' + - pooch>=1.6.0 ; extra == 'docs' + - sphinx-prompt>=1.3.0 ; extra == 'docs' + - sphinxext-opengraph>=0.4.2 ; extra == 'docs' + - plotly>=5.14.0 ; extra == 'docs' + - matplotlib>=3.1.3 ; extra == 'examples' + - scikit-image>=0.16.2 ; extra == 'examples' + - pandas>=1.0.5 ; extra == 'examples' + - seaborn>=0.9.0 ; extra == 'examples' + - pooch>=1.6.0 ; extra == 'examples' + - plotly>=5.14.0 ; extra == 'examples' + - matplotlib>=3.1.3 ; extra == 'tests' + - scikit-image>=0.16.2 ; extra == 'tests' + - pandas>=1.0.5 ; extra == 'tests' + - pytest>=7.1.2 ; extra == 'tests' + - pytest-cov>=2.9.0 ; extra == 'tests' + - ruff>=0.0.272 ; extra == 'tests' + - black>=23.3.0 ; extra == 'tests' + - mypy>=1.3 ; extra == 'tests' + - pyamg>=4.0.0 ; extra == 'tests' + - numpydoc>=1.2.0 ; extra == 'tests' + - pooch>=1.6.0 ; extra == 'tests' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/a4/62/92e9cec3deca8b45abf62dd8f6469d688b3f28b9c170809fcc46f110b523/scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl + name: scikit-learn + version: 1.3.2 + sha256: b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073 + requires_dist: + - numpy>=1.17.3,<2.0 + - scipy>=1.5.0 + - joblib>=1.1.1 + - threadpoolctl>=2.0.0 + - matplotlib>=3.1.3 ; extra == 'benchmark' + - pandas>=1.0.5 ; extra == 'benchmark' + - memory-profiler>=0.57.0 ; extra == 'benchmark' + - matplotlib>=3.1.3 ; extra == 'docs' + - scikit-image>=0.16.2 ; extra == 'docs' + - pandas>=1.0.5 ; extra == 'docs' + - seaborn>=0.9.0 ; extra == 'docs' + - memory-profiler>=0.57.0 ; extra == 'docs' + - sphinx>=6.0.0 ; extra == 'docs' + - sphinx-copybutton>=0.5.2 ; extra == 'docs' + - sphinx-gallery>=0.10.1 ; extra == 'docs' + - numpydoc>=1.2.0 ; extra == 'docs' + - pillow>=7.1.2 ; extra == 'docs' + - pooch>=1.6.0 ; extra == 'docs' + - sphinx-prompt>=1.3.0 ; extra == 'docs' + - sphinxext-opengraph>=0.4.2 ; extra == 'docs' + - plotly>=5.14.0 ; extra == 'docs' + - matplotlib>=3.1.3 ; extra == 'examples' + - scikit-image>=0.16.2 ; extra == 'examples' + - pandas>=1.0.5 ; extra == 'examples' + - seaborn>=0.9.0 ; extra == 'examples' + - pooch>=1.6.0 ; extra == 'examples' + - plotly>=5.14.0 ; extra == 'examples' + - matplotlib>=3.1.3 ; extra == 'tests' + - scikit-image>=0.16.2 ; extra == 'tests' + - pandas>=1.0.5 ; extra == 'tests' + - pytest>=7.1.2 ; extra == 'tests' + - pytest-cov>=2.9.0 ; extra == 'tests' + - ruff>=0.0.272 ; extra == 'tests' + - black>=23.3.0 ; extra == 'tests' + - mypy>=1.3 ; extra == 'tests' + - pyamg>=4.0.0 ; extra == 'tests' + - numpydoc>=1.2.0 ; extra == 'tests' + - pooch>=1.6.0 ; extra == 'tests' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/69/f0/fb07a9548e48b687b8bf2fa81d71aba9cfc548d365046ca1c791e24db99d/scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: scipy + version: 1.10.1 + sha256: 07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f + requires_dist: + - numpy>=1.19.5,<1.27.0 + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist ; extra == 'test' + - asv ; extra == 'test' + - mpmath ; extra == 'test' + - gmpy2 ; extra == 'test' + - threadpoolctl ; extra == 'test' + - scikit-umfpack ; extra == 'test' + - pooch ; extra == 'test' + - sphinx!=4.1.0 ; extra == 'doc' + - pydata-sphinx-theme==0.9.0 ; extra == 'doc' + - sphinx-design>=0.2.0 ; extra == 'doc' + - matplotlib>2 ; extra == 'doc' + - numpydoc ; extra == 'doc' + - mypy ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - flake8 ; extra == 'dev' + - rich-click ; extra == 'dev' + - click ; extra == 'dev' + - doit>=0.36.0 ; extra == 'dev' + - pydevtool ; extra == 'dev' + requires_python: '>=3.8,<3.12' +- pypi: https://files.pythonhosted.org/packages/93/4a/50c436de1353cce8b66b26e49a687f10b91fe7465bf34e4565d810153003/scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl + name: scipy + version: 1.10.1 + sha256: 39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88 + requires_dist: + - numpy>=1.19.5,<1.27.0 + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist ; extra == 'test' + - asv ; extra == 'test' + - mpmath ; extra == 'test' + - gmpy2 ; extra == 'test' + - threadpoolctl ; extra == 'test' + - scikit-umfpack ; extra == 'test' + - pooch ; extra == 'test' + - sphinx!=4.1.0 ; extra == 'doc' + - pydata-sphinx-theme==0.9.0 ; extra == 'doc' + - sphinx-design>=0.2.0 ; extra == 'doc' + - matplotlib>2 ; extra == 'doc' + - numpydoc ; extra == 'doc' + - mypy ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - flake8 ; extra == 'dev' + - rich-click ; extra == 'dev' + - click ; extra == 'dev' + - doit>=0.36.0 ; extra == 'dev' + - pydevtool ; extra == 'dev' + requires_python: '>=3.8,<3.12' +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + sha256: a36d020b9f32fc3f1a6488a1c4a9c13988c6468faf6895bf30ca69521a61230e + md5: 2ce9825396daf72baabaade36cee16da + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 779561 + timestamp: 1730382173961 +- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb + md5: d08db09a552699ee9e7eec56b4eb3899 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/shellingham?source=hash-mapping + size: 14568 + timestamp: 1698144516278 +- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + name: six + version: 1.17.0 + sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl + name: smmap + version: 5.0.2 + sha256: b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl + name: sniffio + version: 1.3.1 + sha256: 2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl + name: snowballstemmer + version: 3.0.1 + sha256: 6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064 + requires_python: '!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl + name: sphinx + version: 7.1.2 + sha256: d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe + requires_dist: + - sphinxcontrib-applehelp + - sphinxcontrib-devhelp + - sphinxcontrib-jsmath + - sphinxcontrib-htmlhelp>=2.0.0 + - sphinxcontrib-serializinghtml>=1.1.5 + - sphinxcontrib-qthelp + - jinja2>=3.0 + - pygments>=2.13 + - docutils>=0.18.1,<0.21 + - snowballstemmer>=2.0 + - babel>=2.9 + - alabaster>=0.7,<0.8 + - imagesize>=1.3 + - requests>=2.25.0 + - packaging>=21.0 + - importlib-metadata>=4.8 ; python_full_version < '3.10' + - colorama>=0.4.5 ; sys_platform == 'win32' + - sphinxcontrib-websupport ; extra == 'docs' + - flake8>=3.5.0 ; extra == 'lint' + - flake8-simplify ; extra == 'lint' + - isort ; extra == 'lint' + - ruff ; extra == 'lint' + - mypy>=0.990 ; extra == 'lint' + - sphinx-lint ; extra == 'lint' + - docutils-stubs ; extra == 'lint' + - types-requests ; extra == 'lint' + - pytest>=4.6 ; extra == 'test' + - html5lib ; extra == 'test' + - cython ; extra == 'test' + - filelock ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/87/c7/b5c8015d823bfda1a346adb2c634a2101d50bb75d421eb6dcb31acd25ebc/sphinx_rtd_theme-3.1.0-py2.py3-none-any.whl + name: sphinx-rtd-theme + version: 3.1.0 + sha256: 1785824ae8e6632060490f67cf3a72d404a85d2d9fc26bce3619944de5682b89 + requires_dist: + - sphinx>=6,<10 + - docutils>0.18,<0.23 + - sphinxcontrib-jquery>=4,<5 + - transifex-client ; extra == 'dev' + - bump2version ; extra == 'dev' + - wheel ; extra == 'dev' + - twine ; extra == 'dev' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl + name: sphinxcontrib-applehelp + version: 1.0.4 + sha256: 29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228 + requires_dist: + - flake8 ; extra == 'lint' + - mypy ; extra == 'lint' + - docutils-stubs ; extra == 'lint' + - pytest ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl + name: sphinxcontrib-devhelp + version: 1.0.2 + sha256: 8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e + requires_dist: + - flake8 ; extra == 'lint' + - mypy ; extra == 'lint' + - docutils-stubs ; extra == 'lint' + - pytest ; extra == 'test' + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl + name: sphinxcontrib-htmlhelp + version: 2.0.1 + sha256: c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903 + requires_dist: + - flake8 ; extra == 'lint' + - mypy ; extra == 'lint' + - docutils-stubs ; extra == 'lint' + - pytest ; extra == 'test' + - html5lib ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl + name: sphinxcontrib-jquery + version: '4.1' + sha256: f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae + requires_dist: + - sphinx>=1.8 + requires_python: '>=2.7' +- pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl + name: sphinxcontrib-jsmath + version: 1.0.1 + sha256: 2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 + requires_dist: + - pytest ; extra == 'test' + - flake8 ; extra == 'test' + - mypy ; extra == 'test' + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl + name: sphinxcontrib-qthelp + version: 1.0.3 + sha256: bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6 + requires_dist: + - flake8 ; extra == 'lint' + - mypy ; extra == 'lint' + - docutils-stubs ; extra == 'lint' + - pytest ; extra == 'test' + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl + name: sphinxcontrib-serializinghtml + version: 1.1.5 + sha256: 352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd + requires_dist: + - flake8 ; extra == 'lint' + - mypy ; extra == 'lint' + - docutils-stubs ; extra == 'lint' + - pytest ; extra == 'test' + requires_python: '>=3.5' +- pypi: https://files.pythonhosted.org/packages/07/d4/76b9618d7eb1e6a3c26734e1186f8ad7869e4426b1ea7dc425bc4c832e67/sqlalchemy-2.0.46-cp38-cp38-macosx_11_0_arm64.whl + name: sqlalchemy + version: 2.0.46 + sha256: 6ac245604295b521de49b465bab845e3afe6916bcb2147e5929c8041b4ec0545 + requires_dist: + - typing-extensions>=4.6.0 + - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' + - importlib-metadata ; python_full_version < '3.8' + - greenlet>=1 ; extra == 'aiomysql' + - aiomysql>=0.2.0 ; extra == 'aiomysql' + - greenlet>=1 ; extra == 'aioodbc' + - aioodbc ; extra == 'aioodbc' + - greenlet>=1 ; extra == 'aiosqlite' + - aiosqlite ; extra == 'aiosqlite' + - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' + - greenlet>=1 ; extra == 'asyncio' + - greenlet>=1 ; extra == 'asyncmy' + - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy' + - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector' + - pyodbc ; extra == 'mssql' + - pymssql ; extra == 'mssql-pymssql' + - pyodbc ; extra == 'mssql-pyodbc' + - mypy>=0.910 ; extra == 'mypy' + - mysqlclient>=1.4.0 ; extra == 'mysql' + - mysql-connector-python ; extra == 'mysql-connector' + - cx-oracle>=8 ; extra == 'oracle' + - oracledb>=1.0.1 ; extra == 'oracle-oracledb' + - psycopg2>=2.7 ; extra == 'postgresql' + - greenlet>=1 ; extra == 'postgresql-asyncpg' + - asyncpg ; extra == 'postgresql-asyncpg' + - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' + - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' + - psycopg2-binary ; extra == 'postgresql-psycopg2binary' + - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' + - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' + - pymysql ; extra == 'pymysql' + - sqlcipher3-binary ; extra == 'sqlcipher' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/8a/7b/b9e0eb7f9a15f2e82856603c728edf14c54a07c6738ab228e4f2de049338/sqlalchemy-2.0.46-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: sqlalchemy + version: 2.0.46 + sha256: 716be5bcabf327b6d5d265dbdc6213a01199be587224eb991ad0d37e83d728fd + requires_dist: + - typing-extensions>=4.6.0 + - greenlet>=1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' + - importlib-metadata ; python_full_version < '3.8' + - greenlet>=1 ; extra == 'aiomysql' + - aiomysql>=0.2.0 ; extra == 'aiomysql' + - greenlet>=1 ; extra == 'aioodbc' + - aioodbc ; extra == 'aioodbc' + - greenlet>=1 ; extra == 'aiosqlite' + - aiosqlite ; extra == 'aiosqlite' + - typing-extensions!=3.10.0.1 ; extra == 'aiosqlite' + - greenlet>=1 ; extra == 'asyncio' + - greenlet>=1 ; extra == 'asyncmy' + - asyncmy>=0.2.3,!=0.2.4,!=0.2.6 ; extra == 'asyncmy' + - mariadb>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10 ; extra == 'mariadb-connector' + - pyodbc ; extra == 'mssql' + - pymssql ; extra == 'mssql-pymssql' + - pyodbc ; extra == 'mssql-pyodbc' + - mypy>=0.910 ; extra == 'mypy' + - mysqlclient>=1.4.0 ; extra == 'mysql' + - mysql-connector-python ; extra == 'mysql-connector' + - cx-oracle>=8 ; extra == 'oracle' + - oracledb>=1.0.1 ; extra == 'oracle-oracledb' + - psycopg2>=2.7 ; extra == 'postgresql' + - greenlet>=1 ; extra == 'postgresql-asyncpg' + - asyncpg ; extra == 'postgresql-asyncpg' + - pg8000>=1.29.1 ; extra == 'postgresql-pg8000' + - psycopg>=3.0.7 ; extra == 'postgresql-psycopg' + - psycopg2-binary ; extra == 'postgresql-psycopg2binary' + - psycopg2cffi ; extra == 'postgresql-psycopg2cffi' + - psycopg[binary]>=3.0.7 ; extra == 'postgresql-psycopgbinary' + - pymysql ; extra == 'pymysql' + - sqlcipher3-binary ; extra == 'sqlcipher' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/b6/c5/7ae467eeddb57260c8ce17a3a09f9f5edba35820fc022d7c55b7decd5d3a/starlette-0.44.0-py3-none-any.whl + name: starlette + version: 0.44.0 + sha256: 19edeb75844c16dcd4f9dd72f22f9108c1539f3fc9c4c88885654fef64f85aea + requires_dist: + - anyio>=3.4.0,<5 + - typing-extensions>=3.10.0 ; python_full_version < '3.10' + - httpx>=0.27.0,<0.29.0 ; extra == 'full' + - itsdangerous ; extra == 'full' + - jinja2 ; extra == 'full' + - python-multipart>=0.0.18 ; extra == 'full' + - pyyaml ; extra == 'full' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/9a/14/857d0734989f3d26f2f965b2e3f67568ea7a6e8a60cb9c1ed7f774b6d606/streamlit-1.40.1-py2.py3-none-any.whl + name: streamlit + version: 1.40.1 + sha256: b9d7a317a0cc88edd7857c7e07dde9cf95647d3ae51cbfa8a3db82fbb8a2990d + requires_dist: + - altair>=4.0,<6 + - blinker>=1.0.0,<2 + - cachetools>=4.0,<6 + - click>=7.0,<9 + - numpy>=1.20,<3 + - packaging>=20,<25 + - pandas>=1.4.0,<3 + - pillow>=7.1.0,<12 + - protobuf>=3.20,<6 + - pyarrow>=7.0 + - requests>=2.27,<3 + - rich>=10.14.0,<14 + - tenacity>=8.1.0,<10 + - toml>=0.10.1,<2 + - typing-extensions>=4.3.0,<5 + - gitpython>=3.0.7,!=3.1.19,<4 + - pydeck>=0.8.0b4,<1 + - tornado>=6.0.3,<7 + - watchdog>=2.1.5,<7 ; sys_platform != 'darwin' + - snowflake-snowpark-python[modin]>=1.17.0 ; python_full_version < '3.12' and extra == 'snowflake' + - snowflake-connector-python>=2.8.0 ; python_full_version < '3.12' and extra == 'snowflake' + requires_python: '>=3.8,!=3.9.7' +- pypi: https://files.pythonhosted.org/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl + name: sympy + version: 1.13.3 + sha256: 54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73 + requires_dist: + - mpmath>=1.1.0,<1.4 + - pytest>=7.1.0 ; extra == 'dev' + - hypothesis>=6.70.0 ; extra == 'dev' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl + name: tenacity + version: 9.0.0 + sha256: 93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539 + requires_dist: + - reno ; extra == 'doc' + - sphinx ; extra == 'doc' + - pytest ; extra == 'test' + - tornado>=4.5 ; extra == 'test' + - typeguard ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/44/71/f3e7c9b2ab67e28c572ab4e9d5fa3499e0d252650f96d8a3a03e26677f53/tensorboardX-2.6.2.2-py2.py3-none-any.whl + name: tensorboardx + version: 2.6.2.2 + sha256: 160025acbf759ede23fd3526ae9d9bfbfd8b68eb16c38a010ebe326dc6395db8 + requires_dist: + - numpy + - packaging + - protobuf>=3.20 +- pypi: https://files.pythonhosted.org/packages/4b/2c/ffbf7a134b9ab11a67b0cf0726453cedd9c5043a4fe7a35d1cefa9a1bcfb/threadpoolctl-3.5.0-py3-none-any.whl + name: threadpoolctl + version: 3.5.0 + sha256: 56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467 + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 + md5: 86bc20552bf46075e3d92b67f089172d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3284905 + timestamp: 1763054914403 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 + md5: a73d54a5abba6543cb2f0af1bfbd6851 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3125484 + timestamp: 1763055028377 +- pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + name: toml + version: 0.10.2 + sha256: 806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b + requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/a9/71/45aac46b75742e08d2d6f9fc2b612223b5e36115b8b2ed673b23c21b5387/torch-2.4.1-cp38-cp38-manylinux1_x86_64.whl + name: torch + version: 2.4.1 + sha256: c99e1db4bf0c5347107845d715b4aa1097e601bdc36343d758963055e9599d93 + requires_dist: + - filelock + - typing-extensions>=4.8.0 + - sympy + - networkx + - jinja2 + - fsspec + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-nccl-cu12==2.20.5 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - triton==3.0.0 ; python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux' + - opt-einsum>=3.3 ; extra == 'opt-einsum' + - optree>=0.11.0 ; extra == 'optree' + requires_python: '>=3.8.0' +- pypi: https://files.pythonhosted.org/packages/c4/88/4d9f66de5fe732462a2713c9931cab614d3fd6a9b5d9ee1f04768ad64daa/torch-2.4.1-cp38-none-macosx_11_0_arm64.whl + name: torch + version: 2.4.1 + sha256: 5fc1d4d7ed265ef853579caf272686d1ed87cebdcd04f2a498f800ffc53dab71 + requires_dist: + - filelock + - typing-extensions>=4.8.0 + - sympy + - networkx + - jinja2 + - fsspec + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-nccl-cu12==2.20.5 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and sys_platform == 'linux' + - triton==3.0.0 ; python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux' + - opt-einsum>=3.3 ; extra == 'opt-einsum' + - optree>=0.11.0 ; extra == 'optree' + requires_python: '>=3.8.0' +- pypi: https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: tornado + version: 6.4.2 + sha256: bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl + name: tornado + version: 6.4.2 + sha256: e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1 + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_0.conda + sha256: 5673b7104350a6998cb86cccf1d0058217d86950e8d6c927d8530606028edb1d + md5: 4085c9db273a148e149c03627350e22c + depends: + - colorama + - python >=3.7 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89484 + timestamp: 1732497312317 +- pypi: https://files.pythonhosted.org/packages/4d/b4/c37e2776a1390bab7e78a6d52bd525441cb3cad7260a6a00b11b0b702e7c/triton-3.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: triton + version: 3.0.0 + sha256: bcbf3b1c48af6a28011a5c40a5b3b9b5330530c3827716b5fbf6d7adcc1e53e9 + requires_dist: + - filelock + - cmake>=3.20 ; extra == 'build' + - lit ; extra == 'build' + - autopep8 ; extra == 'tests' + - flake8 ; extra == 'tests' + - isort ; extra == 'tests' + - numpy ; extra == 'tests' + - pytest ; extra == 'tests' + - scipy>=1.7.1 ; extra == 'tests' + - llnl-hatchet ; extra == 'tests' + - matplotlib ; extra == 'tutorials' + - pandas ; extra == 'tutorials' + - tabulate ; extra == 'tutorials' +- pypi: https://files.pythonhosted.org/packages/ea/07/0055bb513de2b7cf23b2bfc7eeeb6a6ae6ff7b287e2a62ab80cf403d61e9/typed_argument_parser-1.10.1-py3-none-any.whl + name: typed-argument-parser + version: 1.10.1 + sha256: 152cad218c84f23d9d4cbbfcb153a1a53fa0b330f0f7a4b85190dd4cb86f0c0a + requires_dist: + - docstring-parser>=0.15 + - packaging + - typing-inspect>=0.7.1 + - typed-argument-parser[dev-no-pydantic] ; extra == 'dev' + - pydantic>=2.5.0 ; extra == 'dev' + - pytest ; extra == 'dev-no-pydantic' + - pytest-cov ; extra == 'dev-no-pydantic' + - flake8 ; extra == 'dev-no-pydantic' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.5-pyhd8ed1ab_0.conda + sha256: da9ff9e27c5fa8268c2d5898335485a897d9496eef3b5b446cd9387a89d168de + md5: be70216cc1a5fe502c849676baabf498 + depends: + - python >=3.7 + - typer-slim-standard 0.12.5 hd8ed1ab_0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typer?source=hash-mapping + size: 53350 + timestamp: 1724613663049 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.5-pyhd8ed1ab_0.conda + sha256: 7be1876627495047f3f07c52c93ddc2ae2017b93affe58110a5474e5ebcb2662 + md5: a46aa56c0ca7cc2bd38baffc2686f0a6 + depends: + - click >=8.0.0 + - python >=3.7 + - typing_extensions >=3.7.4.3 + constrains: + - rich >=10.11.0 + - typer >=0.12.5,<0.12.6.0a0 + - shellingham >=1.3.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typer-slim?source=hash-mapping + size: 45641 + timestamp: 1724613646022 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.5-hd8ed1ab_0.conda + sha256: bb298b116159ec1085f6b29eaeb982006651a0997eda08de8b70cfb6177297f3 + md5: 2dc1ee4046de0692077e9aa9ba351d36 + depends: + - rich + - shellingham + - typer-slim 0.12.5 pyhd8ed1ab_0 + license: MIT + license_family: MIT + purls: [] + size: 46817 + timestamp: 1724613648907 +- pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl + name: typing-inspect + version: 0.9.0 + sha256: 9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f + requires_dist: + - mypy-extensions>=0.3.0 + - typing-extensions>=3.7.4 + - typing>=3.7.4 ; python_full_version < '3.5' +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + sha256: 0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb + md5: ebe6952715e1d5eb567eeebf25250fa7 + depends: + - python >=3.8 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39888 + timestamp: 1717802653893 +- pypi: https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl + name: tzdata + version: '2025.3' + sha256: 06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1 + requires_python: '>=2' +- pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + name: urllib3 + version: 2.2.3 + sha256: ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac + requires_dist: + - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - h2>=4,<5 ; extra == 'h2' + - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' + - zstandard>=0.18.0 ; extra == 'zstd' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/98/79/2e2620337ef1e4ef7a058b351603b765f59ac28e6e3ac7c5e7cdee9ea1ab/uvicorn-0.33.0-py3-none-any.whl + name: uvicorn + version: 0.33.0 + sha256: 2c30de4aeea83661a520abab179b24084a0019c0c1bbe137e5409f741cbde5f8 + requires_dist: + - click>=7.0 + - h11>=0.8 + - typing-extensions>=4.0 ; python_full_version < '3.11' + - colorama>=0.4 ; sys_platform == 'win32' and extra == 'standard' + - httptools>=0.6.3 ; extra == 'standard' + - python-dotenv>=0.13 ; extra == 'standard' + - pyyaml>=5.1 ; extra == 'standard' + - uvloop>=0.14.0,!=0.15.0,!=0.15.1 ; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32' and extra == 'standard' + - watchfiles>=0.13 ; extra == 'standard' + - websockets>=10.4 ; extra == 'standard' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/01/d2/c8931ff840a7e5bd5dcb93f2bb2a1fd18faf8312e9f7f53ff1cf76ecc8ed/watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl + name: watchdog + version: 4.0.2 + sha256: c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/fd/21/0a674dfe66e9df9072c46269c882e9f901d36d987d8ea50ead033a9c1e01/werkzeug-2.3.8-py3-none-any.whl + name: werkzeug + version: 2.3.8 + sha256: bba1f19f8ec89d4d607a3bd62f1904bd2e609472d93cd85e9d4e178f472c3748 + requires_dist: + - markupsafe>=2.1.1 + - watchdog>=2.3 ; extra == 'watchdog' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_0.conda + sha256: 24f6851a336a50c53d6b50b142c1654872494a62528d57c3ff40240cbd8b13be + md5: bdb2f437ce62fd2f1fef9119a37a12d9 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel?source=hash-mapping + size: 62998 + timestamp: 1732339880578 +- pypi: https://files.pythonhosted.org/packages/b4/a7/897f484225bd8e179a4f39f8e9a4ca26c14e9f7055b495384b1d56e1382d/xarray-2023.1.0-py3-none-any.whl + name: xarray + version: 2023.1.0 + sha256: 7e530b1deafdd43e5c2b577d0944e6b528fbe88045fd849e49a8d11871ecd522 + requires_dist: + - numpy>=1.20 + - pandas>=1.3 + - packaging>=21.3 + - scipy ; extra == 'accel' + - bottleneck ; extra == 'accel' + - numbagg ; extra == 'accel' + - flox ; extra == 'accel' + - netcdf4 ; extra == 'complete' + - h5netcdf ; extra == 'complete' + - scipy ; extra == 'complete' + - zarr ; extra == 'complete' + - fsspec ; extra == 'complete' + - cftime ; extra == 'complete' + - rasterio ; extra == 'complete' + - cfgrib ; extra == 'complete' + - pooch ; extra == 'complete' + - bottleneck ; extra == 'complete' + - numbagg ; extra == 'complete' + - flox ; extra == 'complete' + - dask[complete] ; extra == 'complete' + - matplotlib ; extra == 'complete' + - seaborn ; extra == 'complete' + - nc-time-axis ; extra == 'complete' + - pydap ; python_full_version < '3.10' and extra == 'complete' + - netcdf4 ; extra == 'docs' + - h5netcdf ; extra == 'docs' + - scipy ; extra == 'docs' + - zarr ; extra == 'docs' + - fsspec ; extra == 'docs' + - cftime ; extra == 'docs' + - rasterio ; extra == 'docs' + - cfgrib ; extra == 'docs' + - pooch ; extra == 'docs' + - bottleneck ; extra == 'docs' + - numbagg ; extra == 'docs' + - flox ; extra == 'docs' + - dask[complete] ; extra == 'docs' + - matplotlib ; extra == 'docs' + - seaborn ; extra == 'docs' + - nc-time-axis ; extra == 'docs' + - sphinx-autosummary-accessors ; extra == 'docs' + - sphinx-rtd-theme ; extra == 'docs' + - ipython ; extra == 'docs' + - ipykernel ; extra == 'docs' + - jupyter-client ; extra == 'docs' + - nbsphinx ; extra == 'docs' + - scanpydoc ; extra == 'docs' + - pydap ; python_full_version < '3.10' and extra == 'docs' + - netcdf4 ; extra == 'io' + - h5netcdf ; extra == 'io' + - scipy ; extra == 'io' + - zarr ; extra == 'io' + - fsspec ; extra == 'io' + - cftime ; extra == 'io' + - rasterio ; extra == 'io' + - cfgrib ; extra == 'io' + - pooch ; extra == 'io' + - pydap ; python_full_version < '3.10' and extra == 'io' + - dask[complete] ; extra == 'parallel' + - matplotlib ; extra == 'viz' + - seaborn ; extra == 'viz' + - nc-time-axis ; extra == 'viz' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.1-hbcc6ac9_2.conda + sha256: 802725371682ea06053971db5b4fb7fbbcaee9cb1804ec688f55e51d74660617 + md5: 68eae977d7d1196d32b636a026dc015d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - liblzma 5.8.1 hb9d3cd8_2 + - liblzma-devel 5.8.1 hb9d3cd8_2 + - xz-gpl-tools 5.8.1 hbcc6ac9_2 + - xz-tools 5.8.1 hb9d3cd8_2 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 23987 + timestamp: 1749230104359 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.8.1-h9a6d368_2.conda + sha256: afb747cf017b67cc31d54c6e6c4bd1b1e179fe487a3d23a856232ed7fd0b099b + md5: 39435c82e5a007ef64cbb153ecc40cfd + depends: + - __osx >=11.0 + - liblzma 5.8.1 h39f12f2_2 + - liblzma-devel 5.8.1 h39f12f2_2 + - xz-gpl-tools 5.8.1 h9a6d368_2 + - xz-tools 5.8.1 h39f12f2_2 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 23995 + timestamp: 1749230346887 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.1-hbcc6ac9_2.conda + sha256: 840838dca829ec53f1160f3fca6dbfc43f2388b85f15d3e867e69109b168b87b + md5: bf627c16aa26231720af037a2709ab09 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - liblzma 5.8.1 hb9d3cd8_2 + constrains: + - xz 5.8.1.* + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 33911 + timestamp: 1749230090353 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.8.1-h9a6d368_2.conda + sha256: a0790cfb48d240e7b655b0d797a00040219cf39e3ee38e2104e548515df4f9c2 + md5: 09b1442c1d49ac7c5f758c44695e77d1 + depends: + - __osx >=11.0 + - liblzma 5.8.1 h39f12f2_2 + constrains: + - xz 5.8.1.* + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + size: 34103 + timestamp: 1749230329933 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.1-hb9d3cd8_2.conda + sha256: 58034f3fca491075c14e61568ad8b25de00cb3ae479de3e69be6d7ee5d3ace28 + md5: 1bad2995c8f1c8075c6c331bf96e46fb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - liblzma 5.8.1 hb9d3cd8_2 + constrains: + - xz 5.8.1.* + license: 0BSD AND LGPL-2.1-or-later + purls: [] + size: 96433 + timestamp: 1749230076687 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.8.1-h39f12f2_2.conda + sha256: 9d1232705e3d175f600dc8e344af9182d0341cdaa73d25330591a28532951063 + md5: 37996935aa33138fca43e4b4563b6a28 + depends: + - __osx >=11.0 + - liblzma 5.8.1 h39f12f2_2 + constrains: + - xz 5.8.1.* + license: 0BSD AND LGPL-2.1-or-later + purls: [] + size: 86425 + timestamp: 1749230316106 +- pypi: https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl + name: zipp + version: 3.20.2 + sha256: a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 + requires_dist: + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest>=6,!=8.1.* ; extra == 'test' + - jaraco-itertools ; extra == 'test' + - jaraco-functools ; extra == 'test' + - more-itertools ; extra == 'test' + - big-o ; extra == 'test' + - pytest-ignore-flaky ; extra == 'test' + - jaraco-test ; extra == 'test' + - importlib-resources ; python_full_version < '3.9' and extra == 'test' + - pytest-mypy ; extra == 'type' + requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 601375 + timestamp: 1764777111296 diff --git a/pixi.toml b/pixi.toml index 8b01740..a996b3f 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,32 +1,35 @@ -[workspace] -authors = ["RYDE-WORK "] -channels = ["conda-forge"] -name = "LNP_ML" -platforms = ["linux-64", "osx-arm64"] -version = "0.1.0" - -[tasks] - -[dependencies] -loguru = "*" -ruff = "*" -tqdm = "*" -typer = "*" -pip = "*" -python = "3.8.*" - -[pypi-dependencies] -lnp_ml = { path = ".", editable = true } -chemprop = "==1.7.0" -setuptools = "*" -pandas = ">=2.0.3, <3" -openpyxl = ">=3.1.5, <4" -python-dotenv = ">=1.0.1, <2" -pyarrow = ">=17.0.0, <18" -fastparquet = ">=2024.2.0, <2025" -fastapi = ">=0.124.4, <0.125" -streamlit = ">=1.40.1, <2" -httpx = ">=0.28.1, <0.29" -uvicorn = ">=0.33.0, <0.34" -optuna = ">=4.5.0, <5" -captum = ">=0.7.0, <0.8" +[workspace] +authors = ["RYDE-WORK "] +channels = ["conda-forge"] +name = "LNP_ML" +platforms = ["linux-64", "osx-arm64"] +version = "0.1.0" + +[tasks] + +[dependencies] +loguru = "*" +ruff = "*" +tqdm = "*" +typer = "*" +pip = "*" +python = "3.8.*" + +[pypi-dependencies] +lnp_ml = { path = ".", editable = true } +chemprop = "==1.7.0" +setuptools = "*" +pandas = ">=2.0.3, <3" +openpyxl = ">=3.1.5, <4" +python-dotenv = ">=1.0.1, <2" +pyarrow = ">=17.0.0, <18" +fastparquet = ">=2024.2.0, <2025" +fastapi = ">=0.124.4, <0.125" +streamlit = ">=1.40.1, <2" +httpx = ">=0.28.1, <0.29" +uvicorn = ">=0.33.0, <0.34" +optuna = ">=4.5.0, <5" +captum = ">=0.7.0, <0.8" +transformers = ">=4.30, <4.46" +sentencepiece = "*" +protobuf = "*" diff --git a/pyproject.toml b/pyproject.toml index 37f2854..86b7890 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,32 +1,32 @@ -[build-system] -requires = ["flit_core >=3.2,<4"] -build-backend = "flit_core.buildapi" - -[project] -name = "lnp_ml" -version = "0.0.1" -description = "A short description of the project." -authors = [ - { name = "Wu Dinghong" }, -] -license = { file = "LICENSE" } -readme = "README.md" -classifiers = [ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License" -] -requires-python = ">=3.8" - - -[tool.ruff] -line-length = 99 -src = ["lnp_ml"] -include = ["pyproject.toml", "lnp_ml/**/*.py"] - -[tool.ruff.lint] -extend-select = ["I"] # Add import sorting - -[tool.ruff.lint.isort] -known-first-party = ["lnp_ml"] -force-sort-within-sections = true - +[build-system] +requires = ["flit_core >=3.2,<4"] +build-backend = "flit_core.buildapi" + +[project] +name = "lnp_ml" +version = "0.0.1" +description = "A short description of the project." +authors = [ + { name = "Wu Dinghong" }, +] +license = { file = "LICENSE" } +readme = "README.md" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License" +] +requires-python = ">=3.8" + + +[tool.ruff] +line-length = 99 +src = ["lnp_ml"] +include = ["pyproject.toml", "lnp_ml/**/*.py"] + +[tool.ruff.lint] +extend-select = ["I"] # Add import sorting + +[tool.ruff.lint.isort] +known-first-party = ["lnp_ml"] +force-sort-within-sections = true + diff --git a/reports/ablation_summary.csv b/reports/ablation_summary.csv new file mode 100644 index 0000000..ff52ed6 --- /dev/null +++ b/reports/ablation_summary.csv @@ -0,0 +1,5 @@ +variant,run_dir,size.mse_mean,size.mse_std,size.rmse_mean,size.rmse_std,size.mae_mean,size.mae_std,size.r2_mean,size.r2_std,delivery.mse_mean,delivery.mse_std,delivery.rmse_mean,delivery.rmse_std,delivery.mae_mean,delivery.mae_std,delivery.r2_mean,delivery.r2_std,pdi.accuracy_mean,pdi.accuracy_std,pdi.precision_mean,pdi.precision_std,pdi.recall_mean,pdi.recall_std,pdi.f1_mean,pdi.f1_std,ee.accuracy_mean,ee.accuracy_std,ee.precision_mean,ee.precision_std,ee.recall_mean,ee.recall_std,ee.f1_mean,ee.f1_std,toxic.accuracy_mean,toxic.accuracy_std,toxic.precision_mean,toxic.precision_std,toxic.recall_mean,toxic.recall_std,toxic.f1_mean,toxic.f1_std,biodist.kl_divergence_mean,biodist.kl_divergence_std,biodist.js_divergence_mean,biodist.js_divergence_std +baseline,models/abl/baseline/20260617_180556,0.2768235036159284,0.1346583260723207,0.508798491275714,0.13396864891266763,0.3427187344475763,0.06271329639776796,-0.9110994850991861,1.3609378589681,0.834075853950265,0.13581578656540713,0.9102708371721865,0.0740463162089242,0.634870878942305,0.04810398332825185,0.14309063048291837,0.06678544282427759,0.573809523809524,0.07315376902732006,0.40644301832628565,0.06081224559746048,0.591894166836878,0.15212645465643837,0.40503518503422653,0.07270554354315185,0.65,0.05460640448180816,0.5988843624524457,0.055997857124168736,0.6355952320322067,0.07902933872282923,0.5997699900861396,0.06505269720858664,0.9500396342534485,0.014290090778642328,0.7457142857142857,0.03149343955006944,0.9737706334802525,0.007575117962473199,0.81483431023254,0.0312513648447909,0.42024315728866957,0.04170766696370389,0.10843433388487847,0.010645869413863087 ++moe,models/abl/moe/20260617_191948,0.23034984029037256,0.09049026510650632,0.46822986556281965,0.105406988788203,0.32189987007849846,0.08014105320611228,-0.4728185006647179,0.5427422370821634,0.8054494222584121,0.16018870426337528,0.8929394867547544,0.09004718347937392,0.6145264492845487,0.045144810651025415,0.17842704120419808,0.06422601059093863,0.5896825396825397,0.05682229307831347,0.35469393906374463,0.055592769200553505,0.522735863838455,0.15050332076418682,0.3604048512722805,0.06427235489398077,0.6547619047619047,0.05481364015819684,0.6019542483742392,0.06379027980318479,0.6352859185632295,0.08160957226119422,0.6021181253673275,0.06960400235208303,0.9500779484296937,0.017755203225104002,0.7600104427736006,0.07046117058026663,0.9577096476824245,0.05611117888622105,0.813010272994035,0.03449626596837632,0.3520444477507348,0.08432681015154675,0.08975023050906776,0.021944673828634763 ++llm,models/abl/llm/20260617_203747,0.22339749912455512,0.13276860667147747,0.45253463978969516,0.13641810332564366,0.3048570797351743,0.07637999745755018,-0.2662118521181242,0.20796761595726418,0.810584411488471,0.17918852622038825,0.8948853549265088,0.09881605652183918,0.6158850481512493,0.04133793584599054,0.1761904116252725,0.0670662068919268,0.6,0.07271331378442132,0.382198316306454,0.059482007465697324,0.552886246650569,0.15151126540989962,0.3854764962481809,0.06295617241236845,0.6492063492063492,0.05989829290194668,0.5992000446776198,0.0738385570229797,0.6206719076130841,0.08494291371338275,0.5966089895417119,0.07618779152357238,0.9511890595408049,0.016071213375949578,0.7617961570593149,0.0689235340767993,0.958294443004062,0.05613748087593979,0.8151453855878632,0.03136647604932653,0.4240504874533223,0.049093469886439346,0.1077911642566912,0.015306583731384354 ++both,models/abl/both/20260617_232841,0.21249719869892153,0.083819203886272,0.4509291694638765,0.09570832161071456,0.29299021591121593,0.04711634555603193,-0.33611237791230353,0.3452040990881361,0.7425693610280117,0.15313439940788104,0.8571056675991812,0.08910238828097625,0.5779881956006352,0.040317114677088234,0.24162283519579483,0.08163767158765754,0.634126984126984,0.08009190991455786,0.36320050940978454,0.06018646749200912,0.5239036063335376,0.14740021344728976,0.37610884530892047,0.0760087699533074,0.6563492063492063,0.06431020501550125,0.6032694055441358,0.07290814030935075,0.6464310864983134,0.09580096959112427,0.6100615120789444,0.08078656411296503,0.9511890595408049,0.016071213375949578,0.7617961570593149,0.0689235340767993,0.958294443004062,0.05613748087593979,0.8151453855878632,0.03136647604932653,0.3412071963471256,0.07500564394419486,0.08684355805526371,0.020779098028044035 diff --git a/requirements.txt b/requirements.txt index c73d401..9bce2ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,22 +1,25 @@ -# 严格遵循 pixi.toml 的依赖版本 -# 注意: lnp_ml 本地包在 Dockerfile 中单独安装 - -# conda dependencies (in pixi.toml [dependencies]) -loguru -tqdm -typer - -# pypi dependencies (in pixi.toml [pypi-dependencies]) -chemprop==1.7.0 -setuptools -pandas>=2.0.3,<3 -openpyxl>=3.1.5,<4 -python-dotenv>=1.0.1,<2 -pyarrow>=17.0.0,<18 -fastparquet>=2024.2.0,<2025 -fastapi>=0.124.4,<0.125 -streamlit>=1.40.1,<2 -httpx>=0.28.1,<0.29 -uvicorn>=0.33.0,<0.34 -optuna>=4.5.0,<5 -captum>=0.7.0 +# 严格遵循 pixi.toml 的依赖版本 +# 注意: lnp_ml 本地包在 Dockerfile 中单独安装 + +# conda dependencies (in pixi.toml [dependencies]) +loguru +tqdm +typer + +# pypi dependencies (in pixi.toml [pypi-dependencies]) +chemprop==1.7.0 +setuptools +pandas>=2.0.3,<3 +openpyxl>=3.1.5,<4 +python-dotenv>=1.0.1,<2 +pyarrow>=17.0.0,<18 +fastparquet>=2024.2.0,<2025 +fastapi>=0.124.4,<0.125 +streamlit>=1.40.1,<2 +httpx>=0.28.1,<0.29 +uvicorn>=0.33.0,<0.34 +optuna>=4.5.0,<5 +captum>=0.7.0 +transformers>=4.30,<4.46 +sentencepiece +protobuf diff --git a/scripts/summarize_ablation.py b/scripts/summarize_ablation.py new file mode 100644 index 0000000..811efbd --- /dev/null +++ b/scripts/summarize_ablation.py @@ -0,0 +1,66 @@ +"""汇总消融实验结果:对比 baseline / +moe / +llm / +moe+llm 的 nested CV 指标。 + +读取每个 run 目录下的 summary.json(nested_cv 产出),输出对比表 CSV 并打印。 + +用法: + python scripts/summarize_ablation.py \ + --run baseline=models/nested_cv/baseline/ \ + --run +moe=models/nested_cv/moe/ \ + --run +llm=models/nested_cv/llm/ \ + --run +moe+llm=models/nested_cv/both/ \ + --out reports/ablation_summary.csv +""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +import pandas as pd + + +def load_summary_stats(run_dir: Path) -> dict: + """读取 run 目录的 summary.json,返回 summary_stats。""" + summary_path = run_dir / "summary.json" + if not summary_path.exists(): + raise FileNotFoundError(f"summary.json not found in {run_dir}") + with open(summary_path) as f: + return json.load(f).get("summary_stats", {}) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Summarize ablation nested-CV runs") + parser.add_argument( + "--run", action="append", default=[], + help="LABEL=run_dir,可重复传入多个变体", + ) + parser.add_argument("--out", type=str, default="reports/ablation_summary.csv") + args = parser.parse_args() + + if not args.run: + parser.error("至少需要一个 --run LABEL=run_dir") + + rows = [] + for spec in args.run: + label, sep, run_dir = spec.partition("=") + if not sep: + parser.error(f"--run 需为 LABEL=run_dir 形式,收到: {spec}") + stats = load_summary_stats(Path(run_dir)) + row = {"variant": label, "run_dir": run_dir} + for task, metrics in stats.items(): + for metric_name, value in metrics.items(): + row[f"{task}.{metric_name}"] = value + rows.append(row) + + df = pd.DataFrame(rows) + out = Path(args.out) + out.parent.mkdir(parents=True, exist_ok=True) + df.to_csv(out, index=False) + + print(df.to_string(index=False)) + print(f"\nSaved ablation summary to {out}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts_run/run_all.sh b/scripts_run/run_all.sh new file mode 100644 index 0000000..eebbd56 --- /dev/null +++ b/scripts_run/run_all.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +set -uo pipefail +cd "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +export TRANSFORMERS_OFFLINE=1 HF_HUB_OFFLINE=1 MOLT5_PATH=models/molt5-base PYTHONUNBUFFERED=1 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True +mkdir -p logs models/abl models/pretrain reports + +PT=models/pretrain_delivery.pt +NT=${NT:-15}; EPT=${EPT:-30} +MAX_RETRY=${MAX_RETRY:-5} +NEED_MIB=${NEED_MIB:-8000} + +GPUS=${GPUS:-0} +IFS=',' read -r -a GPU_ARR <<< "$GPUS" +PRETRAIN_GPU=${PRETRAIN_GPU:-${GPU_ARR[0]}} + +ts(){ awk '{ print strftime("%F %T"), $0; fflush() }'; } + +retry(){ + local log=$1; shift; local n=1 start + while :; do + start=$(date +%s) + echo "[$(date '+%F %T')] >>> START (try $n/$((MAX_RETRY+1))) : $*" | tee -a "$log" + if "$@" 2>&1 | ts | tee -a "$log"; then + echo "[$(date '+%F %T')] <<< DONE ($(( ($(date +%s)-start)/60 )) min)" | tee -a "$log"; return 0; fi + (( n > MAX_RETRY )) && { echo "[$(date '+%F %T')] !!! FAILED after $n tries" | tee -a "$log"; return 1; } + echo "[$(date '+%F %T')] retry in 30s..." | tee -a "$log"; sleep 30; ((n++)) + done +} + +NR=${NR:-3} +COMMON="--device cuda --n-trials $NT --epochs-per-trial $EPT --n-repeats $NR" +wait_free(){ + while :; do + local free + free=$(nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits \ + | sed -n "$((${CUDA_VISIBLE_DEVICES:-0}+1))p") + [ "${free:-0}" -ge "$NEED_MIB" ] && return 0 + echo "[$(date '+%F %T')] GPU${CUDA_VISIBLE_DEVICES:-0} 仅剩 ${free}MiB(<${NEED_MIB}),等待空闲...(60s)" >&2 + sleep 60 + done +} + +pretrain_arch(){ local name=$1; shift + local pt="models/pretrain/${name}/pretrain_delivery.pt" + if [ ! -f "$pt" ]; then + pt_py(){ wait_free; python -m lnp_ml.modeling.pretrain main --device cuda --output-dir "models/pretrain/${name}" "$@"; } + retry "logs/pretrain_${name}.log" pt_py "$@" >&2 + fi + echo "$pt" +} + +run_variant(){ local l=$1; shift + if ls models/abl/"$l"/*/summary.json >/dev/null 2>&1; then + echo "[$(date '+%F %T')] SKIP $l (已有完成结果)"; return 0 + fi + local pt; pt=$(pretrain_arch "$l" "$@") + run_py(){ wait_free; python -m lnp_ml.modeling.nested_cv_optuna $COMMON --init-from-pretrain "$pt" "$@" --output-dir "models/abl/$l"; } + retry "logs/nested_${l}.log" run_py "$@" +} +echo "[$(date '+%F %T')] GPUS=$GPUS PRETRAIN_GPU=$PRETRAIN_GPU" + +# 0) 预训练已并入 run_variant + +# 1) 消融 +if [ "${#GPU_ARR[@]}" -ge 2 ]; then + ( export CUDA_VISIBLE_DEVICES=${GPU_ARR[0]} + run_variant baseline + run_variant both --use-moe --use-llm --llm-model-path models/molt5-base + ) & G0=$! + ( export CUDA_VISIBLE_DEVICES=${GPU_ARR[1]} + run_variant moe --use-moe + run_variant llm --use-llm --llm-model-path models/molt5-base + ) & G1=$! + wait $G0 $G1 +else + export CUDA_VISIBLE_DEVICES=${GPU_ARR[0]} + run_variant baseline + run_variant moe --use-moe + run_variant llm --use-llm --llm-model-path models/molt5-base + run_variant both --use-moe --use-llm --llm-model-path models/molt5-base +fi + +# 2) 汇总 +latest(){ ls -dt "models/abl/$1"/*/summary.json 2>/dev/null | head -1 | xargs -r dirname; } +sum_args=() +for pair in "baseline:baseline" "+moe:moe" "+llm:llm" "+both:both"; do + label=${pair%%:*}; name=${pair##*:}; d=$(latest "$name") + [ -n "$d" ] && sum_args+=(--run "${label}=$d") +done +python scripts/summarize_ablation.py "${sum_args[@]}" \ + --out reports/ablation_summary.csv 2>&1 | ts | tee logs/summary.log \ No newline at end of file