From 43a28d534aa972a1ca1641dac0d5d7ce0ef7b154 Mon Sep 17 00:00:00 2001 From: gsy19971111 Date: Tue, 30 Sep 2025 16:41:02 +0800 Subject: [PATCH 1/5] =?UTF-8?q?Create=20=E7=BB=93=E9=A1=B9=E6=8A=A5?= =?UTF-8?q?=E5=91=8A.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...23\351\241\271\346\212\245\345\221\212.md" | 437 ++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 "jointContribution/AI_Climate_disease/\347\273\223\351\241\271\346\212\245\345\221\212.md" diff --git "a/jointContribution/AI_Climate_disease/\347\273\223\351\241\271\346\212\245\345\221\212.md" "b/jointContribution/AI_Climate_disease/\347\273\223\351\241\271\346\212\245\345\221\212.md" new file mode 100644 index 000000000..d1a942416 --- /dev/null +++ "b/jointContribution/AI_Climate_disease/\347\273\223\351\241\271\346\212\245\345\221\212.md" @@ -0,0 +1,437 @@ +# 项目信息 + +## 项目名称 +基于多模态深度学习的眼科疾病发病预测:融合 ERA5 气象数据与 UK Biobank 患者特征 + +--- + +## 时间规划(3 个月细化) + +### 第 1 月:数据准备与预处理 +- **第 1 周** + - 熟悉 ERA5-Land 数据接口与变量选择(确认 50 个气象特征变量)。 + - 搭建多进程下载框架,测试不同并发参数下的下载速度与稳定性。 +- **第 2 周** + - 批量下载并缓存 ERA5-Land 数据(覆盖 2010–2020 年英国地区)。 + - 完成数据格式转换(NetCDF → Zarr/HDF5),并进行时空重采样(0.1° → 20×20×24)。 +- **第 3 周** + - 收集 UK Biobank 患者特征(424 维),统计缺失值分布。 + - 尝试多种填补方法(均值/中位数、MICE、KNN、XGBoost),比较效果。 +- **第 4 周** + - 确定最终缺失值填补策略(XGBoost)。 + - 建立 ERA5 与 UKB 患者数据的对齐方案(空间位置 + 时间窗口)。 + - 输出对齐后的多模态训练样本。 + +--- + +### 第 2 月:模型开发与基线训练 +- **第 1 周** + - 搭建 3D ResNet18 编码器,用于逐日气象立体数据的空间特征提取。 + - 实现 TabM 模块,对 UKB 患者表型进行建模。 +- **第 2 周** + - 实现 Transformer 分支(时序注意力)。 + - 实现 AFNO 分支(频域稀疏建模),完成与 Transformer 的特征拼接与融合。 +- **第 3 周** + - 集成 MoE 模块(Transformer FFN、AFNO FFN、TabM projection、融合层可开关)。 + - 完成 Cross-Attention 融合机制,实现双模态交互。 +- **第 4 周** + - 进行基线训练(toy 数据 + 部分真实样本)。 + - 记录多标签分类指标(AUC、F1、Recall、Precision、PR-AUC、Hamming Loss)。 + - 调参与优化:batch size、学习率、专家数量(MoE)。 + +--- + +### 第 3 月:可解释性与总结 +- **第 1 周** + - 实现并测试 3D Grad-CAM,输出气象模态的空间关注区域。 + - 可视化 Self-Attention Heatmap(365 天的时序权重)。 +- **第 2 周** + - 实现 MoE 路由记录与聚类,统计不同专家的样本分布。 + - 探索 domain-specific 专家(如“冬季患者”、“老年患者”)是否自动分离。 +- **第 3 周** + - 整合可解释性结果: + - Grad-CAM(空间热点图) + - Attention Map(时间热点图) + - MoE 聚类(样本-专家分布) + - 撰写可解释性分析小结。 +- **第 4 周** + - 完成整体技术报告撰写(含方法、实验、困难与总结)。 + - 整理成果,准备论文初稿框架。 + +--- + + +## 方案描述 + +### 1. 数据准备 + +我们结合了两类异质模态的数据: + +- **气象模态(ERA5-Land)** + 我们从 ERA5-Land 下载了 **50 个气象与环境变量**(详见附录,例如 *2m 温度、土壤温度层、雪覆盖、降水量、辐射通量、植被指数* 等)。 + - 原始空间分辨率:0.1°(约 10×10 网格覆盖每个城市)。 + - 每个像素包含 **24 个垂直层**(如土壤层、大气层)。 + - 数据被统一 resize 为 **20×20×24** 的体素,每位患者匹配发病前 **365 天**的数据。 + - 我们使用 **多进程并行下载**加快 ERA5-Land 的数据拉取和处理。 + +- **患者模态(UK Biobank)** + 我们从 UK Biobank 中提取了 **424 项患者特征**(包括人口学、生活习惯、临床变量)。 + 对缺失值,我们采用 **XGBoost 预测填补**方法,相比均值/众数填充在临床异质数据上表现更好。 + 每个患者特征通过 **发病日期**和**居住城市**与 ERA5 气象数据对齐,实现时空匹配。 + +任务为 **多标签分类**:预测 **4 种眼科疾病**(如青光眼、白内障、AMD、糖尿病视网膜病变)的发病风险。由于患者可能合并多种眼病,因此使用多标签框架。 + +--- + +### 2. 模型结构 + +整体结构为一个 **双模态神经网络**,用于捕捉 **时空气象模式**和 **个体患者属性**,并在融合时保持可解释性和灵活性。 + +#### 2.1 气象分支:3D ResNet + Transformer + AFNO + +- **3D ResNet18 主干** + 输入为 **365 天 × 50 通道 × 20×20×24 体素**。 + - 采用 **3D 卷积**在 (time × space × depth) 三个维度上同时建模,能够捕捉 **气候随时间的演变、地表到土壤的能量传输、雪深积累**等模式。 + - 输出为 **每日一个 512 维 embedding**。 + +- **时序 Transformer(含 MoE)** + 每日 embedding 输入到 **Transformer 编码器**: + - **自注意力**用于捕捉 365 天长时依赖。 + - **前馈层 (FFN) 替换为 MoE**:每个时间片的 token 被路由到不同专家,使得模型可以专门化处理 **不同气候类型**(如海洋性气候 vs. 大陆性气候)。 + +- **AFNO 分支(Adaptive Fourier Neural Operator)** + 并行使用 **AFNO** 捕捉气象的周期性: + - 将时间序列通过 **FFT** 转换到频率域。 + - 使用 **分块对角的复数线性变换**学习主要频率模式(如季节性波动、短期振荡)。 + - 通过 **soft-shrinkage 稀疏化**抑制非主要频率的噪声。 + - **逆 FFT**还原时域信号。 + 同时,AFNO 分支也加入了 **MoE**,使不同频率特征由不同专家处理,适应气候区域差异。 + +- **气象时序特征融合** + Transformer 与 AFNO 的输出拼接后,经线性层映射回 512 维,得到综合的气象时序表示。 + +--- + +#### 2.2 患者分支:TabM (Tabular Mixture) + +患者 424 维特征通过 **TabM**(Yandex Research 提出)处理。 + +- **核心原理** + TabM 提出了一种 **高效集成 (efficient ensemble)** 机制: + - 主权重矩阵 \(W\) 在所有子模型间共享。 + - 每个子模型(专家)通过一对 **低秩缩放向量** \((r_e, s_e)\) 调节输入/输出: + \[ + y_e = \big[ (x \odot r_e) W^\top \big] \odot s_e + b_e + \] + 其中 \(x\) 为输入特征,\(\odot\) 表示逐元素乘,\(b_e\) 为每个子模型的偏置。 + - 这样可以在几乎不增加参数量的情况下,构建一个内部的“打包集成模型”。 + +- **优点** + - 让模型在面对 **分布差异的亚群体**时更加鲁棒(例如不同生活方式的人群)。 + - 内部集成提高了 **泛化能力**和 **不确定性估计**。 + - 计算成本几乎与单模型相同。 + +我们将 TabM 输出投影到 512 维,与气象分支对齐。 + +--- + +#### 2.3 跨模态融合 + +采用 **双向交叉注意力 (bi-directional cross-attention)**: + +- **气象 → 患者**:患者 token 在气象序列上查询,关注与疾病最相关的时间片。 +- **患者 → 气象**:气象 summary token 在患者 embedding 上查询,将气候解释与个体特征结合。 + +两个更新后的 token 拼接,经 MLP 得到融合表示。 +可选地在这一层加入 **MoE 头**,让模型专门化处理不同疾病亚型。 + +--- + +#### 2.4 分类器 + +最终融合表示经线性分类头,预测 **4 个眼科疾病的风险概率**。 +损失函数使用 **binary cross-entropy with logits**。 + +--- + +### 3. 训练与推理 + +- **损失函数**:带类别权重的 BCE。 + +- **优化器**:Adam,带梯度裁剪。 + +- **推理时的检索增强 (Retrieval-Augmented Inference)** + 推理时,我们利用训练集构建一个特征库: + - 用模型的中间表示作为索引。 + - 在测试样本预测时,检索出 k 个最相似的训练样本(相似度可选 **余弦**或 **欧式距离**)。 + - 计算邻居的平均概率 \(p_{knn}\)。 + - 与模型预测概率 \(p_{model}\) 融合: + \[ + p_{final} = (1-\alpha)\,p_{model} + \alpha\,p_{knn} + \] + +这样能缓解训练/测试分布差异。 + +--- + +### 4. 可解释性 + +我们设计了多层次的可解释机制: + +- **3D Grad-CAM**:可视化气象体素中(纬度 × 经度 × 深度)最关键的区域。 +- **Transformer 注意力图**:显示模型在 365 天中关注的关键时段(如冬季骤降)。 +- **AFNO 频率分析**:指出模型利用的主导频率成分。 +- **MoE 路由可视化**:分析样本被分配到的专家,揭示潜在的病人亚群体或气候模式(例如“雪覆盖驱动的风险群体”)。 + + + +# 项目总结 + +## 已完成工作 +- 搭建多进程 ERA5-Land 数据下载框架,完成 50 个气象变量的收集。 +- 实现数据格式转换与重采样(0.1° → 20×20×24),构建日尺度气象数据立方体。 +- 收集并清洗 UK Biobank 患者特征(424 维),通过 XGBoost 完成缺失值填补。 +- 设计并实现多模态模型框架(3D ResNet + Transformer + AFNO + TabM + MoE + Cross-Attn)。 +- 完成 toy dataset 与真实数据子集的基线训练,验证模型结构可行性。 + +## 遇到的问题及解决方案 +- **数据下载效率低** → 使用多进程并行下载,大幅缩短获取 ERA5 数据的时间。 +- **数据申请受阻**→ 原计划中希望使用UKB基因数据库以及细粒度到经纬度的数据,但是申请流程太长采用城市地理中心,这样原先预设的时空细粒度难以对齐的问题反而不严重了。 +- **缺失值比例高** → 采用 XGBoost 学习型填补方法,相比均值/中位数填补更符合变量间分布关系。 +- **数据对齐复杂** → 按照患者发病时间窗口(365 天)和居住城市坐标匹配 ERA5 数据,构建个体化时空样本。 +- **PaddlePaddle 模块限制** → 例如 `nn.MultiHeadAttention` 不支持 `need_weights` 参数,导致 attention 可解释性实现受限;通过自定义 Cross-Attn 与保存注意力矩阵解决。 +- **气象数据噪声较多** → 采用了传统Transformer和时间序列维度上的AFNO双路transformer提取时域频域特征。 +- **模型需要可解释性方面的贡献** →Transformer 与 MoE 模块默认不输出可解释信息,容易形成“黑箱”;我们通过 自定义 Cross-Attention 权重输出、3D Grad-CAM 空间可视化、时序 Attention Map、AFNO 频域分解 与 MoE 路由可视化 等手段,显式揭示了模型在空间、时间、频率及亚群体层面的关注点。这些改进不仅解决了可解释性瓶颈,也使模型能够为临床专家与政策制定提供透明、可追溯的证据。 +- **计算负担大** → 模型包含 3D CNN + 双 Transformer 分支 + MoE,需依赖 多块A100 GPU 训练;经过分析主要时间复杂度集中在3D CNN上,我们通过气象特征筛选减少3D CNN通道数量,通过取对最后一个维度(小时)平均压缩维度,将3D CNN替换为2D CNN. +## 未来工作计划 + + +在已有的 **多模态深度学习框架** 基础上(融合 ERA5 气象数据与 UK Biobank 等多源患者数据),本研究聚焦于 **显式级联建模**(环境 → 系统 → 暴露 → 生物 → 疾病),构建跨模态、可解释的疾病预测与干预模拟平台。总体目标是: + +1. 在 *Nature Communications* / *Nature Medicine/AAAI/IJCAI* 发表 1–2 篇论文; +2. 提出适用于多模态级联预测的通用框架; +3. 验证模型在 UKB、CKB、FinnGen、BBJ 等多个 Biobank 上的可扩展性; +4. 提供气象与环境干预下的疾病风险模拟; +5. 为城市规划、空气质量控制、疾病防控政策提供量化证据。 + +## 测试样例 +见paddlepaddle文件,考虑到完整数据运行时间过长因此我们再里面提供了仿真数据构成的toydataloader替代。 + + +# Project Information + +## Project Title +Ophthalmic Disease Onset Prediction Based on Multimodal Deep Learning: Integrating ERA5 Meteorological Data and UK Biobank Patient Features + +--- + +## Timeline (Detailed for 3 Months) + +### Month 1: Data Preparation and Preprocessing +- **Week 1** + - Familiarize with ERA5-Land data interfaces and variable selection (confirm 50 meteorological feature variables). + - Build a multi-process downloading framework and test download speed/stability under different concurrency parameters. +- **Week 2** + - Batch download and cache ERA5-Land data (covering UK regions from 2010–2020). + - Complete data format conversion (NetCDF → Zarr/HDF5) and perform spatiotemporal resampling (0.1° → 20×20×24). +- **Week 3** + - Collect UK Biobank patient features (424 dimensions) and analyze missing value distributions. + - Test multiple imputation methods (mean/median, MICE, KNN, XGBoost) and compare performance. +- **Week 4** + - Finalize missing value imputation strategy (XGBoost). + - Establish alignment scheme between ERA5 and UKB patient data (spatial location + time window). + - Output aligned multimodal training samples. + +--- + +### Month 2: Model Development and Baseline Training +- **Week 1** + - Build a 3D ResNet18 encoder for extracting spatial features from daily meteorological volumetric data. + - Implement TabM module for modeling UKB patient phenotypes. +- **Week 2** + - Implement Transformer branch (temporal attention). + - Implement AFNO branch (frequency-domain sparse modeling) and complete feature concatenation and fusion with Transformer outputs. +- **Week 3** + - Integrate MoE modules (Transformer FFN, AFNO FFN, TabM projection, fusion layer with switchable experts). + - Complete Cross-Attention fusion for bimodal interaction. +- **Week 4** + - Conduct baseline training (toy dataset + partial real samples). + - Record multi-label classification metrics (AUC, F1, Recall, Precision, PR-AUC, Hamming Loss). + - Hyperparameter tuning: batch size, learning rate, number of experts (MoE). + +--- + +### Month 3: Explainability and Summary +- **Week 1** + - Implement and test 3D Grad-CAM to visualize spatial attention regions in meteorological modality. + - Visualize Self-Attention Heatmap (temporal weights over 365 days). +- **Week 2** + - Implement MoE routing recording and clustering; analyze sample distributions across experts. + - Explore whether domain-specific experts (e.g., "winter patients," "elderly patients") are automatically separated. +- **Week 3** + - Consolidate explainability results: + - Grad-CAM (spatial hotspots) + - Attention Map (temporal hotspots) + - MoE clustering (sample-expert distribution) + - Draft interpretability analysis summary. +- **Week 4** + - Complete technical report (methods, experiments, challenges, and conclusions). + - Organize results and prepare initial paper framework. + +--- + +## Project Design + +### 1. Data Preparation + +We integrate two heterogeneous modalities: + +- **Meteorological Modality (ERA5-Land)** + Downloaded **50 meteorological and environmental variables** (e.g., *2m temperature, soil temperature layers, snow cover, precipitation, radiation flux, vegetation index*). + - Original spatial resolution: 0.1° (~10×10 grid per city). + - Each pixel includes **24 vertical layers** (e.g., soil, atmosphere). + - Resized to **20×20×24** voxels, with each patient matched to **365 days** of data before disease onset. + - Used **multi-process parallel downloading** to accelerate ERA5-Land retrieval and preprocessing. + +- **Patient Modality (UK Biobank)** + Extracted **424 patient features** (demographics, lifestyle, clinical variables). + For missing values, applied **XGBoost-based predictive imputation**, which outperforms mean/median filling for heterogeneous clinical data. + Patient features are aligned with ERA5 meteorological data via **onset date** and **residential location**, enabling spatiotemporal matching. + +**Task**: Multi-label classification predicting **4 ophthalmic diseases** (e.g., glaucoma, cataract, AMD, diabetic retinopathy). As patients may develop multiple diseases, a multi-label framework is required. + +--- + +### 2. Model Architecture + +The overall design is a **bimodal neural network**, capturing both **spatiotemporal meteorological patterns** and **individual patient attributes**, while ensuring interpretability and flexibility. + +#### 2.1 Meteorological Branch: 3D ResNet + Transformer + AFNO + +- **3D ResNet18 Backbone** + Input: **365 days × 50 channels × 20×20×24 voxels**. + - **3D convolutions** jointly model (time × space × depth), capturing **seasonal changes, soil-atmosphere energy transfer, and snow accumulation**. + - Outputs **one 512-d embedding per day**. + +- **Temporal Transformer (with MoE)** + Daily embeddings are fed into a **Transformer encoder**: + - **Self-attention** captures long-term dependencies across 365 days. + - **FFN replaced by MoE**: each token is routed to different experts, allowing specialized handling of **climate types** (e.g., maritime vs. continental). + +- **AFNO (Adaptive Fourier Neural Operator) Branch** + Models periodicity in parallel: + - Convert sequence via **FFT** to frequency domain. + - Apply **block-diagonal complex linear transforms** to learn dominant frequencies (e.g., seasonal cycles, short-term oscillations). + - Use **soft-shrinkage sparsity** to suppress noise. + - Perform **inverse FFT** to reconstruct. + - Added MoE to allow frequency-specific specialization across regions. + +- **Meteorological Temporal Feature Fusion** + Concatenate Transformer and AFNO outputs, then project back to 512-d, forming integrated meteorological representations. + +--- + +#### 2.2 Patient Branch: TabM (Tabular Mixture) + +Patient 424-d features are modeled with **TabM** (proposed by Yandex Research). + +- **Core Idea** + TabM is an **efficient ensemble mechanism**: + - Weight matrix \(W\) is shared across sub-models. + - Each expert adjusts input/output via low-rank scaling vectors \((r_e, s_e)\): + \[ + y_e = \big[ (x \odot r_e) W^\top \big] \odot s_e + b_e + \] + where \(x\) is input, \(\odot\) is element-wise multiplication, and \(b_e\) is bias. + - Builds an ensemble internally with minimal additional parameters. + +- **Advantages** + - Robust to **population subgroup heterogeneity** (e.g., lifestyle differences). + - Improves **generalization** and **uncertainty estimation**. + - Computationally comparable to a single model. + +TabM outputs are projected to 512-d for alignment with meteorological features. + +--- + +#### 2.3 Cross-Modal Fusion + +Implemented **bi-directional cross-attention**: + +- **Meteorology → Patient**: patient tokens query meteorological sequences to attend to disease-relevant time slices. +- **Patient → Meteorology**: meteorological summary tokens query patient embeddings, linking climate patterns with individual traits. + +Fused tokens are concatenated and passed through MLP. +Optionally, a **MoE head** is added to specialize for disease subtypes. + +--- + +#### 2.4 Classifier + +The fused representation is passed to a linear classifier for **multi-label risk prediction of 4 ophthalmic diseases**. +Loss function: **binary cross-entropy with logits**. + +--- + +### 3. Training and Inference + +- **Loss Function**: BCE with class weights. +- **Optimizer**: Adam with gradient clipping. +- **Retrieval-Augmented Inference (RAI)**: + - Build feature index from training embeddings. + - At inference, retrieve *k* nearest neighbors. + - Compute average probability \(p_{knn}\). + - Combine with model prediction \(p_{model}\): + \[ + p_{final} = (1-\alpha)\,p_{model} + \alpha\,p_{knn} + \] + - Mitigates train-test distribution shift. + +--- + +### 4. Explainability + +Multi-level interpretability mechanisms: + +- **3D Grad-CAM**: highlights key spatial voxels (lat × lon × depth). +- **Transformer Attention Maps**: identify critical time windows (e.g., winter drops). +- **AFNO Frequency Analysis**: reveal dominant periodic components. +- **MoE Routing Visualization**: analyze expert assignments, revealing subgroups (e.g., "snow-driven high-risk patients"). + +--- + +# Project Summary + +## Completed Work +- Built multi-process ERA5-Land data downloading framework; collected 50 meteorological variables. +- Converted and resampled data (0.1° → 20×20×24) to daily meteorological cubes. +- Collected and cleaned UK Biobank patient features (424-d); imputed missing values using XGBoost. +- Designed and implemented multimodal model (3D ResNet + Transformer + AFNO + TabM + MoE + Cross-Attn). +- Conducted baseline training on toy and subset datasets, validating feasibility. + +## Challenges and Solutions +- **Low data download efficiency** → Solved with multi-process parallel downloading. +- **High missing rates** → Addressed via XGBoost predictive imputation, outperforming mean/median. +- **Complex data alignment** → Built spatiotemporal matching pipeline using onset date + residential location. +- **Framework limitation (PaddlePaddle)** → `nn.MultiHeadAttention` lacked `need_weights`; resolved by custom Cross-Attn with weight saving. +- **Need for interpretability contributions** → Tackled the “black box” issue by integrating: + - Cross-Attention weight outputs + - 3D Grad-CAM spatial visualization + - Temporal attention maps + - AFNO frequency decomposition + - MoE routing visualization + These enhancements provided transparency at spatial, temporal, frequency, and subgroup levels, supporting clinical and policy insights. +- **Heavy computational load** → Model combines 3D CNN + dual Transformers + MoE, requiring multi-GPU (A100); solved using gradient clipping, model quantization, and distributed parallel training. + +--- + +## Future Work Plan + +Building on the existing **multimodal deep learning framework** (ERA5 meteorology + UK Biobank features), the research will focus on **explicit cascade modeling** (Environment → System → Exposure → Biology → Disease) to construct an interpretable, multimodal disease prediction and intervention simulation platform. + +**Goals:** +1. Publish 1–2 papers in *Nature Communications*, *Nature Medicine*, AAAI, or IJCAI. +2. Propose a generalizable multimodal cascade prediction framework. +3. Validate scalability across multiple Biobanks (UKB, CKB, FinnGen, BBJ). +4. Provide disease risk simulations under environmental and climate interventions. +5. Deliver quantitative evidence for urban planning, air quality control, and public health policy. From d5354bc61e5a664a3a904e690fab42d81a65d17c Mon Sep 17 00:00:00 2001 From: gsy19971111 Date: Tue, 30 Sep 2025 17:29:07 +0800 Subject: [PATCH 2/5] Add files via upload --- .../ERA5_land_download.ipynb | 22460 ++++++++++++++++ .../AI_Climate_disease/XGBoost_imputer.ipynb | 523 + .../paddle_model_samples.ipynb | 6012 +++++ 3 files changed, 28995 insertions(+) create mode 100644 jointContribution/AI_Climate_disease/ERA5_land_download.ipynb create mode 100644 jointContribution/AI_Climate_disease/XGBoost_imputer.ipynb create mode 100644 jointContribution/AI_Climate_disease/paddle_model_samples.ipynb diff --git a/jointContribution/AI_Climate_disease/ERA5_land_download.ipynb b/jointContribution/AI_Climate_disease/ERA5_land_download.ipynb new file mode 100644 index 000000000..aef090359 --- /dev/null +++ b/jointContribution/AI_Climate_disease/ERA5_land_download.ipynb @@ -0,0 +1,22460 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "abddfd3083344f1aa9b83cde136175c9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_246b96a1fc424e7cb24cc819abf02e70", + "IPY_MODEL_2e9287600c3d470491f148056550e8e3", + "IPY_MODEL_b8d43810f3734158aea02043eb1e4200" + ], + "layout": "IPY_MODEL_054ecc18232e4bddb53babf0572a4c55" + } + }, + "246b96a1fc424e7cb24cc819abf02e70": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5320125c218c4b45b9c6e00ff9814b1c", + "placeholder": "​", + "style": "IPY_MODEL_c646729eb0b14e0889e5cf03ab9848c4", + "value": "a9ac9771fffda64b460f0259f90e3bee.zip:  94%" + } + }, + "2e9287600c3d470491f148056550e8e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4845a0b7f06b4f95860ad0e185905cb2", + "max": 36872509, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7b99527a796e4bec8e20c335523b4ed3", + "value": 36872509 + } + }, + "b8d43810f3734158aea02043eb1e4200": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6154f4e3945642719a9b2390bf294699", + "placeholder": "​", + "style": "IPY_MODEL_f300df27365a4ec49b600c4fcc1fc774", + "value": " 33.0M/35.2M [00:02<00:00, 27.1MB/s]" + } + }, + "054ecc18232e4bddb53babf0572a4c55": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "5320125c218c4b45b9c6e00ff9814b1c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c646729eb0b14e0889e5cf03ab9848c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4845a0b7f06b4f95860ad0e185905cb2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7b99527a796e4bec8e20c335523b4ed3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6154f4e3945642719a9b2390bf294699": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f300df27365a4ec49b600c4fcc1fc774": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dd595f15b9f54a678799db1a91927049": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_25c47322534343219528ad19a50e237d", + "IPY_MODEL_5d942d2c66634d828fd29c625fafbe98", + "IPY_MODEL_304fa1191909430d9d8f31d4865dd77b" + ], + "layout": "IPY_MODEL_06c1a151059d4e2297a993399ba60a45" + } + }, + "25c47322534343219528ad19a50e237d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d8825f41311a4424bfd3c414d3313542", + "placeholder": "​", + "style": "IPY_MODEL_acbeb24fe3e24ec296be5489e03b0955", + "value": "9fde4128b716a84b69cd5cea6f9b0f7d.zip:  95%" + } + }, + "5d942d2c66634d828fd29c625fafbe98": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cb9af2c2bd9f4f0a9e7a33e31d619a35", + "max": 39759344, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d8239b1847944eea85d756610eb4c268", + "value": 39759344 + } + }, + "304fa1191909430d9d8f31d4865dd77b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ca26fe92af234840b6ec125877249da8", + "placeholder": "​", + "style": "IPY_MODEL_02a80be6b17e459eb8eb969a15b7f33b", + "value": " 36.0M/37.9M [00:02<00:00, 27.4MB/s]" + } + }, + "06c1a151059d4e2297a993399ba60a45": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "d8825f41311a4424bfd3c414d3313542": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "acbeb24fe3e24ec296be5489e03b0955": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "cb9af2c2bd9f4f0a9e7a33e31d619a35": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d8239b1847944eea85d756610eb4c268": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ca26fe92af234840b6ec125877249da8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "02a80be6b17e459eb8eb969a15b7f33b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "803e3b8c95e4427484c0f7cf5d8d2403": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3374032b59254300b8b437483a378db1", + "IPY_MODEL_60dc1e70e28647dea2bd1690e3c67631", + "IPY_MODEL_6de012b52d70485ab5ba8e04c8422058" + ], + "layout": "IPY_MODEL_a0413d8ea4394330af2d9150d04e0160" + } + }, + "3374032b59254300b8b437483a378db1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5e1799e0323d47ed9efe6b80c982a7a0", + "placeholder": "​", + "style": "IPY_MODEL_499ac97b8ee6479ab9a317d65a4777b9", + "value": "2c84c9a9b2f9b073de4fbed5a88f2ca2.zip:  93%" + } + }, + "60dc1e70e28647dea2bd1690e3c67631": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d358e0ecaa3c49ab8ecf661ef5f9a30e", + "max": 38134610, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d7705463c3194769994a89481631b9e9", + "value": 38134610 + } + }, + "6de012b52d70485ab5ba8e04c8422058": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8d9405baf4d24602b7c0ef5e2815990d", + "placeholder": "​", + "style": "IPY_MODEL_01aa77c42b3347bda1eb4773d65dee8b", + "value": " 34.0M/36.4M [00:02<00:00, 25.9MB/s]" + } + }, + "a0413d8ea4394330af2d9150d04e0160": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "5e1799e0323d47ed9efe6b80c982a7a0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "499ac97b8ee6479ab9a317d65a4777b9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d358e0ecaa3c49ab8ecf661ef5f9a30e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d7705463c3194769994a89481631b9e9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8d9405baf4d24602b7c0ef5e2815990d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "01aa77c42b3347bda1eb4773d65dee8b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2bb11a3e03f84d619c648ff099b86234": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_640800d3a3e14f0e87a856995ed4d2ad", + "IPY_MODEL_9aaa010dd6aa4b34aa8c75b07efb0455", + "IPY_MODEL_106add9b3e13414bb798c61e40d18483" + ], + "layout": "IPY_MODEL_5e6c14bbe14c44a3b09a616a4e5da2f9" + } + }, + "640800d3a3e14f0e87a856995ed4d2ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d218ad783b384a6b90c7794c9b9749f4", + "placeholder": "​", + "style": "IPY_MODEL_c7e3ebe6e8f644348fe28aad3166b3aa", + "value": "f08f9fe7b1c2d3f827c2cedbed2c6473.zip:  99%" + } + }, + "9aaa010dd6aa4b34aa8c75b07efb0455": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e1f4f436e4c44202bfeb22ea36f14f3d", + "max": 38180257, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_36adcefa79314ec8b5e2813c25c7cc84", + "value": 38180257 + } + }, + "106add9b3e13414bb798c61e40d18483": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_875bd0c85fbc4da48a224f1b8a8716bf", + "placeholder": "​", + "style": "IPY_MODEL_e086ff8d43bf4a2fb070cfcb9adbfa49", + "value": " 36.0M/36.4M [00:02<00:00, 21.4MB/s]" + } + }, + "5e6c14bbe14c44a3b09a616a4e5da2f9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "d218ad783b384a6b90c7794c9b9749f4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c7e3ebe6e8f644348fe28aad3166b3aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e1f4f436e4c44202bfeb22ea36f14f3d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "36adcefa79314ec8b5e2813c25c7cc84": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "875bd0c85fbc4da48a224f1b8a8716bf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e086ff8d43bf4a2fb070cfcb9adbfa49": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4a6271c69aec4fe4882175c73184eb34": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f981194eeea64dd99111e8baf806e04f", + "IPY_MODEL_4cb978510ae34cb0aeb3963338d1c718", + "IPY_MODEL_17233284212e406182b607abc159b46d" + ], + "layout": "IPY_MODEL_c3f13a1fb39e4b50af8b806cc735ff42" + } + }, + "f981194eeea64dd99111e8baf806e04f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c6269bb733d64f59b23500ce7752a125", + "placeholder": "​", + "style": "IPY_MODEL_8c683779e3ec4d1cab7536ebc2def9a6", + "value": "d5de1149114569c6a7afc42bc051fa36.zip:  97%" + } + }, + "4cb978510ae34cb0aeb3963338d1c718": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6d29cddf1b6849a99ac88d09b7fe565f", + "max": 36930148, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_26d06aab3c504c7582c9444b3f87f936", + "value": 36930148 + } + }, + "17233284212e406182b607abc159b46d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_974fe5d0fbf24460aac95d062b9c661b", + "placeholder": "​", + "style": "IPY_MODEL_ede5ec13f00c4281a89ce9f0e7be4397", + "value": " 34.0M/35.2M [00:03<00:00, 18.1MB/s]" + } + }, + "c3f13a1fb39e4b50af8b806cc735ff42": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "c6269bb733d64f59b23500ce7752a125": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8c683779e3ec4d1cab7536ebc2def9a6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6d29cddf1b6849a99ac88d09b7fe565f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "26d06aab3c504c7582c9444b3f87f936": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "974fe5d0fbf24460aac95d062b9c661b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ede5ec13f00c4281a89ce9f0e7be4397": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "61d74f0421f940f79553b434107388b6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_13b0b32bdf30498f8d7663e1d0920610", + "IPY_MODEL_fd96eff731794286ab0fa1b56ccb43c7", + "IPY_MODEL_5f17146cf58e4a5989e153880c2506a2" + ], + "layout": "IPY_MODEL_df1cb0decee6449386adce1054a8f8cc" + } + }, + "13b0b32bdf30498f8d7663e1d0920610": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cc9cf30d0d994d40bd29cd1ef0ab195f", + "placeholder": "​", + "style": "IPY_MODEL_f428eae679984083afada8c6c5199fd3", + "value": "f2a9de98b48723754dc06ea573ef1212.zip:  96%" + } + }, + "fd96eff731794286ab0fa1b56ccb43c7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_388f817495084ff8be598de3bc6471f9", + "max": 38179969, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_964ad91f0603424ca9ca70f94bceb4b4", + "value": 38179969 + } + }, + "5f17146cf58e4a5989e153880c2506a2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d84a9895767f44709ff71a4bec71d5e5", + "placeholder": "​", + "style": "IPY_MODEL_d1d2a64e5cc74ffa838579fa20f91705", + "value": " 35.0M/36.4M [00:02<00:00, 19.3MB/s]" + } + }, + "df1cb0decee6449386adce1054a8f8cc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "cc9cf30d0d994d40bd29cd1ef0ab195f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f428eae679984083afada8c6c5199fd3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "388f817495084ff8be598de3bc6471f9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "964ad91f0603424ca9ca70f94bceb4b4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d84a9895767f44709ff71a4bec71d5e5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d1d2a64e5cc74ffa838579fa20f91705": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "25ef0ecfcbd149babb324baf6b8e6116": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d1695b515c16464eaa6b03f98bd38800", + "IPY_MODEL_cc5cce42f206419e9fcf2852d84b59c7", + "IPY_MODEL_4f332d59374a4264adc0cdb1b4cd4e1d" + ], + "layout": "IPY_MODEL_fb11160a3d4740f78fa13ae894610468" + } + }, + "d1695b515c16464eaa6b03f98bd38800": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2b027b593500454aa2d5fbc6b3437ceb", + "placeholder": "​", + "style": "IPY_MODEL_cbf449be10104f878206c76cc0fb0a91", + "value": "98a0a4fd9abe6141182b100a762a5d20.zip:  99%" + } + }, + "cc5cce42f206419e9fcf2852d84b59c7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b3019c543d44690afbc2b129d095036", + "max": 39132220, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_375b316f3a6241d8ab555a3ff34cae4a", + "value": 39132220 + } + }, + "4f332d59374a4264adc0cdb1b4cd4e1d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bf67926117f34fc38abfdefc063e1291", + "placeholder": "​", + "style": "IPY_MODEL_2f0650cc121c4e64ae7e3aed484e7ec4", + "value": " 37.0M/37.3M [00:03<00:00, 21.3MB/s]" + } + }, + "fb11160a3d4740f78fa13ae894610468": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "2b027b593500454aa2d5fbc6b3437ceb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cbf449be10104f878206c76cc0fb0a91": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3b3019c543d44690afbc2b129d095036": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "375b316f3a6241d8ab555a3ff34cae4a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "bf67926117f34fc38abfdefc063e1291": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2f0650cc121c4e64ae7e3aed484e7ec4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "48367b14400f4cbfb8baccf954fbe5d7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3a0f58dc1d7d4f18bf28215c5b73e330", + "IPY_MODEL_c12b2f2c54a84ff9b0aab69fa53d9693", + "IPY_MODEL_ff0bfdaa183843a2ab08f561fb64a7e6" + ], + "layout": "IPY_MODEL_2299331af2854dd487df5d916e63584e" + } + }, + "3a0f58dc1d7d4f18bf28215c5b73e330": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9cee787a1018406b8ac4c81edd037716", + "placeholder": "​", + "style": "IPY_MODEL_f49fdf01bed74de9a2e3a3605e511ae8", + "value": "1c88a17df890b79e608613e0a29e10d3.zip:  94%" + } + }, + "c12b2f2c54a84ff9b0aab69fa53d9693": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_485a601ae4bc42a9adca1d844c49f953", + "max": 36867451, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_88f5011c1f3d448da2a705c1b5dd2088", + "value": 36867451 + } + }, + "ff0bfdaa183843a2ab08f561fb64a7e6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7ed68a0bd6364240b8ea4fe49c2a3913", + "placeholder": "​", + "style": "IPY_MODEL_0ac9d0f86c7a4ae7a3e3ef38da9b1213", + "value": " 33.0M/35.2M [00:02<00:00, 25.2MB/s]" + } + }, + "2299331af2854dd487df5d916e63584e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "9cee787a1018406b8ac4c81edd037716": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f49fdf01bed74de9a2e3a3605e511ae8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "485a601ae4bc42a9adca1d844c49f953": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "88f5011c1f3d448da2a705c1b5dd2088": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7ed68a0bd6364240b8ea4fe49c2a3913": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0ac9d0f86c7a4ae7a3e3ef38da9b1213": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9898dc408b784934915b571f3d7ccf31": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_074a39eb3a904486b87e45e29595a2b2", + "IPY_MODEL_9554690da76545f0989ab5c4ee45ceaf", + "IPY_MODEL_965b2a9aa08145ea891b5219b91d6913" + ], + "layout": "IPY_MODEL_44043a588ee54fa5afdeaedf7807b82b" + } + }, + "074a39eb3a904486b87e45e29595a2b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b612ece24d9d4f5ea99fbab44ebf1966", + "placeholder": "​", + "style": "IPY_MODEL_2391e1bf5b9e4e5fb01ab62862069de0", + "value": "eedd75237d6f447e83d03594fdb83a47.zip:  95%" + } + }, + "9554690da76545f0989ab5c4ee45ceaf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e5cfb106e71a4da784c38692a56a6be4", + "max": 35470213, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c998427d6b7947e48cfa0a297a4fdf93", + "value": 35470213 + } + }, + "965b2a9aa08145ea891b5219b91d6913": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ed0ce18d5cba47bd89324ae61df0e468", + "placeholder": "​", + "style": "IPY_MODEL_1e228359390042809ed47886e8b96666", + "value": " 32.0M/33.8M [00:02<00:00, 26.1MB/s]" + } + }, + "44043a588ee54fa5afdeaedf7807b82b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "b612ece24d9d4f5ea99fbab44ebf1966": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2391e1bf5b9e4e5fb01ab62862069de0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e5cfb106e71a4da784c38692a56a6be4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c998427d6b7947e48cfa0a297a4fdf93": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ed0ce18d5cba47bd89324ae61df0e468": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1e228359390042809ed47886e8b96666": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f1aba38e590640e598b5c697e6593b23": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9cf246163ce1452ba7dedac35868915d", + "IPY_MODEL_7f54d51fc0414a438c3a46006df51832", + "IPY_MODEL_7b804abdc9eb4355905cd86ab88f1de2" + ], + "layout": "IPY_MODEL_ee90fd34c707477f82155ab6521a3780" + } + }, + "9cf246163ce1452ba7dedac35868915d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d70d0672ef594a46804db1908e2ff1f3", + "placeholder": "​", + "style": "IPY_MODEL_4404b23833f449f5bb4056059088714d", + "value": "54826f3d0279c33e84dbba74c1a2da14.zip:  96%" + } + }, + "7f54d51fc0414a438c3a46006df51832": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2db34ff2e2f049bf88323bf6c63b3ad6", + "max": 38224397, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ae1402a2bf2342f88225de852ae8ef7f", + "value": 38224397 + } + }, + "7b804abdc9eb4355905cd86ab88f1de2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_32d75965b82c4e88874b2dbf6a84394c", + "placeholder": "​", + "style": "IPY_MODEL_e99bcc9ba6794a918de66a9698ed6a21", + "value": " 35.0M/36.5M [00:02<00:00, 28.0MB/s]" + } + }, + "ee90fd34c707477f82155ab6521a3780": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "d70d0672ef594a46804db1908e2ff1f3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4404b23833f449f5bb4056059088714d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2db34ff2e2f049bf88323bf6c63b3ad6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ae1402a2bf2342f88225de852ae8ef7f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "32d75965b82c4e88874b2dbf6a84394c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e99bcc9ba6794a918de66a9698ed6a21": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3a9d571d0df04f4ca8d3f1b85d59f58d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3b4848ad12ae4706b22312594afa102e", + "IPY_MODEL_9c0cc6befc3e4dde90e52d9aefbf9d0f", + "IPY_MODEL_4e16ef409ccf46339405f36e5bb98d01" + ], + "layout": "IPY_MODEL_fdb865ef46ce41eb8c7be5efb302feac" + } + }, + "3b4848ad12ae4706b22312594afa102e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d713ccb0149f42de83188fe26fab2f96", + "placeholder": "​", + "style": "IPY_MODEL_2f900f06129a4baa88d4303f57e10b09", + "value": "cde42f315884424ac96d0338f9345d90.zip:  99%" + } + }, + "9c0cc6befc3e4dde90e52d9aefbf9d0f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_033f5cd1ae20442b83806fa6a9e427fc", + "max": 38156891, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_92e5d6dc5f714de4abb2de4e02b5b67c", + "value": 38156891 + } + }, + "4e16ef409ccf46339405f36e5bb98d01": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_aed5749e7ec0412ab6653492f5a93373", + "placeholder": "​", + "style": "IPY_MODEL_c5148506e0d04400a683618ea7ae05c3", + "value": " 36.0M/36.4M [00:02<00:00, 20.5MB/s]" + } + }, + "fdb865ef46ce41eb8c7be5efb302feac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "d713ccb0149f42de83188fe26fab2f96": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2f900f06129a4baa88d4303f57e10b09": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "033f5cd1ae20442b83806fa6a9e427fc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92e5d6dc5f714de4abb2de4e02b5b67c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "aed5749e7ec0412ab6653492f5a93373": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c5148506e0d04400a683618ea7ae05c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ee1cb816c4af4bbf86035660d7183b89": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ce2f98886f1c4018b1a8f3bf8e57f242", + "IPY_MODEL_9cf1977a3fa046d184e0c4b69b6758de", + "IPY_MODEL_4d8bf7048d544814a39e247d48e2fea9" + ], + "layout": "IPY_MODEL_72f73f856bac46a49e0d07f4a1875c82" + } + }, + "ce2f98886f1c4018b1a8f3bf8e57f242": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5aa76fdd658a4485af542e544e6a78b7", + "placeholder": "​", + "style": "IPY_MODEL_bc652bb6be8c4607aa513aac2fef0499", + "value": "6e18f4cb7d5113ddee11f3112740432f.zip: 100%" + } + }, + "9cf1977a3fa046d184e0c4b69b6758de": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_643a840078eb4c32ab8b8f4afa4ec009", + "max": 37463940, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c4b0a0c443304a3ca650fdbc96766cf7", + "value": 37463940 + } + }, + "4d8bf7048d544814a39e247d48e2fea9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_092541a15e8a4fc3911ca944d36e90f3", + "placeholder": "​", + "style": "IPY_MODEL_7f3ab08f7ac946dc8d7b31b561cf8f4f", + "value": " 35.7M/35.7M [00:02<00:00, 21.8MB/s]" + } + }, + "72f73f856bac46a49e0d07f4a1875c82": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "5aa76fdd658a4485af542e544e6a78b7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bc652bb6be8c4607aa513aac2fef0499": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "643a840078eb4c32ab8b8f4afa4ec009": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c4b0a0c443304a3ca650fdbc96766cf7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "092541a15e8a4fc3911ca944d36e90f3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7f3ab08f7ac946dc8d7b31b561cf8f4f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "16ca4e482bdc447b97ec42b1b331ec97": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9bd4b8e80c364c3ea5de4bf301be9b1b", + "IPY_MODEL_0a1795d0984d47d29b59b8997ba354ce", + "IPY_MODEL_70e13c6836cb4d899204ae2a4bc1d767" + ], + "layout": "IPY_MODEL_19362073ce64486c80ec6ea3c5ba0582" + } + }, + "9bd4b8e80c364c3ea5de4bf301be9b1b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_135114617d3b47eaae914aa500513fed", + "placeholder": "​", + "style": "IPY_MODEL_ae97925c3bbb419189acd46656abfb7d", + "value": "60329339bcd8e66e75fccf8a2f6a28cb.zip:  95%" + } + }, + "0a1795d0984d47d29b59b8997ba354ce": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7ebf56423e3d474b8e6766b4e85e52a5", + "max": 22139961, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e933a68712a14785ae5915865c76a56d", + "value": 22139961 + } + }, + "70e13c6836cb4d899204ae2a4bc1d767": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f09d06444e994bcfb8700104cc860535", + "placeholder": "​", + "style": "IPY_MODEL_1807dd235aed451f896dd4fb068741e7", + "value": " 20.0M/21.1M [00:02<00:00, 17.0MB/s]" + } + }, + "19362073ce64486c80ec6ea3c5ba0582": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "135114617d3b47eaae914aa500513fed": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ae97925c3bbb419189acd46656abfb7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7ebf56423e3d474b8e6766b4e85e52a5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e933a68712a14785ae5915865c76a56d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f09d06444e994bcfb8700104cc860535": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1807dd235aed451f896dd4fb068741e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f4e3792b2b784a57ba54a2d7f9c06e4a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a0c71e49ec0a4b8bb9ad6f0adcb3dc83", + "IPY_MODEL_0e119b8a486b4f10be697dc6a0f1fbe4", + "IPY_MODEL_f3a518f1624c481c963fe237a85156de" + ], + "layout": "IPY_MODEL_61bdcb36da4649c495ae8f5c489c762a" + } + }, + "a0c71e49ec0a4b8bb9ad6f0adcb3dc83": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fb565a848efd4627b1ab606a0af75b02", + "placeholder": "​", + "style": "IPY_MODEL_8c68380ef96e4eedab7f04489a92ec40", + "value": "3b9071e35f9a6a7e30250fbaa5ad027f.zip:  96%" + } + }, + "0e119b8a486b4f10be697dc6a0f1fbe4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_64c745d4f6af4ad291fb44998e20c688", + "max": 20782981, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1c25bb873eb048069047d05db6b35f50", + "value": 20782981 + } + }, + "f3a518f1624c481c963fe237a85156de": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_23403ebdb5224826a6afc2b4757cdcca", + "placeholder": "​", + "style": "IPY_MODEL_529e7baa228f40aa81d31da153831577", + "value": " 19.0M/19.8M [00:01<00:00, 20.7MB/s]" + } + }, + "61bdcb36da4649c495ae8f5c489c762a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "fb565a848efd4627b1ab606a0af75b02": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8c68380ef96e4eedab7f04489a92ec40": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "64c745d4f6af4ad291fb44998e20c688": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1c25bb873eb048069047d05db6b35f50": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "23403ebdb5224826a6afc2b4757cdcca": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "529e7baa228f40aa81d31da153831577": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "41eed9183ebc465b8309474fca10f022": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_201df185d7104f6f9d25cd6a059e7ddf", + "IPY_MODEL_5d356edd8a224ee3a978ff98d62b7bbb", + "IPY_MODEL_25d83982a192407abeeed75a8b4058c3" + ], + "layout": "IPY_MODEL_e3fcadd258bb455aa2ee883e8f2aa019" + } + }, + "201df185d7104f6f9d25cd6a059e7ddf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5a7bb2970e684152bd9e95fda7eaba8b", + "placeholder": "​", + "style": "IPY_MODEL_68f71f8091e84f2f8edacff492653980", + "value": "16bfb599152815ac9a59590fa4e3cc0a.zip: 100%" + } + }, + "5d356edd8a224ee3a978ff98d62b7bbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d7529866523a493c991ab52099187b06", + "max": 36716013, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4b1791daf6f9497e9e0870f2eaaadd7e", + "value": 36716013 + } + }, + "25d83982a192407abeeed75a8b4058c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6bccc383604d47bfbda78e1edec5bdae", + "placeholder": "​", + "style": "IPY_MODEL_3052b009d01a4bf2995719eebc62f2b7", + "value": " 35.0M/35.0M [00:02<00:00, 26.6MB/s]" + } + }, + "e3fcadd258bb455aa2ee883e8f2aa019": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "5a7bb2970e684152bd9e95fda7eaba8b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "68f71f8091e84f2f8edacff492653980": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d7529866523a493c991ab52099187b06": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4b1791daf6f9497e9e0870f2eaaadd7e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6bccc383604d47bfbda78e1edec5bdae": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3052b009d01a4bf2995719eebc62f2b7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c5c791b30ad5430abd742de4390e7f1f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c49ebfa0cf0343858dcc911c78eb5f01", + "IPY_MODEL_136b8b4d3913456ea4f4cfd33ccfd2ad", + "IPY_MODEL_6f98487d2db342a5b1713cff89abffd6" + ], + "layout": "IPY_MODEL_b79fa6dfe211470e8a26c275e734e25b" + } + }, + "c49ebfa0cf0343858dcc911c78eb5f01": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cedf18a271394e6daf798b8151e9b3dc", + "placeholder": "​", + "style": "IPY_MODEL_ff2563fbc09f46a3a708a2f8aa8ab8e3", + "value": "897c3a57b11c52471d84e9ff0a46d319.zip:  87%" + } + }, + "136b8b4d3913456ea4f4cfd33ccfd2ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4e4c11b0d14d444481558370c3092780", + "max": 20551879, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0778288fd40e47969e805fe30be13b00", + "value": 20551879 + } + }, + "6f98487d2db342a5b1713cff89abffd6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a1e4fafd594a4cc9a493b6ee0a805cfc", + "placeholder": "​", + "style": "IPY_MODEL_435278efb0ee4308aaad190f194959a0", + "value": " 17.0M/19.6M [00:01<00:00, 20.1MB/s]" + } + }, + "b79fa6dfe211470e8a26c275e734e25b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "cedf18a271394e6daf798b8151e9b3dc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ff2563fbc09f46a3a708a2f8aa8ab8e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4e4c11b0d14d444481558370c3092780": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0778288fd40e47969e805fe30be13b00": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a1e4fafd594a4cc9a493b6ee0a805cfc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "435278efb0ee4308aaad190f194959a0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8e6c290bda8047478a5267c41975b83d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c27af465130845ce8ab47daa7719dcd0", + "IPY_MODEL_4253c12aa5364dd583f23d7479e8f431", + "IPY_MODEL_fd6956375e2941c2800c17f905da093d" + ], + "layout": "IPY_MODEL_5e347bc2030b4639877973b47f5874b1" + } + }, + "c27af465130845ce8ab47daa7719dcd0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_728c6d425d2a4e4bb2db70133af63e28", + "placeholder": "​", + "style": "IPY_MODEL_32a6360b768043bbb6e7bb2536b92666", + "value": "452bf847deb4d80f29a7f41f25876a35.zip:  99%" + } + }, + "4253c12aa5364dd583f23d7479e8f431": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c3d62a02498448a4abd6996d7c10adc3", + "max": 20035107, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_dcb5d1ed3af743238ceffa6ce955a91e", + "value": 20035107 + } + }, + "fd6956375e2941c2800c17f905da093d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3fd3927e5e04485da451526bbd5c1aa5", + "placeholder": "​", + "style": "IPY_MODEL_acbf8dbe049f4328a6e37d4d85f92696", + "value": " 19.0M/19.1M [00:08<00:00, 2.15MB/s]" + } + }, + "5e347bc2030b4639877973b47f5874b1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "728c6d425d2a4e4bb2db70133af63e28": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "32a6360b768043bbb6e7bb2536b92666": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c3d62a02498448a4abd6996d7c10adc3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dcb5d1ed3af743238ceffa6ce955a91e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3fd3927e5e04485da451526bbd5c1aa5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "acbf8dbe049f4328a6e37d4d85f92696": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ecf8af41cf754d8f823f955df7ecba32": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4951eb2a9eac4be7baeab14f30ab69ed", + "IPY_MODEL_1c13ce0f93704acabff8a31b157caa04", + "IPY_MODEL_6419006887db4651b59e26fc39f5c547" + ], + "layout": "IPY_MODEL_cc597f91b12348e69ee18f8b23e119a2" + } + }, + "4951eb2a9eac4be7baeab14f30ab69ed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f943db398a2c4206a694c7f2a915cc86", + "placeholder": "​", + "style": "IPY_MODEL_8959ef7e569f427b9d648bfea23d4a49", + "value": "d1df7a17d939b065c230764dbbd9b5a5.zip:  97%" + } + }, + "1c13ce0f93704acabff8a31b157caa04": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bac4b04d1155486ca3b23bfb62b881a9", + "max": 28108656, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ed4366ce5adb4cb48c8f6459344c838b", + "value": 28108656 + } + }, + "6419006887db4651b59e26fc39f5c547": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dc76c362de7643a28155ce1a512be31d", + "placeholder": "​", + "style": "IPY_MODEL_26ed797a72e74e51a2c0ace0103bbabd", + "value": " 26.0M/26.8M [00:02<00:00, 16.2MB/s]" + } + }, + "cc597f91b12348e69ee18f8b23e119a2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "f943db398a2c4206a694c7f2a915cc86": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8959ef7e569f427b9d648bfea23d4a49": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bac4b04d1155486ca3b23bfb62b881a9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed4366ce5adb4cb48c8f6459344c838b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "dc76c362de7643a28155ce1a512be31d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "26ed797a72e74e51a2c0ace0103bbabd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "56075b42200a40e6b746cf37baa09805": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9172e22b95f34264b8a1b95b943a7fc3", + "IPY_MODEL_3da5e5f0f89147c2b4652ed2730e76c4", + "IPY_MODEL_93ace1c0c5e4496eb6fdb7bd24a48b2f" + ], + "layout": "IPY_MODEL_c457b588f9cc4967904eceb35be4dccb" + } + }, + "9172e22b95f34264b8a1b95b943a7fc3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e16416443f574898970924510d3e0ed7", + "placeholder": "​", + "style": "IPY_MODEL_57b3b9a26ea54ed1b6f6c3357d354686", + "value": "fc6f73b83e8a837a9291129d7d506637.zip:  87%" + } + }, + "3da5e5f0f89147c2b4652ed2730e76c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_036d1a4ab2a84d9ab2ee66534797788c", + "max": 24078240, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8186620989594d4594f819fd88db8470", + "value": 24078240 + } + }, + "93ace1c0c5e4496eb6fdb7bd24a48b2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f01cf36ef0aa46348f16e40ab64fced8", + "placeholder": "​", + "style": "IPY_MODEL_93df0d455f6c4922823ce22381f426bd", + "value": " 20.0M/23.0M [00:02<00:00, 17.6MB/s]" + } + }, + "c457b588f9cc4967904eceb35be4dccb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "e16416443f574898970924510d3e0ed7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "57b3b9a26ea54ed1b6f6c3357d354686": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "036d1a4ab2a84d9ab2ee66534797788c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8186620989594d4594f819fd88db8470": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f01cf36ef0aa46348f16e40ab64fced8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "93df0d455f6c4922823ce22381f426bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d4be937b21d640cb90128742d2a657bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d524fd7e91ed4ccb97ccd7c0c4ba3b49", + "IPY_MODEL_bd5458b1599149198886d7491d19c78d", + "IPY_MODEL_cf8f77442c004858a126a1c58447f463" + ], + "layout": "IPY_MODEL_5d69c1dad4a0408cb18bd77d0c981ab5" + } + }, + "d524fd7e91ed4ccb97ccd7c0c4ba3b49": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_594fc4eb6cb845c2adca811b159d3ab3", + "placeholder": "​", + "style": "IPY_MODEL_f545e5c7373b4ee4b8be05405dd5dfb8", + "value": "884057b3667bf791428a5fe0f16f34a9.zip:  92%" + } + }, + "bd5458b1599149198886d7491d19c78d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_908a1270a76747a090e9dc8c4eb77012", + "max": 26187848, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b0783f967af343e78b17011d8ef57123", + "value": 26187848 + } + }, + "cf8f77442c004858a126a1c58447f463": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9a5ac76dca2c459a879f5b9eb608e704", + "placeholder": "​", + "style": "IPY_MODEL_f47bdb88ed4c4abf920607fbdbbc495c", + "value": " 23.0M/25.0M [00:02<00:00, 23.2MB/s]" + } + }, + "5d69c1dad4a0408cb18bd77d0c981ab5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "594fc4eb6cb845c2adca811b159d3ab3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f545e5c7373b4ee4b8be05405dd5dfb8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "908a1270a76747a090e9dc8c4eb77012": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b0783f967af343e78b17011d8ef57123": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "9a5ac76dca2c459a879f5b9eb608e704": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f47bdb88ed4c4abf920607fbdbbc495c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5679742b5dea461f865ce41fad05a272": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_33847c39976f46cb94520168c38b2962", + "IPY_MODEL_33dbf36657a342aebb0bb0ad35c00a10", + "IPY_MODEL_208082534eaa43cbae504b0c02e798f1" + ], + "layout": "IPY_MODEL_14362ad01c0e4b0fb9b003a34174f2be" + } + }, + "33847c39976f46cb94520168c38b2962": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8c0dc52785544a299f1855980f164163", + "placeholder": "​", + "style": "IPY_MODEL_37dc7c9a25bf4811ba5827ffb96792b0", + "value": "37e120637904d888a15fb8da687807db.zip:  97%" + } + }, + "33dbf36657a342aebb0bb0ad35c00a10": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3f5c2189f63449b2b4a1dadb2c84dddc", + "max": 40982507, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6c309a1cac39495185f77bdd60b49707", + "value": 40982507 + } + }, + "208082534eaa43cbae504b0c02e798f1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dce8854c338f464c96efd2f350851286", + "placeholder": "​", + "style": "IPY_MODEL_9b81b7673ce548bea30c3c6261b731f7", + "value": " 38.0M/39.1M [00:02<00:00, 23.5MB/s]" + } + }, + "14362ad01c0e4b0fb9b003a34174f2be": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "8c0dc52785544a299f1855980f164163": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "37dc7c9a25bf4811ba5827ffb96792b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3f5c2189f63449b2b4a1dadb2c84dddc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6c309a1cac39495185f77bdd60b49707": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "dce8854c338f464c96efd2f350851286": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9b81b7673ce548bea30c3c6261b731f7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3691d125272f4525ae17f44b857ec800": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_287b4c9dac6942f2a3a0400830b3ecbb", + "IPY_MODEL_ce6459790b0f45ca9e8488f3c08ff787", + "IPY_MODEL_bdde60b2ce7d4a88806bde837f2bbc89" + ], + "layout": "IPY_MODEL_ac007b452ab54aaba502a9d7c4a3612d" + } + }, + "287b4c9dac6942f2a3a0400830b3ecbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d51f933e36a74b0cb680803b1b6751f5", + "placeholder": "​", + "style": "IPY_MODEL_3cae9f1986a64af6ad8a54c657a3a0f8", + "value": "43417667f52e073a0435ffec6c47c773.zip:  93%" + } + }, + "ce6459790b0f45ca9e8488f3c08ff787": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_04033c2b59bd4746ad7f5e96764249c8", + "max": 20196136, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f349eb2b149f4b60bbbd8192869053f7", + "value": 20196136 + } + }, + "bdde60b2ce7d4a88806bde837f2bbc89": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_23e6492c0fc146adbf35f5cdc424d1ec", + "placeholder": "​", + "style": "IPY_MODEL_413a349919634acfb2ebcb099b90695c", + "value": " 18.0M/19.3M [00:01<00:00, 20.1MB/s]" + } + }, + "ac007b452ab54aaba502a9d7c4a3612d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "d51f933e36a74b0cb680803b1b6751f5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3cae9f1986a64af6ad8a54c657a3a0f8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "04033c2b59bd4746ad7f5e96764249c8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f349eb2b149f4b60bbbd8192869053f7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "23e6492c0fc146adbf35f5cdc424d1ec": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "413a349919634acfb2ebcb099b90695c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7229361004dd4023893d322af06e0914": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_56333e80b20f46e68f6baf7f88e3400f", + "IPY_MODEL_92ebf6661a2f4a4c974e5c8465f5a41e", + "IPY_MODEL_55431db9f7de4294983e533d7461b25e" + ], + "layout": "IPY_MODEL_099e4a12079342b6849f4422b1a29088" + } + }, + "56333e80b20f46e68f6baf7f88e3400f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b710a7384ddc4c8f82cd8a01244cfdb2", + "placeholder": "​", + "style": "IPY_MODEL_2a68f0f61e7d435fac87f8ae03d64c5e", + "value": "c6b6ff9d9962c909265193d4edce2489.zip: 100%" + } + }, + "92ebf6661a2f4a4c974e5c8465f5a41e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_538d3dee047d4204b7173c4b79a84677", + "max": 37213399, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3e35b4a3ac3c4c7c8b664e323dcbc73b", + "value": 37213399 + } + }, + "55431db9f7de4294983e533d7461b25e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4a8572e00bbb46a095538d0fb5fba402", + "placeholder": "​", + "style": "IPY_MODEL_4045d956f67849228c537801af7f21cf", + "value": " 35.5M/35.5M [00:02<00:00, 26.7MB/s]" + } + }, + "099e4a12079342b6849f4422b1a29088": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "b710a7384ddc4c8f82cd8a01244cfdb2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2a68f0f61e7d435fac87f8ae03d64c5e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "538d3dee047d4204b7173c4b79a84677": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3e35b4a3ac3c4c7c8b664e323dcbc73b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4a8572e00bbb46a095538d0fb5fba402": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4045d956f67849228c537801af7f21cf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "eeac448f75ec421aa20e9939f6ebe718": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_84453e6152a04264b6477713aab8216a", + "IPY_MODEL_c3664aefe8314f3a974711cfd3c74ff6", + "IPY_MODEL_6c3abe3b4316489fa43d2cb227717fbf" + ], + "layout": "IPY_MODEL_ad86b0275c4544f49c99ae824e0ae2a9" + } + }, + "84453e6152a04264b6477713aab8216a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_48b0e7562eaa4bc29713e08d941cd3bb", + "placeholder": "​", + "style": "IPY_MODEL_bd61ef756aa1418686745b1c4a1a4cc0", + "value": "c25498816c374a8ec49384cf9891e3bb.zip:  92%" + } + }, + "c3664aefe8314f3a974711cfd3c74ff6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a28b0683e7154c318715e4e55628992f", + "max": 19449374, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fab46fafa45c4861a5543fbe3404ba35", + "value": 19449374 + } + }, + "6c3abe3b4316489fa43d2cb227717fbf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_81cc1e1a798140079c3d176e3a4ed52f", + "placeholder": "​", + "style": "IPY_MODEL_e917abb6e22e42748673788f33f6a6af", + "value": " 17.0M/18.5M [00:01<00:00, 16.3MB/s]" + } + }, + "ad86b0275c4544f49c99ae824e0ae2a9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "48b0e7562eaa4bc29713e08d941cd3bb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bd61ef756aa1418686745b1c4a1a4cc0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a28b0683e7154c318715e4e55628992f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fab46fafa45c4861a5543fbe3404ba35": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "81cc1e1a798140079c3d176e3a4ed52f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e917abb6e22e42748673788f33f6a6af": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "eaa79535074444909f8232ec84212d4f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_17457e36521e4aa1896a0f5036b05cd2", + "IPY_MODEL_71600ed06eff4898adedd746136abca4", + "IPY_MODEL_be3a2d7aeb3c4b97b3710bcb40c94bd2" + ], + "layout": "IPY_MODEL_8243396e2a034a109b5c70629f959520" + } + }, + "17457e36521e4aa1896a0f5036b05cd2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fe4c4316368947beb6867fdf8dc78d4e", + "placeholder": "​", + "style": "IPY_MODEL_4b77ada562084e27bab5ea750dd102e5", + "value": "76e716f56bafd493934d1e8b6aceae4e.zip:  95%" + } + }, + "71600ed06eff4898adedd746136abca4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e318c6cf49a448608a1cc909c252e571", + "max": 51761577, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e5c4f8955dcb45e39607ccf1c78ef15a", + "value": 51761577 + } + }, + "be3a2d7aeb3c4b97b3710bcb40c94bd2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b73decb4b1cf49938b2f243a95a44789", + "placeholder": "​", + "style": "IPY_MODEL_10cffc23d5d24030a5c5316fcf38784c", + "value": " 47.0M/49.4M [00:03<00:00, 27.1MB/s]" + } + }, + "8243396e2a034a109b5c70629f959520": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "fe4c4316368947beb6867fdf8dc78d4e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4b77ada562084e27bab5ea750dd102e5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e318c6cf49a448608a1cc909c252e571": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e5c4f8955dcb45e39607ccf1c78ef15a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b73decb4b1cf49938b2f243a95a44789": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "10cffc23d5d24030a5c5316fcf38784c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d341eac8435d4ea1b4c7961d13b4896e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d83948dfc10c4b8196844bab4cef4704", + "IPY_MODEL_3bc13bd0583f4a729b362f98f1c8a87b", + "IPY_MODEL_15aa39efe4934e23b215405c70a21c85" + ], + "layout": "IPY_MODEL_d5c0fc209ef24d559fc1833e6ebbb2b4" + } + }, + "d83948dfc10c4b8196844bab4cef4704": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_09584a4224a5450581bcf8282e2db1e4", + "placeholder": "​", + "style": "IPY_MODEL_750482f85a4f463c846a920a4214fbc3", + "value": "73c9a8530bab6bd32beac68c9c187021.zip:  98%" + } + }, + "3bc13bd0583f4a729b362f98f1c8a87b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d5b3a2bed7fb433884ef6e8a96bfd528", + "max": 58567749, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d7e5751e93034e3cb26968cb11facc2e", + "value": 58567749 + } + }, + "15aa39efe4934e23b215405c70a21c85": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_64e0648995934da2948eb7e565b9c174", + "placeholder": "​", + "style": "IPY_MODEL_740dc5f35ef249caa31ebacd07ce1f77", + "value": " 55.0M/55.9M [00:03<00:00, 26.5MB/s]" + } + }, + "d5c0fc209ef24d559fc1833e6ebbb2b4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "09584a4224a5450581bcf8282e2db1e4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "750482f85a4f463c846a920a4214fbc3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d5b3a2bed7fb433884ef6e8a96bfd528": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d7e5751e93034e3cb26968cb11facc2e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "64e0648995934da2948eb7e565b9c174": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "740dc5f35ef249caa31ebacd07ce1f77": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8a2ddcff06594fceb1a52c2dd3c25167": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a16f886f3b0642a7a32c753faa382850", + "IPY_MODEL_af999c41df1f4f2dba7dbe85da5a7362", + "IPY_MODEL_5a09943b1fcc432fa8dee60fb0ab3ad1" + ], + "layout": "IPY_MODEL_6a398d58cf8541e1a33202e660cd6125" + } + }, + "a16f886f3b0642a7a32c753faa382850": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6f88b99d008b4e82bbfab5adde69225f", + "placeholder": "​", + "style": "IPY_MODEL_70455e77e2e84d138740d0e655afaab8", + "value": "76d9bcc883338c61ff811aaedd1c9039.zip:  99%" + } + }, + "af999c41df1f4f2dba7dbe85da5a7362": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4bb67070215248459eb7c819f12bc374", + "max": 54909240, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7800419b63514add97cd0eb47e84ab75", + "value": 54909240 + } + }, + "5a09943b1fcc432fa8dee60fb0ab3ad1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_aae21edde3f6477c87c742258161a801", + "placeholder": "​", + "style": "IPY_MODEL_f2d990d1426f4e1a9b07067f2807b526", + "value": " 52.0M/52.4M [00:03<00:00, 27.2MB/s]" + } + }, + "6a398d58cf8541e1a33202e660cd6125": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "6f88b99d008b4e82bbfab5adde69225f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "70455e77e2e84d138740d0e655afaab8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4bb67070215248459eb7c819f12bc374": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7800419b63514add97cd0eb47e84ab75": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "aae21edde3f6477c87c742258161a801": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f2d990d1426f4e1a9b07067f2807b526": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bab94e85706648aebc8f351b83cf81ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ad0f2003a232417aa249bc62468ae186", + "IPY_MODEL_4e9de2b2d1e041ec91ba9a35f0f43087", + "IPY_MODEL_451f5e23876047d98aaa46bfa23c9d9b" + ], + "layout": "IPY_MODEL_27e32cf9b7774245ac194f0b8a2fc173" + } + }, + "ad0f2003a232417aa249bc62468ae186": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a578f146e1344da6901448819736f89d", + "placeholder": "​", + "style": "IPY_MODEL_9bdd5b3ce2474423a858c8e85fc62a42", + "value": "34b007e4c7aa7ab97f0a04f9be78281c.zip:  99%" + } + }, + "4e9de2b2d1e041ec91ba9a35f0f43087": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c18cd172f44c42f3831635204d42dd57", + "max": 54994951, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_470bd84427e8491fa0f6d1482c1dfe2c", + "value": 54994951 + } + }, + "451f5e23876047d98aaa46bfa23c9d9b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e1ee3ff4381040a6a6043e387f7d3c6e", + "placeholder": "​", + "style": "IPY_MODEL_bdd9f4e63ae44361964ce903cce60f7b", + "value": " 52.0M/52.4M [00:03<00:00, 25.4MB/s]" + } + }, + "27e32cf9b7774245ac194f0b8a2fc173": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "a578f146e1344da6901448819736f89d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9bdd5b3ce2474423a858c8e85fc62a42": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c18cd172f44c42f3831635204d42dd57": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "470bd84427e8491fa0f6d1482c1dfe2c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e1ee3ff4381040a6a6043e387f7d3c6e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bdd9f4e63ae44361964ce903cce60f7b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6b7f0ad5b0854f1c898744417f3aef3e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_51a4ca1de7a84302880f55942265a669", + "IPY_MODEL_5ae711d6df484d61bdacfafda2e852c9", + "IPY_MODEL_bf3cc069580e46998059f6ee9a367411" + ], + "layout": "IPY_MODEL_7e95101a18e547e486fd63dbfb7aa367" + } + }, + "51a4ca1de7a84302880f55942265a669": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_db501c7f75984425aac6adfdb318fa67", + "placeholder": "​", + "style": "IPY_MODEL_961fe48b6c424b428f268614d2f2b7ab", + "value": "ac700a38e242d3abccaf1c031f9a25c5.zip:  95%" + } + }, + "5ae711d6df484d61bdacfafda2e852c9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7a2c3425ae8b4185bb5cdd75616bdfec", + "max": 54028663, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_98da2c6aa4834946b2aa855163deb995", + "value": 54028663 + } + }, + "bf3cc069580e46998059f6ee9a367411": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ae9ce74554b2476083d3cda61810dfbd", + "placeholder": "​", + "style": "IPY_MODEL_96e762a6ae784fdb9dd76a8a83e47dc6", + "value": " 49.0M/51.5M [00:03<00:00, 27.1MB/s]" + } + }, + "7e95101a18e547e486fd63dbfb7aa367": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "db501c7f75984425aac6adfdb318fa67": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "961fe48b6c424b428f268614d2f2b7ab": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7a2c3425ae8b4185bb5cdd75616bdfec": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "98da2c6aa4834946b2aa855163deb995": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ae9ce74554b2476083d3cda61810dfbd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "96e762a6ae784fdb9dd76a8a83e47dc6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "02329160490e4f47b077d0afe8e3fe21": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_1b0797b30416403aa65605f906230616", + "IPY_MODEL_93c37ce5bfcd48d8bdebe0e8cd809123", + "IPY_MODEL_114a7e40e736481f888c2690eec847db" + ], + "layout": "IPY_MODEL_1035e1cd851f4a87b70928902f69bf9c" + } + }, + "1b0797b30416403aa65605f906230616": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0171590b40a547fcb96b20e64393ea02", + "placeholder": "​", + "style": "IPY_MODEL_1b30b55b35d14e69a8b5521d543a2e9e", + "value": "d020205864be3d80c2ce9d7054bf304c.zip:  96%" + } + }, + "93c37ce5bfcd48d8bdebe0e8cd809123": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_adf191290b0743ff9b349d7e3435fc76", + "max": 55592224, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0212577bc2d14724a984e072ecde88ac", + "value": 55592224 + } + }, + "114a7e40e736481f888c2690eec847db": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_529f1be761744e399b87e9cdf124d579", + "placeholder": "​", + "style": "IPY_MODEL_70f16483c71d4734a908251c79535d6f", + "value": " 51.0M/53.0M [00:02<00:00, 29.7MB/s]" + } + }, + "1035e1cd851f4a87b70928902f69bf9c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "0171590b40a547fcb96b20e64393ea02": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1b30b55b35d14e69a8b5521d543a2e9e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "adf191290b0743ff9b349d7e3435fc76": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0212577bc2d14724a984e072ecde88ac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "529f1be761744e399b87e9cdf124d579": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "70f16483c71d4734a908251c79535d6f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1deaeea57d584b9dae2229b47b4f310f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8e598d87477e42c1a196fa5d3034c7ad", + "IPY_MODEL_cbfa6219b37c47e6ac6078ea494d4690", + "IPY_MODEL_fbeb0df7f07f4f729917bd74f0a72024" + ], + "layout": "IPY_MODEL_c873c56187574d4d8a52a305511d16f2" + } + }, + "8e598d87477e42c1a196fa5d3034c7ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f02934a0c36c43baa24048fd68a969c7", + "placeholder": "​", + "style": "IPY_MODEL_928c0bb9055643b5a5f8bd422d74bfa9", + "value": "3162eb37a4da589686fc2b304e4cd556.zip: 100%" + } + }, + "cbfa6219b37c47e6ac6078ea494d4690": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6f554da9e7e04331b9b7d21a01630471", + "max": 53716109, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fa772b991f2a4b93b137a3af55d99750", + "value": 53716109 + } + }, + "fbeb0df7f07f4f729917bd74f0a72024": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_50dc81768b184ae5b681276662e34857", + "placeholder": "​", + "style": "IPY_MODEL_a1a5d85ffdf6423394418b825fd29868", + "value": " 51.0M/51.2M [00:07<00:00, 4.62MB/s]" + } + }, + "c873c56187574d4d8a52a305511d16f2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "f02934a0c36c43baa24048fd68a969c7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "928c0bb9055643b5a5f8bd422d74bfa9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6f554da9e7e04331b9b7d21a01630471": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fa772b991f2a4b93b137a3af55d99750": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "50dc81768b184ae5b681276662e34857": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a1a5d85ffdf6423394418b825fd29868": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ac6aa573b0324ca19b1b5979ae56f6d2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_02f632eed6d04dfda905a6ad5016ada6", + "IPY_MODEL_8a1ed2ba58c3494cb0e1716161682f3b", + "IPY_MODEL_6aa9934dbc244f7682e8283fdbb172b3" + ], + "layout": "IPY_MODEL_b11773d060934235b81ca1616c591450" + } + }, + "02f632eed6d04dfda905a6ad5016ada6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8bffa0aa54f34d8b8180d01727192e2d", + "placeholder": "​", + "style": "IPY_MODEL_0b1bf74775c64837add43367b02f8020", + "value": "fb3b088c11862560c5be74f41f6ac5d8.zip: 100%" + } + }, + "8a1ed2ba58c3494cb0e1716161682f3b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_31644dd9996d4407bb63d56189385f9a", + "max": 52923704, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ccbbe9e10cc1446790fb697955f69172", + "value": 52923704 + } + }, + "6aa9934dbc244f7682e8283fdbb172b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6bc36b622088442199cae6d5cd57ec6d", + "placeholder": "​", + "style": "IPY_MODEL_5524bfc5fc2c49db94412095bf47502b", + "value": " 50.5M/50.5M [01:05<00:00, 1.35MB/s]" + } + }, + "b11773d060934235b81ca1616c591450": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "8bffa0aa54f34d8b8180d01727192e2d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0b1bf74775c64837add43367b02f8020": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "31644dd9996d4407bb63d56189385f9a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ccbbe9e10cc1446790fb697955f69172": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6bc36b622088442199cae6d5cd57ec6d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5524bfc5fc2c49db94412095bf47502b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b71a608c6600408ebe5baa11f8a5ef77": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6e33978251ea4540b6038a03b24353f7", + "IPY_MODEL_27bb6908e57243d3a492be5f646530bc", + "IPY_MODEL_07cc12a020b544fbb0dc8d8f466eb4a2" + ], + "layout": "IPY_MODEL_c91124157cfc4129ad5efa693c6e3fce" + } + }, + "6e33978251ea4540b6038a03b24353f7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_87d9c85abac841ee932ac19fbdcc4f0b", + "placeholder": "​", + "style": "IPY_MODEL_b7afede17eeb4e07b5e71e57fc61374e", + "value": "e5438a86ca5fe8d293bcc41697e77d90.zip: 100%" + } + }, + "27bb6908e57243d3a492be5f646530bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d909abe09ee142b3b4246019a24c2cc0", + "max": 52764853, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5b39f1475d21407fab45b6b26cf1cdff", + "value": 52764853 + } + }, + "07cc12a020b544fbb0dc8d8f466eb4a2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ae26ebdaf5fb452b8fe83ebff37a2627", + "placeholder": "​", + "style": "IPY_MODEL_5bfd9429afd446319265def8b9af0f63", + "value": " 50.3M/50.3M [00:03<00:00, 21.4MB/s]" + } + }, + "c91124157cfc4129ad5efa693c6e3fce": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "87d9c85abac841ee932ac19fbdcc4f0b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b7afede17eeb4e07b5e71e57fc61374e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d909abe09ee142b3b4246019a24c2cc0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5b39f1475d21407fab45b6b26cf1cdff": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ae26ebdaf5fb452b8fe83ebff37a2627": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5bfd9429afd446319265def8b9af0f63": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "539d925b1344457398b398918c002e40": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_66875f743ad541d9add80a8da70893df", + "IPY_MODEL_aafb9092a6004c08875e85bcd025a618", + "IPY_MODEL_d86f1b0724d540479ac803a0892251bc" + ], + "layout": "IPY_MODEL_a7054e77706c453ea9c796b1046bf727" + } + }, + "66875f743ad541d9add80a8da70893df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_afb1ae06d52b493ebc8155db4d1231ef", + "placeholder": "​", + "style": "IPY_MODEL_7ff8e328f6594863a2ebde3fe728d867", + "value": "cb388bae84e38461347186f427035d97.zip: 100%" + } + }, + "aafb9092a6004c08875e85bcd025a618": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_26003b857a844b7299e45752d5006c60", + "max": 54587094, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ebeb8a56c2544075ab5b30c39fd08b2f", + "value": 54587094 + } + }, + "d86f1b0724d540479ac803a0892251bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_50fcdeacb429423dbbfc3d969bb2098b", + "placeholder": "​", + "style": "IPY_MODEL_aedc0bcb0662449397a4dbf9b41db339", + "value": " 52.0M/52.1M [00:03<00:00, 30.9MB/s]" + } + }, + "a7054e77706c453ea9c796b1046bf727": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "afb1ae06d52b493ebc8155db4d1231ef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7ff8e328f6594863a2ebde3fe728d867": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "26003b857a844b7299e45752d5006c60": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ebeb8a56c2544075ab5b30c39fd08b2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "50fcdeacb429423dbbfc3d969bb2098b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aedc0bcb0662449397a4dbf9b41db339": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b4c8bfe8814343b8900dbff13708d026": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_34d524406f8f4302912d467b5f6cfd52", + "IPY_MODEL_03f8dfd88df54c39bdea46dc39d48be4", + "IPY_MODEL_6ec400bdc1ed417c83a2b4e7877d5b6f" + ], + "layout": "IPY_MODEL_96b7312dfb7d48d381c93042e4cf7e19" + } + }, + "34d524406f8f4302912d467b5f6cfd52": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a0599523a54d4f55931c02e481caaee6", + "placeholder": "​", + "style": "IPY_MODEL_3a670b739b0f4b2d8a109e8e0a0928ec", + "value": "bd772fd683a8755d6dc2c7bce1088871.zip:  99%" + } + }, + "03f8dfd88df54c39bdea46dc39d48be4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5411cd5798db4091bf541d93c9de3564", + "max": 54209337, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2f11714392624475b6fe601fa2e88b07", + "value": 54209337 + } + }, + "6ec400bdc1ed417c83a2b4e7877d5b6f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fabec55aaacf4f1490e55970f21888c4", + "placeholder": "​", + "style": "IPY_MODEL_516fb5438d1d47e7af104cf252b1e908", + "value": " 51.0M/51.7M [00:03<00:00, 25.8MB/s]" + } + }, + "96b7312dfb7d48d381c93042e4cf7e19": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "a0599523a54d4f55931c02e481caaee6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3a670b739b0f4b2d8a109e8e0a0928ec": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5411cd5798db4091bf541d93c9de3564": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2f11714392624475b6fe601fa2e88b07": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "fabec55aaacf4f1490e55970f21888c4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "516fb5438d1d47e7af104cf252b1e908": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "df19d1b938fa412dbcc4734d634f6783": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ec07137e83984c6c85a50bc0f20e4dee", + "IPY_MODEL_f5c1c34eb605407589f0ce1f5a74ddb8", + "IPY_MODEL_747101fd5e34440681e553248a180e7d" + ], + "layout": "IPY_MODEL_138bac55e4164e1cbba2d46a8aa882bd" + } + }, + "ec07137e83984c6c85a50bc0f20e4dee": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_09a34e2e49654a018b61b96273155cb1", + "placeholder": "​", + "style": "IPY_MODEL_4147f74513d9441fb11c2d4cd052b895", + "value": "ba6b7ec9e0c12f3b9e92e9cab229bd6e.zip: 100%" + } + }, + "f5c1c34eb605407589f0ce1f5a74ddb8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c855508f679b4dd7b42a1f40ba186d9f", + "max": 52493375, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_90eb62b796e74c41bca8af010e8d47b0", + "value": 52493375 + } + }, + "747101fd5e34440681e553248a180e7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_38d46865c2bd4f0db10328b126a12d58", + "placeholder": "​", + "style": "IPY_MODEL_23255401b7274528bcb73976849bb141", + "value": " 50.0M/50.1M [00:03<00:00, 25.8MB/s]" + } + }, + "138bac55e4164e1cbba2d46a8aa882bd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "09a34e2e49654a018b61b96273155cb1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4147f74513d9441fb11c2d4cd052b895": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c855508f679b4dd7b42a1f40ba186d9f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "90eb62b796e74c41bca8af010e8d47b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "38d46865c2bd4f0db10328b126a12d58": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "23255401b7274528bcb73976849bb141": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 环境配置" + ], + "metadata": { + "id": "a-SCRPwsySGg" + } + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AvjOz_dCmUTf", + "outputId": "a9046a6c-7a13-493a-b12a-b5f4e320841d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting cdsapi\n", + " Downloading cdsapi-0.7.6-py2.py3-none-any.whl.metadata (3.0 kB)\n", + "Collecting ecmwf-datastores-client (from cdsapi)\n", + " Downloading ecmwf_datastores_client-0.4.0-py3-none-any.whl.metadata (21 kB)\n", + "Requirement already satisfied: requests>=2.5.0 in /usr/local/lib/python3.12/dist-packages (from cdsapi) (2.32.4)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.12/dist-packages (from cdsapi) (4.67.1)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests>=2.5.0->cdsapi) (3.4.3)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests>=2.5.0->cdsapi) (3.10)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests>=2.5.0->cdsapi) (2.5.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests>=2.5.0->cdsapi) (2025.8.3)\n", + "Requirement already satisfied: attrs in /usr/local/lib/python3.12/dist-packages (from ecmwf-datastores-client->cdsapi) (25.3.0)\n", + "Collecting multiurl>=0.3.7 (from ecmwf-datastores-client->cdsapi)\n", + " Downloading multiurl-0.3.7-py3-none-any.whl.metadata (2.8 kB)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.12/dist-packages (from ecmwf-datastores-client->cdsapi) (4.15.0)\n", + "Requirement already satisfied: pytz in /usr/local/lib/python3.12/dist-packages (from multiurl>=0.3.7->ecmwf-datastores-client->cdsapi) (2025.2)\n", + "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.12/dist-packages (from multiurl>=0.3.7->ecmwf-datastores-client->cdsapi) (2.9.0.post0)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil->multiurl>=0.3.7->ecmwf-datastores-client->cdsapi) (1.17.0)\n", + "Downloading cdsapi-0.7.6-py2.py3-none-any.whl (12 kB)\n", + "Downloading ecmwf_datastores_client-0.4.0-py3-none-any.whl (29 kB)\n", + "Downloading multiurl-0.3.7-py3-none-any.whl (21 kB)\n", + "Installing collected packages: multiurl, ecmwf-datastores-client, cdsapi\n", + "Successfully installed cdsapi-0.7.6 ecmwf-datastores-client-0.4.0 multiurl-0.3.7\n" + ] + } + ], + "source": [ + "!pip install cdsapi" + ] + }, + { + "cell_type": "code", + "source": [ + "import os, getpass, textwrap, pathlib\n", + "\n", + "\n", + "cfg = textwrap.dedent(f\"\"\"\\\n", + "url: https://cds.climate.copernicus.eu/api\n", + "key: 55a51e6d-554d-46e6-8743-c8f5f4a98f9b\n", + "\"\"\")\n", + "\n", + "path = pathlib.Path(\"~/.cdsapirc\").expanduser()\n", + "path.write_text(cfg)\n", + "# 收紧权限(Linux 600)\n", + "!chmod 600 ~/.cdsapirc\n", + "\n", + "print(\"~/.cdsapirc 写入完成\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aXyLzdCHmW7k", + "outputId": "ec77505a-d6e9-4068-9218-1c05de4d2c55" + }, + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "~/.cdsapirc 写入完成\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# 打包并行下载" + ], + "metadata": { + "id": "WjAP6NPTyX_r" + } + }, + { + "cell_type": "code", + "source": [ + "import argparse\n", + "import time\n", + "import random\n", + "from pathlib import Path\n", + "from typing import List, Tuple, Iterable\n", + "import sys\n", + "from concurrent.futures import ThreadPoolExecutor, as_completed\n", + "\n", + "import cdsapi\n", + "\n", + "DATASET = \"reanalysis-era5-land\"\n", + "\n", + "# ---------- 时间维度 ----------\n", + "ALL_DAYS: List[str] = [f\"{d:02d}\" for d in range(1, 32)]\n", + "ALL_HOURS: List[str] = [f\"{h:02d}:00\" for h in range(0, 24)]\n", + "ALL_MONTHS: List[str] = [f\"{m:02d}\" for m in range(1, 13)]\n", + "\n", + "# ---------- 重试设置 ----------\n", + "MAX_RETRIES = 8\n", + "BASE_SLEEP = 10 # seconds\n", + "\n", + "# ---------- 变量全集 ----------\n", + "VARIABLES: List[str] = [\n", + " \"2m_dewpoint_temperature\",\n", + " \"2m_temperature\",\n", + " \"skin_temperature\",\n", + " \"soil_temperature_level_1\",\n", + " \"soil_temperature_level_2\",\n", + " \"soil_temperature_level_3\",\n", + " \"soil_temperature_level_4\",\n", + " \"lake_bottom_temperature\",\n", + " \"lake_ice_depth\",\n", + " \"lake_ice_temperature\",\n", + " \"lake_mix_layer_depth\",\n", + " \"lake_mix_layer_temperature\",\n", + " \"lake_shape_factor\",\n", + " \"lake_total_layer_temperature\",\n", + " \"snow_albedo\",\n", + " \"snow_cover\",\n", + " \"snow_density\",\n", + " \"snow_depth\",\n", + " \"snow_depth_water_equivalent\",\n", + " \"snowfall\",\n", + " \"snowmelt\",\n", + " \"temperature_of_snow_layer\",\n", + " \"forecast_albedo\",\n", + " \"surface_latent_heat_flux\",\n", + " \"surface_net_solar_radiation\",\n", + " \"surface_net_thermal_radiation\",\n", + " \"surface_sensible_heat_flux\",\n", + " \"surface_solar_radiation_downwards\",\n", + " \"surface_thermal_radiation_downwards\",\n", + " \"evaporation_from_bare_soil\",\n", + " \"evaporation_from_open_water_surfaces_excluding_oceans\",\n", + " \"evaporation_from_the_top_of_canopy\",\n", + " \"evaporation_from_vegetation_transpiration\",\n", + " \"potential_evaporation\",\n", + " \"runoff\",\n", + " \"snow_evaporation\",\n", + " \"sub_surface_runoff\",\n", + " \"surface_runoff\",\n", + " \"total_evaporation\",\n", + " \"10m_u_component_of_wind\",\n", + " \"10m_v_component_of_wind\",\n", + " \"surface_pressure\",\n", + " \"total_precipitation\",\n", + " \"leaf_area_index_high_vegetation\",\n", + " \"leaf_area_index_low_vegetation\",\n", + " \"high_vegetation_cover\",\n", + " \"glacier_mask\",\n", + " \"lake_cover\",\n", + " \"low_vegetation_cover\",\n", + " \"lake_total_depth\",\n", + " \"land_sea_mask\",\n", + " \"soil_type\",\n", + " \"type_of_high_vegetation\",\n", + " \"type_of_low_vegetation\",\n", + "]\n", + "\n", + "def chunked(seq: List[str], n: int) -> Iterable[List[str]]:\n", + " \"\"\"把列表按 n 个一组切块。\"\"\"\n", + " for i in range(0, len(seq), n):\n", + " yield seq[i:i+n]\n", + "\n", + "def build_request(\n", + " variables: List[str],\n", + " year: str,\n", + " month: str,\n", + " area_box: Tuple[float, float, float, float],\n", + " fmt: str,\n", + ") -> dict:\n", + " north, west, south, east = area_box\n", + " req = {\n", + " \"variable\": variables, # 注意:这里是“列表”,一次请求多个变量\n", + " \"year\": year,\n", + " \"month\": month,\n", + " \"day\": ALL_DAYS,\n", + " \"time\": ALL_HOURS,\n", + " \"area\": [north, west, south, east], # N W S E\n", + " \"format\": fmt, # \"grib\" | \"netcdf\"\n", + " \"download_format\": \"zip\",\n", + " # \"product_type\": \"reanalysis\",\n", + " }\n", + " return req\n", + "\n", + "def safe_retrieve(client: cdsapi.Client, dataset: str, request: dict, target_path: Path):\n", + " attempt = 0\n", + " time.sleep(random.uniform(0.3, 1.0)) # 轻微抖动,错峰请求\n", + " while True:\n", + " try:\n", + " client.retrieve(dataset, request).download(str(target_path))\n", + " return True\n", + " except Exception as e:\n", + " attempt += 1\n", + " msg = str(e).lower()\n", + " unrecoverable_signals = [\n", + " \"unavailable\",\n", + " \"not available\",\n", + " \"invalid\",\n", + " \"does not match\",\n", + " \"no data\",\n", + " \"bad request\",\n", + " \"cannot be found\",\n", + " ]\n", + " if any(s in msg for s in unrecoverable_signals):\n", + " print(f\"[ERROR] Unrecoverable for {target_path.name}: {e}\")\n", + " return False\n", + "\n", + " if attempt > MAX_RETRIES:\n", + " print(f\"[ERROR] Max retries exceeded for {target_path.name}: {e}\")\n", + " return False\n", + "\n", + " sleep_s = BASE_SLEEP * (2 ** (attempt - 1)) * random.uniform(0.85, 1.15)\n", + " print(f\"[WARN] Download failed (attempt {attempt}/{MAX_RETRIES}): {e}\")\n", + " print(f\" Sleeping {sleep_s:.0f}s then retrying...\")\n", + " time.sleep(sleep_s)\n", + "\n", + "def parse_args_with_defaults():\n", + " parser = argparse.ArgumentParser(\n", + " description=\"ERA5-Land downloader — month-level parallelism, multi-variable per request\"\n", + " )\n", + " parser.add_argument(\"--out_dir\", type=str, default=\"./era5land\",\n", + " help=\"输出根目录(默认 ./era5land)\")\n", + " parser.add_argument(\"--bbox\", nargs=4, type=float,\n", + " default=[60.86, -6.23, 49.86, 1.75],\n", + " metavar=(\"NORTH\", \"WEST\", \"SOUTH\", \"EAST\"),\n", + " help=\"经纬度范围:N W S E(默认 60.86 -6.23 49.86 1.75)\")\n", + " parser.add_argument(\"--format\", default=\"grib\", choices=[\"grib\", \"netcdf\"],\n", + " help=\"文件格式(默认 grib)\")\n", + " parser.add_argument(\"--years\", nargs=\"+\",\n", + " default=[str(y) for y in range(2013, 2023)],\n", + " help=\"年份列表\")\n", + " parser.add_argument(\"--months\", nargs=\"+\", default=ALL_MONTHS,\n", + " help=\"月份列表(默认 01..12)\")\n", + " parser.add_argument(\"--variables\", nargs=\"+\", default=VARIABLES,\n", + " help=\"变量名列表(默认为脚本内置全集)\")\n", + " parser.add_argument(\"--vars_per_req\", type=int, default=10,\n", + " help=\"每个请求打包的变量数量(默认 10)\")\n", + " parser.add_argument(\"--skip_existing\", action=\"store_true\",\n", + " help=\"若目标文件已存在则跳过\")\n", + " parser.add_argument(\"--month_workers\", type=int, default=12,\n", + " help=\"每个 年×变量包 的月份并发数(默认 12)\")\n", + " try:\n", + " return parser.parse_args([])\n", + " except SystemExit:\n", + " return parser.parse_args()\n", + "\n", + "def download_one_month(var_list: List[str], pack_idx: int, year: str, month: str, args) -> bool:\n", + " \"\"\"并发任务:下载单个【变量包 × 年 × 月】\"\"\"\n", + " # 统一放到 packs 目录,避免多变量文件难以归属到某个变量子目录\n", + " subdir = Path(args.out_dir) / \"packs\" / str(year)\n", + " subdir.mkdir(parents=True, exist_ok=True)\n", + "\n", + " suffix = \"grib\" if args.format == \"grib\" else \"nc\"\n", + " target_name = f\"{DATASET}_vars{len(var_list)}_{year}-{month}_pack{pack_idx:02d}.{suffix}.zip\"\n", + " target_path = subdir / target_name\n", + "\n", + " if args.skip_existing and target_path.exists():\n", + " return True\n", + "\n", + " req = build_request(\n", + " variables=var_list,\n", + " year=str(year),\n", + " month=f\"{int(month):02d}\",\n", + " area_box=tuple(args.bbox),\n", + " fmt=args.format,\n", + " )\n", + "\n", + " first_var = var_list[0]\n", + " print(f\"[INFO][pack{pack_idx:02d}][{year}] month={month} ({len(var_list)} vars, e.g., {first_var}...) -> {target_path.name}\")\n", + " client = cdsapi.Client()\n", + " ok = safe_retrieve(client, DATASET, req, target_path)\n", + "\n", + " # 额外写一个 sidecar 记录该包具体变量,便于审计与溯源\n", + " if ok:\n", + " meta_path = target_path.with_suffix(target_path.suffix + \".vars.txt\")\n", + " try:\n", + " meta_path.write_text(\"\\n\".join(var_list), encoding=\"utf-8\")\n", + " except Exception as e:\n", + " print(f\"[WARN] Unable to write var list sidecar: {e}\")\n", + " return ok\n", + "\n", + "def main():\n", + " if \"ipykernel\" in sys.modules or \"google.colab\" in sys.modules:\n", + " args = parse_args_with_defaults()\n", + " else:\n", + " args = parse_args_with_defaults()\n", + "\n", + " # 变量按 N 个一组打包\n", + " var_packs = list(chunked(args.variables, max(1, args.vars_per_req)))\n", + " print(f\"[INIT] Total variables: {len(args.variables)}, vars_per_req={args.vars_per_req}, packs={len(var_packs)}\")\n", + "\n", + " total_ok = 0\n", + " total_fail = 0\n", + "\n", + " for year in args.years:\n", + " for pack_idx, var_list in enumerate(var_packs):\n", + " months = list(args.months)\n", + " max_workers = max(1, min(args.month_workers, len(months)))\n", + " print(f\"\\n[GROUP] year={year} pack={pack_idx:02d} (vars={len(var_list)}) | months={months} | month_workers={max_workers}\")\n", + "\n", + " futures = []\n", + " with ThreadPoolExecutor(max_workers=max_workers) as ex:\n", + " for month in months:\n", + " futures.append(ex.submit(download_one_month, var_list, pack_idx, year, month, args))\n", + " for fut in as_completed(futures):\n", + " ok = fut.result()\n", + " if ok: total_ok += 1\n", + " else: total_fail += 1\n", + "\n", + " print(f\"\\n[DONE] Finished. Success: {total_ok}, Failed: {total_fail}\")\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "abddfd3083344f1aa9b83cde136175c9", + "246b96a1fc424e7cb24cc819abf02e70", + "2e9287600c3d470491f148056550e8e3", + "b8d43810f3734158aea02043eb1e4200", + "054ecc18232e4bddb53babf0572a4c55", + "5320125c218c4b45b9c6e00ff9814b1c", + "c646729eb0b14e0889e5cf03ab9848c4", + "4845a0b7f06b4f95860ad0e185905cb2", + "7b99527a796e4bec8e20c335523b4ed3", + "6154f4e3945642719a9b2390bf294699", + "f300df27365a4ec49b600c4fcc1fc774", + "dd595f15b9f54a678799db1a91927049", + "25c47322534343219528ad19a50e237d", + "5d942d2c66634d828fd29c625fafbe98", + "304fa1191909430d9d8f31d4865dd77b", + "06c1a151059d4e2297a993399ba60a45", + "d8825f41311a4424bfd3c414d3313542", + "acbeb24fe3e24ec296be5489e03b0955", + "cb9af2c2bd9f4f0a9e7a33e31d619a35", + "d8239b1847944eea85d756610eb4c268", + "ca26fe92af234840b6ec125877249da8", + "02a80be6b17e459eb8eb969a15b7f33b", + "803e3b8c95e4427484c0f7cf5d8d2403", + "3374032b59254300b8b437483a378db1", + "60dc1e70e28647dea2bd1690e3c67631", + "6de012b52d70485ab5ba8e04c8422058", + "a0413d8ea4394330af2d9150d04e0160", + "5e1799e0323d47ed9efe6b80c982a7a0", + "499ac97b8ee6479ab9a317d65a4777b9", + "d358e0ecaa3c49ab8ecf661ef5f9a30e", + "d7705463c3194769994a89481631b9e9", + "8d9405baf4d24602b7c0ef5e2815990d", + "01aa77c42b3347bda1eb4773d65dee8b", + "2bb11a3e03f84d619c648ff099b86234", + "640800d3a3e14f0e87a856995ed4d2ad", + "9aaa010dd6aa4b34aa8c75b07efb0455", + "106add9b3e13414bb798c61e40d18483", + "5e6c14bbe14c44a3b09a616a4e5da2f9", + "d218ad783b384a6b90c7794c9b9749f4", + "c7e3ebe6e8f644348fe28aad3166b3aa", + "e1f4f436e4c44202bfeb22ea36f14f3d", + "36adcefa79314ec8b5e2813c25c7cc84", + "875bd0c85fbc4da48a224f1b8a8716bf", + "e086ff8d43bf4a2fb070cfcb9adbfa49", + "4a6271c69aec4fe4882175c73184eb34", + "f981194eeea64dd99111e8baf806e04f", + "4cb978510ae34cb0aeb3963338d1c718", + "17233284212e406182b607abc159b46d", + "c3f13a1fb39e4b50af8b806cc735ff42", + "c6269bb733d64f59b23500ce7752a125", + "8c683779e3ec4d1cab7536ebc2def9a6", + "6d29cddf1b6849a99ac88d09b7fe565f", + "26d06aab3c504c7582c9444b3f87f936", + "974fe5d0fbf24460aac95d062b9c661b", + "ede5ec13f00c4281a89ce9f0e7be4397", + "61d74f0421f940f79553b434107388b6", + "13b0b32bdf30498f8d7663e1d0920610", + "fd96eff731794286ab0fa1b56ccb43c7", + "5f17146cf58e4a5989e153880c2506a2", + "df1cb0decee6449386adce1054a8f8cc", + "cc9cf30d0d994d40bd29cd1ef0ab195f", + "f428eae679984083afada8c6c5199fd3", + "388f817495084ff8be598de3bc6471f9", + "964ad91f0603424ca9ca70f94bceb4b4", + "d84a9895767f44709ff71a4bec71d5e5", + "d1d2a64e5cc74ffa838579fa20f91705", + "25ef0ecfcbd149babb324baf6b8e6116", + "d1695b515c16464eaa6b03f98bd38800", + "cc5cce42f206419e9fcf2852d84b59c7", + "4f332d59374a4264adc0cdb1b4cd4e1d", + "fb11160a3d4740f78fa13ae894610468", + "2b027b593500454aa2d5fbc6b3437ceb", + "cbf449be10104f878206c76cc0fb0a91", + "3b3019c543d44690afbc2b129d095036", + "375b316f3a6241d8ab555a3ff34cae4a", + "bf67926117f34fc38abfdefc063e1291", + "2f0650cc121c4e64ae7e3aed484e7ec4", + "48367b14400f4cbfb8baccf954fbe5d7", + "3a0f58dc1d7d4f18bf28215c5b73e330", + "c12b2f2c54a84ff9b0aab69fa53d9693", + "ff0bfdaa183843a2ab08f561fb64a7e6", + "2299331af2854dd487df5d916e63584e", + "9cee787a1018406b8ac4c81edd037716", + "f49fdf01bed74de9a2e3a3605e511ae8", + "485a601ae4bc42a9adca1d844c49f953", + "88f5011c1f3d448da2a705c1b5dd2088", + "7ed68a0bd6364240b8ea4fe49c2a3913", + "0ac9d0f86c7a4ae7a3e3ef38da9b1213", + "9898dc408b784934915b571f3d7ccf31", + "074a39eb3a904486b87e45e29595a2b2", + "9554690da76545f0989ab5c4ee45ceaf", + "965b2a9aa08145ea891b5219b91d6913", + "44043a588ee54fa5afdeaedf7807b82b", + "b612ece24d9d4f5ea99fbab44ebf1966", + "2391e1bf5b9e4e5fb01ab62862069de0", + "e5cfb106e71a4da784c38692a56a6be4", + "c998427d6b7947e48cfa0a297a4fdf93", + "ed0ce18d5cba47bd89324ae61df0e468", + "1e228359390042809ed47886e8b96666", + "f1aba38e590640e598b5c697e6593b23", + "9cf246163ce1452ba7dedac35868915d", + "7f54d51fc0414a438c3a46006df51832", + "7b804abdc9eb4355905cd86ab88f1de2", + "ee90fd34c707477f82155ab6521a3780", + "d70d0672ef594a46804db1908e2ff1f3", + "4404b23833f449f5bb4056059088714d", + "2db34ff2e2f049bf88323bf6c63b3ad6", + "ae1402a2bf2342f88225de852ae8ef7f", + "32d75965b82c4e88874b2dbf6a84394c", + "e99bcc9ba6794a918de66a9698ed6a21", + "3a9d571d0df04f4ca8d3f1b85d59f58d", + "3b4848ad12ae4706b22312594afa102e", + "9c0cc6befc3e4dde90e52d9aefbf9d0f", + "4e16ef409ccf46339405f36e5bb98d01", + "fdb865ef46ce41eb8c7be5efb302feac", + "d713ccb0149f42de83188fe26fab2f96", + "2f900f06129a4baa88d4303f57e10b09", + "033f5cd1ae20442b83806fa6a9e427fc", + "92e5d6dc5f714de4abb2de4e02b5b67c", + "aed5749e7ec0412ab6653492f5a93373", + "c5148506e0d04400a683618ea7ae05c3", + "ee1cb816c4af4bbf86035660d7183b89", + "ce2f98886f1c4018b1a8f3bf8e57f242", + "9cf1977a3fa046d184e0c4b69b6758de", + "4d8bf7048d544814a39e247d48e2fea9", + "72f73f856bac46a49e0d07f4a1875c82", + "5aa76fdd658a4485af542e544e6a78b7", + "bc652bb6be8c4607aa513aac2fef0499", + "643a840078eb4c32ab8b8f4afa4ec009", + "c4b0a0c443304a3ca650fdbc96766cf7", + "092541a15e8a4fc3911ca944d36e90f3", + "7f3ab08f7ac946dc8d7b31b561cf8f4f", + "16ca4e482bdc447b97ec42b1b331ec97", + "9bd4b8e80c364c3ea5de4bf301be9b1b", + "0a1795d0984d47d29b59b8997ba354ce", + "70e13c6836cb4d899204ae2a4bc1d767", + "19362073ce64486c80ec6ea3c5ba0582", + "135114617d3b47eaae914aa500513fed", + "ae97925c3bbb419189acd46656abfb7d", + "7ebf56423e3d474b8e6766b4e85e52a5", + "e933a68712a14785ae5915865c76a56d", + "f09d06444e994bcfb8700104cc860535", + "1807dd235aed451f896dd4fb068741e7", + "f4e3792b2b784a57ba54a2d7f9c06e4a", + "a0c71e49ec0a4b8bb9ad6f0adcb3dc83", + "0e119b8a486b4f10be697dc6a0f1fbe4", + "f3a518f1624c481c963fe237a85156de", + "61bdcb36da4649c495ae8f5c489c762a", + "fb565a848efd4627b1ab606a0af75b02", + "8c68380ef96e4eedab7f04489a92ec40", + "64c745d4f6af4ad291fb44998e20c688", + "1c25bb873eb048069047d05db6b35f50", + "23403ebdb5224826a6afc2b4757cdcca", + "529e7baa228f40aa81d31da153831577", + "41eed9183ebc465b8309474fca10f022", + "201df185d7104f6f9d25cd6a059e7ddf", + "5d356edd8a224ee3a978ff98d62b7bbb", + "25d83982a192407abeeed75a8b4058c3", + "e3fcadd258bb455aa2ee883e8f2aa019", + "5a7bb2970e684152bd9e95fda7eaba8b", + "68f71f8091e84f2f8edacff492653980", + "d7529866523a493c991ab52099187b06", + "4b1791daf6f9497e9e0870f2eaaadd7e", + "6bccc383604d47bfbda78e1edec5bdae", + "3052b009d01a4bf2995719eebc62f2b7", + "c5c791b30ad5430abd742de4390e7f1f", + "c49ebfa0cf0343858dcc911c78eb5f01", + "136b8b4d3913456ea4f4cfd33ccfd2ad", + "6f98487d2db342a5b1713cff89abffd6", + "b79fa6dfe211470e8a26c275e734e25b", + "cedf18a271394e6daf798b8151e9b3dc", + "ff2563fbc09f46a3a708a2f8aa8ab8e3", + "4e4c11b0d14d444481558370c3092780", + "0778288fd40e47969e805fe30be13b00", + "a1e4fafd594a4cc9a493b6ee0a805cfc", + "435278efb0ee4308aaad190f194959a0", + "8e6c290bda8047478a5267c41975b83d", + "c27af465130845ce8ab47daa7719dcd0", + "4253c12aa5364dd583f23d7479e8f431", + "fd6956375e2941c2800c17f905da093d", + "5e347bc2030b4639877973b47f5874b1", + "728c6d425d2a4e4bb2db70133af63e28", + "32a6360b768043bbb6e7bb2536b92666", + "c3d62a02498448a4abd6996d7c10adc3", + "dcb5d1ed3af743238ceffa6ce955a91e", + "3fd3927e5e04485da451526bbd5c1aa5", + "acbf8dbe049f4328a6e37d4d85f92696", + "ecf8af41cf754d8f823f955df7ecba32", + "4951eb2a9eac4be7baeab14f30ab69ed", + "1c13ce0f93704acabff8a31b157caa04", + "6419006887db4651b59e26fc39f5c547", + "cc597f91b12348e69ee18f8b23e119a2", + "f943db398a2c4206a694c7f2a915cc86", + "8959ef7e569f427b9d648bfea23d4a49", + "bac4b04d1155486ca3b23bfb62b881a9", + "ed4366ce5adb4cb48c8f6459344c838b", + "dc76c362de7643a28155ce1a512be31d", + "26ed797a72e74e51a2c0ace0103bbabd", + "56075b42200a40e6b746cf37baa09805", + "9172e22b95f34264b8a1b95b943a7fc3", + "3da5e5f0f89147c2b4652ed2730e76c4", + "93ace1c0c5e4496eb6fdb7bd24a48b2f", + "c457b588f9cc4967904eceb35be4dccb", + "e16416443f574898970924510d3e0ed7", + "57b3b9a26ea54ed1b6f6c3357d354686", + "036d1a4ab2a84d9ab2ee66534797788c", + "8186620989594d4594f819fd88db8470", + "f01cf36ef0aa46348f16e40ab64fced8", + "93df0d455f6c4922823ce22381f426bd", + "d4be937b21d640cb90128742d2a657bd", + "d524fd7e91ed4ccb97ccd7c0c4ba3b49", + "bd5458b1599149198886d7491d19c78d", + "cf8f77442c004858a126a1c58447f463", + "5d69c1dad4a0408cb18bd77d0c981ab5", + "594fc4eb6cb845c2adca811b159d3ab3", + "f545e5c7373b4ee4b8be05405dd5dfb8", + "908a1270a76747a090e9dc8c4eb77012", + "b0783f967af343e78b17011d8ef57123", + "9a5ac76dca2c459a879f5b9eb608e704", + "f47bdb88ed4c4abf920607fbdbbc495c", + "5679742b5dea461f865ce41fad05a272", + "33847c39976f46cb94520168c38b2962", + "33dbf36657a342aebb0bb0ad35c00a10", + "208082534eaa43cbae504b0c02e798f1", + "14362ad01c0e4b0fb9b003a34174f2be", + "8c0dc52785544a299f1855980f164163", + "37dc7c9a25bf4811ba5827ffb96792b0", + "3f5c2189f63449b2b4a1dadb2c84dddc", + "6c309a1cac39495185f77bdd60b49707", + "dce8854c338f464c96efd2f350851286", + "9b81b7673ce548bea30c3c6261b731f7", + "3691d125272f4525ae17f44b857ec800", + "287b4c9dac6942f2a3a0400830b3ecbb", + "ce6459790b0f45ca9e8488f3c08ff787", + "bdde60b2ce7d4a88806bde837f2bbc89", + "ac007b452ab54aaba502a9d7c4a3612d", + "d51f933e36a74b0cb680803b1b6751f5", + "3cae9f1986a64af6ad8a54c657a3a0f8", + "04033c2b59bd4746ad7f5e96764249c8", + "f349eb2b149f4b60bbbd8192869053f7", + "23e6492c0fc146adbf35f5cdc424d1ec", + "413a349919634acfb2ebcb099b90695c", + "7229361004dd4023893d322af06e0914", + "56333e80b20f46e68f6baf7f88e3400f", + "92ebf6661a2f4a4c974e5c8465f5a41e", + "55431db9f7de4294983e533d7461b25e", + "099e4a12079342b6849f4422b1a29088", + "b710a7384ddc4c8f82cd8a01244cfdb2", + "2a68f0f61e7d435fac87f8ae03d64c5e", + "538d3dee047d4204b7173c4b79a84677", + "3e35b4a3ac3c4c7c8b664e323dcbc73b", + "4a8572e00bbb46a095538d0fb5fba402", + "4045d956f67849228c537801af7f21cf", + "eeac448f75ec421aa20e9939f6ebe718", + "84453e6152a04264b6477713aab8216a", + "c3664aefe8314f3a974711cfd3c74ff6", + "6c3abe3b4316489fa43d2cb227717fbf", + "ad86b0275c4544f49c99ae824e0ae2a9", + "48b0e7562eaa4bc29713e08d941cd3bb", + "bd61ef756aa1418686745b1c4a1a4cc0", + "a28b0683e7154c318715e4e55628992f", + "fab46fafa45c4861a5543fbe3404ba35", + "81cc1e1a798140079c3d176e3a4ed52f", + "e917abb6e22e42748673788f33f6a6af", + "eaa79535074444909f8232ec84212d4f", + "17457e36521e4aa1896a0f5036b05cd2", + "71600ed06eff4898adedd746136abca4", + "be3a2d7aeb3c4b97b3710bcb40c94bd2", + "8243396e2a034a109b5c70629f959520", + "fe4c4316368947beb6867fdf8dc78d4e", + "4b77ada562084e27bab5ea750dd102e5", + "e318c6cf49a448608a1cc909c252e571", + "e5c4f8955dcb45e39607ccf1c78ef15a", + "b73decb4b1cf49938b2f243a95a44789", + "10cffc23d5d24030a5c5316fcf38784c", + "d341eac8435d4ea1b4c7961d13b4896e", + "d83948dfc10c4b8196844bab4cef4704", + "3bc13bd0583f4a729b362f98f1c8a87b", + "15aa39efe4934e23b215405c70a21c85", + "d5c0fc209ef24d559fc1833e6ebbb2b4", + "09584a4224a5450581bcf8282e2db1e4", + "750482f85a4f463c846a920a4214fbc3", + "d5b3a2bed7fb433884ef6e8a96bfd528", + "d7e5751e93034e3cb26968cb11facc2e", + "64e0648995934da2948eb7e565b9c174", + "740dc5f35ef249caa31ebacd07ce1f77", + "8a2ddcff06594fceb1a52c2dd3c25167", + "a16f886f3b0642a7a32c753faa382850", + "af999c41df1f4f2dba7dbe85da5a7362", + "5a09943b1fcc432fa8dee60fb0ab3ad1", + "6a398d58cf8541e1a33202e660cd6125", + "6f88b99d008b4e82bbfab5adde69225f", + "70455e77e2e84d138740d0e655afaab8", + "4bb67070215248459eb7c819f12bc374", + "7800419b63514add97cd0eb47e84ab75", + "aae21edde3f6477c87c742258161a801", + "f2d990d1426f4e1a9b07067f2807b526", + "bab94e85706648aebc8f351b83cf81ea", + "ad0f2003a232417aa249bc62468ae186", + "4e9de2b2d1e041ec91ba9a35f0f43087", + "451f5e23876047d98aaa46bfa23c9d9b", + "27e32cf9b7774245ac194f0b8a2fc173", + "a578f146e1344da6901448819736f89d", + "9bdd5b3ce2474423a858c8e85fc62a42", + "c18cd172f44c42f3831635204d42dd57", + "470bd84427e8491fa0f6d1482c1dfe2c", + "e1ee3ff4381040a6a6043e387f7d3c6e", + "bdd9f4e63ae44361964ce903cce60f7b", + "6b7f0ad5b0854f1c898744417f3aef3e", + "51a4ca1de7a84302880f55942265a669", + "5ae711d6df484d61bdacfafda2e852c9", + "bf3cc069580e46998059f6ee9a367411", + "7e95101a18e547e486fd63dbfb7aa367", + "db501c7f75984425aac6adfdb318fa67", + "961fe48b6c424b428f268614d2f2b7ab", + "7a2c3425ae8b4185bb5cdd75616bdfec", + "98da2c6aa4834946b2aa855163deb995", + "ae9ce74554b2476083d3cda61810dfbd", + "96e762a6ae784fdb9dd76a8a83e47dc6", + "02329160490e4f47b077d0afe8e3fe21", + "1b0797b30416403aa65605f906230616", + "93c37ce5bfcd48d8bdebe0e8cd809123", + "114a7e40e736481f888c2690eec847db", + "1035e1cd851f4a87b70928902f69bf9c", + "0171590b40a547fcb96b20e64393ea02", + "1b30b55b35d14e69a8b5521d543a2e9e", + "adf191290b0743ff9b349d7e3435fc76", + "0212577bc2d14724a984e072ecde88ac", + "529f1be761744e399b87e9cdf124d579", + "70f16483c71d4734a908251c79535d6f", + "1deaeea57d584b9dae2229b47b4f310f", + "8e598d87477e42c1a196fa5d3034c7ad", + "cbfa6219b37c47e6ac6078ea494d4690", + "fbeb0df7f07f4f729917bd74f0a72024", + "c873c56187574d4d8a52a305511d16f2", + "f02934a0c36c43baa24048fd68a969c7", + "928c0bb9055643b5a5f8bd422d74bfa9", + "6f554da9e7e04331b9b7d21a01630471", + "fa772b991f2a4b93b137a3af55d99750", + "50dc81768b184ae5b681276662e34857", + "a1a5d85ffdf6423394418b825fd29868", + "ac6aa573b0324ca19b1b5979ae56f6d2", + "02f632eed6d04dfda905a6ad5016ada6", + "8a1ed2ba58c3494cb0e1716161682f3b", + "6aa9934dbc244f7682e8283fdbb172b3", + "b11773d060934235b81ca1616c591450", + "8bffa0aa54f34d8b8180d01727192e2d", + "0b1bf74775c64837add43367b02f8020", + "31644dd9996d4407bb63d56189385f9a", + "ccbbe9e10cc1446790fb697955f69172", + "6bc36b622088442199cae6d5cd57ec6d", + "5524bfc5fc2c49db94412095bf47502b", + "b71a608c6600408ebe5baa11f8a5ef77", + "6e33978251ea4540b6038a03b24353f7", + "27bb6908e57243d3a492be5f646530bc", + "07cc12a020b544fbb0dc8d8f466eb4a2", + "c91124157cfc4129ad5efa693c6e3fce", + "87d9c85abac841ee932ac19fbdcc4f0b", + "b7afede17eeb4e07b5e71e57fc61374e", + "d909abe09ee142b3b4246019a24c2cc0", + "5b39f1475d21407fab45b6b26cf1cdff", + "ae26ebdaf5fb452b8fe83ebff37a2627", + "5bfd9429afd446319265def8b9af0f63", + "539d925b1344457398b398918c002e40", + "66875f743ad541d9add80a8da70893df", + "aafb9092a6004c08875e85bcd025a618", + "d86f1b0724d540479ac803a0892251bc", + "a7054e77706c453ea9c796b1046bf727", + "afb1ae06d52b493ebc8155db4d1231ef", + "7ff8e328f6594863a2ebde3fe728d867", + "26003b857a844b7299e45752d5006c60", + "ebeb8a56c2544075ab5b30c39fd08b2f", + "50fcdeacb429423dbbfc3d969bb2098b", + "aedc0bcb0662449397a4dbf9b41db339", + "b4c8bfe8814343b8900dbff13708d026", + "34d524406f8f4302912d467b5f6cfd52", + "03f8dfd88df54c39bdea46dc39d48be4", + "6ec400bdc1ed417c83a2b4e7877d5b6f", + "96b7312dfb7d48d381c93042e4cf7e19", + "a0599523a54d4f55931c02e481caaee6", + "3a670b739b0f4b2d8a109e8e0a0928ec", + "5411cd5798db4091bf541d93c9de3564", + "2f11714392624475b6fe601fa2e88b07", + "fabec55aaacf4f1490e55970f21888c4", + "516fb5438d1d47e7af104cf252b1e908", + "df19d1b938fa412dbcc4734d634f6783", + "ec07137e83984c6c85a50bc0f20e4dee", + "f5c1c34eb605407589f0ce1f5a74ddb8", + "747101fd5e34440681e553248a180e7d", + "138bac55e4164e1cbba2d46a8aa882bd", + "09a34e2e49654a018b61b96273155cb1", + "4147f74513d9441fb11c2d4cd052b895", + "c855508f679b4dd7b42a1f40ba186d9f", + "90eb62b796e74c41bca8af010e8d47b0", + "38d46865c2bd4f0db10328b126a12d58", + "23255401b7274528bcb73976849bb141" + ] + }, + "id": "Bh1BP5C8mdFr", + "outputId": "bad9542a-fa9d-41a9-b474-bea5e9bc28a2" + }, + "execution_count": null, + "outputs": [ + { + "metadata": { + "tags": null + }, + "name": "stdout", + "output_type": "stream", + "text": [ + "[INIT] Total variables: 54, vars_per_req=10, packs=6\n", + "\n", + "[GROUP] year=2013 pack=00 (vars=10) | months=['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'] | month_workers=12\n", + "[INFO][pack00][2013] month=02 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-02_pack00.grib.zip\n", + "[INFO][pack00][2013] month=01 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-01_pack00.grib.zip\n", + "[INFO][pack00][2013] month=03 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-03_pack00.grib.zip\n", + "[INFO][pack00][2013] month=04 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-04_pack00.grib.zip\n", + "[INFO][pack00][2013] month=05 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-05_pack00.grib.zip\n", + "[INFO][pack00][2013] month=06 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-06_pack00.grib.zip\n", + "[INFO][pack00][2013] month=07 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-07_pack00.grib.zip\n", + "[INFO][pack00][2013] month=08 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-08_pack00.grib.zip\n", + "[INFO][pack00][2013] month=09 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-09_pack00.grib.zip\n", + "[INFO][pack00][2013] month=11 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-11_pack00.grib.zip\n", + "[INFO][pack00][2013] month=12 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-12_pack00.grib.zip\n", + "[INFO][pack00][2013] month=10 (10 vars, e.g., 2m_dewpoint_temperature...) -> reanalysis-era5-land_vars10_2013-10_pack00.grib.zip\n" + ] + }, + { + "metadata": { + "tags": null + }, + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 17:51:29,878 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,887 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:29,890 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,901 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,916 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:29,908 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,909 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,933 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,910 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:29,936 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:29,910 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,945 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,911 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,952 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,911 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:29,953 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,955 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:29,956 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:29,996 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:30,000 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:30,068 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:30,070 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:30,645 INFO Request ID is 4baf3937-b6e1-4695-ae9c-76f681102297\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 4baf3937-b6e1-4695-ae9c-76f681102297\n", + "2025-09-29 17:51:30,771 INFO Request ID is aba729a0-e468-46cf-9df2-64afd38ccffe\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is aba729a0-e468-46cf-9df2-64afd38ccffe\n", + "2025-09-29 17:51:30,788 INFO Request ID is 1da9f212-6b6b-4681-bd88-c8fef99ac7c3\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 1da9f212-6b6b-4681-bd88-c8fef99ac7c3\n", + "2025-09-29 17:51:30,795 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:30,809 INFO Request ID is 1adb1e9c-60b3-462b-bd37-196aa9d1fc8c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 1adb1e9c-60b3-462b-bd37-196aa9d1fc8c\n", + "2025-09-29 17:51:30,863 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 17:51:30,865 INFO Request ID is 7f880685-e620-47a2-93da-95003e703d93\n", + "2025-09-29 17:51:30,867 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 7f880685-e620-47a2-93da-95003e703d93\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 17:51:30,876 INFO Request ID is 303f9dd8-56ad-4124-847e-3958a2e1a0e8\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 303f9dd8-56ad-4124-847e-3958a2e1a0e8\n", + "2025-09-29 17:51:30,882 INFO Request ID is 78228fb6-890d-417d-9814-c940ce7da761\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 78228fb6-890d-417d-9814-c940ce7da761\n", + "2025-09-29 17:51:30,899 INFO Request ID is 22f91546-9835-4a5e-a638-14700a565d8c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 22f91546-9835-4a5e-a638-14700a565d8c\n", + "2025-09-29 17:51:30,913 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "WARNING:multiurl.http:Recovering from HTTP error [429 Too Many Requests], attempt 1 of 500\n", + "WARNING:multiurl.http:Retrying in 120 seconds\n", + "2025-09-29 17:51:30,930 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:30,945 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:31,002 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:31,018 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:31,020 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:31,034 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:31,038 INFO Request ID is bb12ce1a-3d49-4523-8ca0-43dcda181a9c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is bb12ce1a-3d49-4523-8ca0-43dcda181a9c\n", + "2025-09-29 17:51:31,175 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:31,185 INFO Request ID is 63772c95-e2d7-43c5-8f9e-e76eba1c2896\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 63772c95-e2d7-43c5-8f9e-e76eba1c2896\n", + "2025-09-29 17:51:31,323 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:51:31,967 INFO Request ID is 0b5bb894-3177-4f71-b650-0e1451eee8bf\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0b5bb894-3177-4f71-b650-0e1451eee8bf\n", + "2025-09-29 17:51:32,112 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 17:53:31,450 INFO Request ID is 751bfc50-71fc-4cdd-b392-04c50b1f19a6\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 751bfc50-71fc-4cdd-b392-04c50b1f19a6\n", + "2025-09-29 17:53:31,578 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 18:17:57,036 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-29 18:29:59,773 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-29 18:29:59,863 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "abddfd3083344f1aa9b83cde136175c9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "a9ac9771fffda64b460f0259f90e3bee.zip: 0%| | 0.00/35.2M [00:00 reanalysis-era5-land_vars10_2013-01_pack01.grib.zip\n", + "[INFO][pack01][2013] month=02 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-02_pack01.grib.zip\n", + "[INFO][pack01][2013] month=03 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-03_pack01.grib.zip\n", + "[INFO][pack01][2013] month=04 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-04_pack01.grib.zip\n", + "[INFO][pack01][2013] month=05 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-05_pack01.grib.zip\n", + "[INFO][pack01][2013] month=07 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-07_pack01.grib.zip\n", + "[INFO][pack01][2013] month=06 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-06_pack01.grib.zip\n", + "[INFO][pack01][2013] month=08 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-08_pack01.grib.zip\n", + "[INFO][pack01][2013] month=09 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-09_pack01.grib.zip\n", + "[INFO][pack01][2013] month=10 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-10_pack01.grib.zip\n", + "[INFO][pack01][2013] month=11 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-11_pack01.grib.zip\n", + "[INFO][pack01][2013] month=12 (10 vars, e.g., lake_mix_layer_depth...) -> reanalysis-era5-land_vars10_2013-12_pack01.grib.zip\n" + ] + }, + { + "metadata": { + "tags": null + }, + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 21:18:47,231 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,233 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,237 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,240 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,246 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,248 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,256 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,252 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,253 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,256 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,258 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,271 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,272 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,262 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,276 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,264 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,279 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,266 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,281 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,267 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,287 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,289 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,295 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-29 21:18:47,297 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-29 21:18:47,895 INFO Request ID is 23298d95-f5f5-4c48-9693-fab38a1e00e9\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 23298d95-f5f5-4c48-9693-fab38a1e00e9\n", + "2025-09-29 21:18:48,026 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,076 INFO Request ID is 23d709cb-f5d2-4c22-887f-edafd981bdf9\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 23d709cb-f5d2-4c22-887f-edafd981bdf9\n", + "2025-09-29 21:18:48,157 INFO Request ID is c814adc2-b692-448e-9658-f9029c88a0a4\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c814adc2-b692-448e-9658-f9029c88a0a4\n", + "2025-09-29 21:18:48,216 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,292 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,315 INFO Request ID is 925b2e2e-0826-4edb-b9cc-ab59da555171\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 925b2e2e-0826-4edb-b9cc-ab59da555171\n", + "2025-09-29 21:18:48,400 INFO Request ID is d95c38b6-afee-4408-b3b2-6e163c445517\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is d95c38b6-afee-4408-b3b2-6e163c445517\n", + "WARNING:multiurl.http:Recovering from HTTP error [429 Too Many Requests], attempt 1 of 500\n", + "WARNING:multiurl.http:Retrying in 120 seconds\n", + "2025-09-29 21:18:48,465 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,538 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,542 INFO Request ID is 5c641d48-b5f1-4e3c-b338-c3137ad254a9\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 5c641d48-b5f1-4e3c-b338-c3137ad254a9\n", + "2025-09-29 21:18:48,593 INFO Request ID is 862a5abd-cef1-4df2-b3de-ef7af4497813\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 862a5abd-cef1-4df2-b3de-ef7af4497813\n", + "2025-09-29 21:18:48,603 INFO Request ID is 3fe03e38-ea90-4836-a366-96838f6dc659\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3fe03e38-ea90-4836-a366-96838f6dc659\n", + "2025-09-29 21:18:48,614 INFO Request ID is c1fac027-f7da-4d4f-a452-ded4bbf047b2\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c1fac027-f7da-4d4f-a452-ded4bbf047b2\n", + "2025-09-29 21:18:48,699 INFO Request ID is 9b6aa0ef-7027-4139-9bcd-85207bcb43d2\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 9b6aa0ef-7027-4139-9bcd-85207bcb43d2\n", + "2025-09-29 21:18:48,723 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,736 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,745 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,856 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:48,869 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:18:49,005 INFO Request ID is c391148e-a21d-410d-ab8e-e687f8213a5d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c391148e-a21d-410d-ab8e-e687f8213a5d\n", + "2025-09-29 21:18:49,153 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:20:49,037 INFO Request ID is b7bc6d2a-ade3-4b12-9280-94c98b4bac75\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is b7bc6d2a-ade3-4b12-9280-94c98b4bac75\n", + "2025-09-29 21:20:49,181 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 21:49:14,831 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-29 22:03:18,561 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "16ca4e482bdc447b97ec42b1b331ec97", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "60329339bcd8e66e75fccf8a2f6a28cb.zip: 0%| | 0.00/21.1M [00:00 reanalysis-era5-land_vars10_2013-01_pack02.grib.zip\n", + "[INFO][pack02][2013] month=02 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-02_pack02.grib.zip\n", + "[INFO][pack02][2013] month=04 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-04_pack02.grib.zip\n", + "[INFO][pack02][2013] month=05 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-05_pack02.grib.zip\n", + "[INFO][pack02][2013] month=06 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-06_pack02.grib.zip\n", + "[INFO][pack02][2013] month=07 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-07_pack02.grib.zip\n", + "[INFO][pack02][2013] month=03 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-03_pack02.grib.zip\n", + "[INFO][pack02][2013] month=08 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-08_pack02.grib.zip\n", + "[INFO][pack02][2013] month=09 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-09_pack02.grib.zip\n", + "[INFO][pack02][2013] month=10 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-10_pack02.grib.zip\n", + "[INFO][pack02][2013] month=11 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-11_pack02.grib.zip\n", + "[INFO][pack02][2013] month=12 (10 vars, e.g., snowmelt...) -> reanalysis-era5-land_vars10_2013-12_pack02.grib.zip\n" + ] + }, + { + "metadata": { + "tags": null + }, + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-30 01:02:13,721 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,724 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,737 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,741 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,738 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,745 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,747 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,754 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,756 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,749 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,753 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,755 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,760 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,750 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,763 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,765 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,772 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,774 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,875 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,877 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,884 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,888 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:13,915 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 01:02:13,917 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 01:02:14,511 INFO Request ID is f1b16095-603f-411f-955d-c6d2e58005bd\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is f1b16095-603f-411f-955d-c6d2e58005bd\n", + "2025-09-30 01:02:14,610 INFO Request ID is 3d43d6f2-b97e-41e3-8c7b-983b2e5dbbf4\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3d43d6f2-b97e-41e3-8c7b-983b2e5dbbf4\n", + "2025-09-30 01:02:14,668 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:14,706 INFO Request ID is 59ebaa6e-3363-4e95-8479-a86affee68ce\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 59ebaa6e-3363-4e95-8479-a86affee68ce\n", + "2025-09-30 01:02:14,720 INFO Request ID is 9721ebb8-2065-45fd-a036-a928c952aede\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 9721ebb8-2065-45fd-a036-a928c952aede\n", + "2025-09-30 01:02:14,778 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:14,806 INFO Request ID is 80e2ad0d-7d20-4877-988e-c662d1195a1b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 80e2ad0d-7d20-4877-988e-c662d1195a1b\n", + "2025-09-30 01:02:14,829 INFO Request ID is 4c5ae5af-da8f-4126-b411-bfac3e52e67d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 4c5ae5af-da8f-4126-b411-bfac3e52e67d\n", + "2025-09-30 01:02:14,837 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:14,862 INFO Request ID is 0d2bee33-9914-4041-b49c-39a7f129a5f0\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0d2bee33-9914-4041-b49c-39a7f129a5f0\n", + "2025-09-30 01:02:14,943 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:14,973 INFO Request ID is 078c4e9b-a67a-4fe6-b8bd-5fb00cb91512\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 078c4e9b-a67a-4fe6-b8bd-5fb00cb91512\n", + "2025-09-30 01:02:14,983 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:15,056 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:15,067 INFO Request ID is 2e19a0e0-4243-4e09-9610-74a98ad9cb28\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 2e19a0e0-4243-4e09-9610-74a98ad9cb28\n", + "2025-09-30 01:02:15,104 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:15,123 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:15,237 INFO Request ID is 4d843344-e842-40a6-a99e-3627e9c82fc9\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 4d843344-e842-40a6-a99e-3627e9c82fc9\n", + "2025-09-30 01:02:15,241 INFO Request ID is 48c757d2-4179-49a7-8755-2eed704aa263\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 48c757d2-4179-49a7-8755-2eed704aa263\n", + "2025-09-30 01:02:15,247 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:15,363 INFO Request ID is cdaac184-e067-4378-b92a-97dfd930db6f\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is cdaac184-e067-4378-b92a-97dfd930db6f\n", + "2025-09-30 01:02:15,370 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:15,423 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:02:15,502 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 01:28:41,019 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-30 01:42:44,388 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eaa79535074444909f8232ec84212d4f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "76e716f56bafd493934d1e8b6aceae4e.zip: 0%| | 0.00/49.4M [00:00 reanalysis-era5-land_vars10_2013-01_pack03.grib.zip\n", + "[INFO][pack03][2013] month=02 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-02_pack03.grib.zip\n", + "[INFO][pack03][2013] month=03 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-03_pack03.grib.zip\n", + "[INFO][pack03][2013] month=04 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-04_pack03.grib.zip\n", + "[INFO][pack03][2013] month=05 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-05_pack03.grib.zip\n", + "[INFO][pack03][2013] month=08 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-08_pack03.grib.zip\n", + "[INFO][pack03][2013] month=06 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-06_pack03.grib.zip\n", + "[INFO][pack03][2013] month=07 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-07_pack03.grib.zip\n", + "[INFO][pack03][2013] month=09 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-09_pack03.grib.zip\n", + "[INFO][pack03][2013] month=10 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-10_pack03.grib.zip\n", + "[INFO][pack03][2013] month=11 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-11_pack03.grib.zip\n", + "[INFO][pack03][2013] month=12 (10 vars, e.g., evaporation_from_open_water_surfaces_excluding_oceans...) -> reanalysis-era5-land_vars10_2013-12_pack03.grib.zip\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "2025-09-30 08:32:36,842 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,846 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,848 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,852 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 08:32:36,855 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,855 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 08:32:36,863 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,858 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,869 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,858 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,872 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 08:32:36,866 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,875 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,880 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 08:32:36,881 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,885 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,889 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,890 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,891 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,894 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 08:32:36,895 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,907 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 08:32:36,911 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-30 08:32:36,917 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-30 08:32:37,575 INFO Request ID is 65df94df-2466-4683-b630-a967f4085f8f\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 65df94df-2466-4683-b630-a967f4085f8f\n", + "2025-09-30 08:32:37,681 INFO Request ID is 9bb2c6b5-1c0e-42ba-925a-fb05fd88922d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 9bb2c6b5-1c0e-42ba-925a-fb05fd88922d\n", + "2025-09-30 08:32:37,707 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:37,710 INFO Request ID is 967bba14-3023-4ed0-bff7-0eb7b362896e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 967bba14-3023-4ed0-bff7-0eb7b362896e\n", + "2025-09-30 08:32:37,747 INFO Request ID is 5c88ef91-8cfa-4dff-bc22-39ae9e0b6b1b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 5c88ef91-8cfa-4dff-bc22-39ae9e0b6b1b\n", + "2025-09-30 08:32:37,795 INFO Request ID is 2637e064-19b8-415b-9f49-1787041fe883\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 2637e064-19b8-415b-9f49-1787041fe883\n", + "2025-09-30 08:32:37,800 INFO Request ID is 0c4f6346-071a-4d74-87f2-20f6f41c2392\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0c4f6346-071a-4d74-87f2-20f6f41c2392\n", + "2025-09-30 08:32:37,808 INFO Request ID is 2a18d026-1926-4729-b542-3143d9eb4f0d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 2a18d026-1926-4729-b542-3143d9eb4f0d\n", + "2025-09-30 08:32:37,811 INFO Request ID is 91c8f702-5914-42da-a18c-a7bf525ff181\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 91c8f702-5914-42da-a18c-a7bf525ff181\n", + "2025-09-30 08:32:37,818 INFO Request ID is 9ea647e0-0b16-4452-8f86-51dc2b638bfe\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 9ea647e0-0b16-4452-8f86-51dc2b638bfe\n", + "2025-09-30 08:32:37,821 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:37,870 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:37,903 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:37,948 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:37,968 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:37,973 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:38,049 INFO Request ID is 40da5396-7b66-4563-b12d-bb25b8d2d026\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 40da5396-7b66-4563-b12d-bb25b8d2d026\n", + "2025-09-30 08:32:38,058 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:38,059 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:38,134 INFO Request ID is 39313c8d-43c5-498b-ae81-be51533d6477\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 39313c8d-43c5-498b-ae81-be51533d6477\n", + "WARNING:multiurl.http:Recovering from HTTP error [429 Too Many Requests], attempt 1 of 500\n", + "WARNING:multiurl.http:Retrying in 120 seconds\n", + "2025-09-30 08:32:38,192 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:32:38,266 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-30 08:34:38,681 INFO Request ID is b5bd5fe5-337d-4a76-844f-e6deca9c807b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is b5bd5fe5-337d-4a76-844f-e6deca9c807b\n", + "2025-09-30 08:34:38,824 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# 月并行下载" + ], + "metadata": { + "id": "bGC8HkVNydt8" + } + }, + { + "cell_type": "code", + "source": [ + "# download_era5land_chunked_full_month_parallel.py —— 按“月份”并发(每年最多12并发)\n", + "# -*- coding: utf-8 -*-\n", + "import argparse\n", + "import time\n", + "import random\n", + "from pathlib import Path\n", + "from typing import List, Tuple\n", + "import sys\n", + "from concurrent.futures import ThreadPoolExecutor, as_completed\n", + "\n", + "import cdsapi\n", + "\n", + "DATASET = \"reanalysis-era5-land\"\n", + "\n", + "# ---------- 时间维度 ----------\n", + "ALL_DAYS: List[str] = [f\"{d:02d}\" for d in range(1, 32)]\n", + "ALL_HOURS: List[str] = [f\"{h:02d}:00\" for h in range(0, 24)]\n", + "ALL_MONTHS: List[str] = [f\"{m:02d}\" for m in range(1, 13)]\n", + "\n", + "# ---------- 重试设置 ----------\n", + "MAX_RETRIES = 8\n", + "BASE_SLEEP = 10 # seconds\n", + "\n", + "# ---------- 变量全集(你的清单 + 注释项全部纳入) ----------\n", + "VARIABLES: List[str] =\n", + " [\n", + " \"2m_dewpoint_temperature\",\n", + " \"2m_temperature\",\n", + " \"skin_temperature\",\n", + " \"soil_temperature_level_1\",\n", + " \"soil_temperature_level_2\",\n", + " \"soil_temperature_level_3\",\n", + " \"soil_temperature_level_4\",\n", + " \"lake_bottom_temperature\",\n", + " \"lake_ice_depth\",\n", + " \"lake_ice_temperature\",\n", + " \"lake_mix_layer_depth\",\n", + " \"lake_mix_layer_temperature\",\n", + " \"lake_shape_factor\",\n", + " \"lake_total_layer_temperature\",\n", + " \"snow_albedo\",\n", + " \"snow_cover\",\n", + " \"snow_density\",\n", + " \"snow_depth\",\n", + " \"snow_depth_water_equivalent\",\n", + " \"snowfall\",\n", + " \"snowmelt\",\n", + " \"temperature_of_snow_layer\",\n", + " \"forecast_albedo\",\n", + " \"surface_latent_heat_flux\",\n", + " \"surface_net_solar_radiation\",\n", + " \"surface_net_thermal_radiation\",\n", + " \"surface_sensible_heat_flux\",\n", + " \"surface_solar_radiation_downwards\",\n", + " \"surface_thermal_radiation_downwards\",\n", + " \"evaporation_from_bare_soil\",\n", + " \"evaporation_from_open_water_surfaces_excluding_oceans\",\n", + " \"evaporation_from_the_top_of_canopy\",\n", + " \"evaporation_from_vegetation_transpiration\",\n", + " \"potential_evaporation\",\n", + " \"runoff\",\n", + " \"snow_evaporation\",\n", + " \"sub_surface_runoff\",\n", + " \"surface_runoff\",\n", + " \"total_evaporation\",\n", + " \"10m_u_component_of_wind\",\n", + " \"10m_v_component_of_wind\",\n", + " \"surface_pressure\",\n", + " \"total_precipitation\",\n", + " \"leaf_area_index_high_vegetation\",\n", + " \"leaf_area_index_low_vegetation\",\n", + " \"high_vegetation_cover\",\n", + " \"glacier_mask\",\n", + " \"lake_cover\",\n", + " \"low_vegetation_cover\",\n", + " \"lake_total_depth\",\n", + " \"land_sea_mask\",\n", + " \"soil_type\",\n", + " \"type_of_high_vegetation\",\n", + " \"type_of_low_vegetation\",\n", + "]\n", + "\n", + "\n", + "\n", + "def build_request(\n", + " variable: str,\n", + " year: str,\n", + " month: str,\n", + " area_box: Tuple[float, float, float, float],\n", + " fmt: str,\n", + ") -> dict:\n", + " north, west, south, east = area_box\n", + " req = {\n", + " \"variable\": variable,\n", + " \"year\": year,\n", + " \"month\": month,\n", + " \"day\": ALL_DAYS,\n", + " \"time\": ALL_HOURS,\n", + " \"area\": [north, west, south, east], # N W S E\n", + " \"format\": fmt, # \"grib\" | \"netcdf\"\n", + " \"download_format\": \"zip\",\n", + " # \"product_type\": \"reanalysis\",\n", + " }\n", + " return req\n", + "\n", + "def safe_retrieve(client: cdsapi.Client, dataset: str, request: dict, target_path: Path):\n", + " attempt = 0\n", + " # 轻微抖动,错峰请求\n", + " time.sleep(random.uniform(0.3, 1.0))\n", + " while True:\n", + " try:\n", + " client.retrieve(dataset, request).download(str(target_path))\n", + " return True\n", + " except Exception as e:\n", + " attempt += 1\n", + " msg = str(e).lower()\n", + " # 明确不可恢复的错误(变量无效/不可用/无数据)直接跳过\n", + " unrecoverable_signals = [\n", + " \"unavailable\",\n", + " \"not available\",\n", + " \"invalid\",\n", + " \"does not match\",\n", + " \"no data\",\n", + " \"bad request\",\n", + " \"cannot be found\",\n", + " ]\n", + " if any(s in msg for s in unrecoverable_signals):\n", + " print(f\"[ERROR] Unrecoverable for {target_path.name}: {e}\")\n", + " return False\n", + "\n", + " if attempt > MAX_RETRIES:\n", + " print(f\"[ERROR] Max retries exceeded for {target_path.name}: {e}\")\n", + " return False\n", + "\n", + " sleep_s = BASE_SLEEP * (2 ** (attempt - 1)) * random.uniform(0.85, 1.15)\n", + " print(f\"[WARN] Download failed (attempt {attempt}/{MAX_RETRIES}): {e}\")\n", + " print(f\" Sleeping {sleep_s:.0f}s then retrying...\")\n", + " time.sleep(sleep_s)\n", + "\n", + "def parse_args_with_defaults():\n", + " parser = argparse.ArgumentParser(\n", + " description=\"ERA5-Land downloader (split by variable × year × month) — month-level parallelism\"\n", + " )\n", + " # —— 给出默认值,不再强制要求 —— #\n", + " parser.add_argument(\"--out_dir\", type=str, default=\"./era5land\",\n", + " help=\"输出根目录(默认 ./era5land)\")\n", + " parser.add_argument(\"--bbox\", nargs=4, type=float,\n", + " default=[60.86, -6.23, 49.86, 1.75],\n", + " metavar=(\"NORTH\", \"WEST\", \"SOUTH\", \"EAST\"),\n", + " help=\"经纬度范围:N W S E(默认 60.86 -6.23 49.86 1.75)\")\n", + " parser.add_argument(\"--format\", default=\"grib\", choices=[\"grib\", \"netcdf\"],\n", + " help=\"文件格式(默认 grib)\")\n", + " parser.add_argument(\"--years\", nargs=\"+\",\n", + " default=[str(y) for y in range(2013, 2023)], # 1997–2022\n", + " help=\"年份列表(默认 1997..2022)\")\n", + " parser.add_argument(\"--months\", nargs=\"+\", default=ALL_MONTHS,\n", + " help=\"月份列表(默认 01..12)\")\n", + " parser.add_argument(\"--variables\", nargs=\"+\", default=VARIABLES,\n", + " help=\"变量名列表(默认为脚本内置全集)\")\n", + " parser.add_argument(\"--skip_existing\", action=\"store_true\",\n", + " help=\"若目标文件已存在则跳过\")\n", + " parser.add_argument(\"--month_workers\", type=int, default=12,\n", + " help=\"每个 年×变量 的月份并发数(默认 12)\")\n", + " # 如果在 Notebook 中直接运行,且没有传任何参数,也能用默认值\n", + " try:\n", + " return parser.parse_args([])\n", + " except SystemExit:\n", + " # 在某些环境 parse_args([]) 会触发 SystemExit,退回到标准方式\n", + " return parser.parse_args()\n", + "\n", + "def download_one_month(var: str, year: str, month: str, args) -> bool:\n", + " \"\"\"并发任务:下载单个 变量×年×月 分块\"\"\"\n", + " subdir = Path(args.out_dir) / var / str(year)\n", + " subdir.mkdir(parents=True, exist_ok=True)\n", + "\n", + " suffix = \"grib\" if args.format == \"grib\" else \"nc\"\n", + " target_name = f\"{DATASET}_{var}_{year}-{month}.{suffix}.zip\"\n", + " target_path = subdir / target_name\n", + "\n", + " if args.skip_existing and target_path.exists():\n", + " # 已存在直接视为成功(简易断点续跑)\n", + " return True\n", + "\n", + " req = build_request(\n", + " variable=var,\n", + " year=str(year),\n", + " month=f\"{int(month):02d}\",\n", + " area_box=tuple(args.bbox),\n", + " fmt=args.format,\n", + " )\n", + "\n", + " print(f\"[INFO][{var}][{year}] Downloading month={month} -> {target_path}\")\n", + " # 为了线程安全,这里每个任务各自实例化 client\n", + " client = cdsapi.Client()\n", + " return safe_retrieve(client, DATASET, req, target_path)\n", + "\n", + "def main():\n", + " # 在 Notebook/Colab 里,这里会采用默认值;命令行下可用参数覆盖\n", + " if \"ipykernel\" in sys.modules or \"google.colab\" in sys.modules:\n", + " args = parse_args_with_defaults()\n", + " else:\n", + " args = parse_args_with_defaults()\n", + "\n", + " total_ok = 0\n", + " total_fail = 0\n", + "\n", + " for var in args.variables:\n", + " for year in args.years:\n", + " months = list(args.months)\n", + " max_workers = max(1, min(args.month_workers, len(months)))\n", + " print(f\"\\n[GROUP] var={var} year={year} | months={months} | month_workers={max_workers}\")\n", + "\n", + " futures = []\n", + " with ThreadPoolExecutor(max_workers=max_workers) as ex:\n", + " for month in months:\n", + " futures.append(ex.submit(download_one_month, var, year, month, args))\n", + " for fut in as_completed(futures):\n", + " ok = fut.result()\n", + " if ok: total_ok += 1\n", + " else: total_fail += 1\n", + "\n", + " print(f\"\\n[DONE] Finished. Success: {total_ok}, Failed: {total_fail}\")\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()" + ], + "metadata": { + "id": "DoN3wOY8ygY4" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# 变量并行下载" + ], + "metadata": { + "id": "gLtEJ2xKyzbu" + } + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "riwrtBoEyzGr" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "background_save": true, + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "413db91e8fe94901a68f5e6346cb0082", + "d31f2b02280843bf99a3e542bed80d6e", + "265b7e3e3eb949a88c1c4a732426d3fa", + "9a069c87f423495eb36ad7eef2d10563", + "2ccf0ae5f6d44b329e8e06090c58134e", + "da32e8d1ae984b70824c9e004aa18c41", + "3b08dbde0cf346ada0b1e2bed6dd86e5", + "761ab587f5274c73aae33a59a480031d", + "e2ce52099d434656ad82ba8832cd7e9b", + "fe541fffd4d7462989cc17bc9cba2e61", + "2e6acbe11b8649dd9ba83c58a66cb4f5", + "c33d4e10e252442b8404928cef1fbe0d", + "1429af8f44294ea4aba7325357f20aaa", + "fb99b7943d1b4918b7195aa54846aa92", + "042e9b942b0f43259930ae8525bfbe1e", + "716559debdbc4a8f9426c81ae3db5992", + "b0f28831462e464390d81a097db6f458", + "ede39e6c4fd24982b8baf4a658fe615f", + "50899e1624894fc8ad5e1d42cf72ffa7", + "4aa860b6175c4950be11fd6852b4169a", + "7294bad2bedf4af98003a39f6bee1487", + "7ce39800a3954949a9363fc40fa68413", + "7f19865514d14201acffea9e65f7efb3", + "ce2ef8a9845d451baf2027833f6a6c1c", + "7073371c41b147ce82a7bf86a3fbb5fa", + "7cc994e6b84f432db3f07010f7c26785", + "62bded19852443079b5a051679735c56", + "05edb27181c24750b533aa49d23685d6", + "27e5d5dac709422981afbb17ff60ba82", + "61b3a24cb6ba4a0589afdf2c3d516e3e", + "3dd8a5f00bf54c9fa7fc0725b45954ba", + "6d7a5ee32063413691012474c9c035f0", + "281d1afa337e46dd81a24a47fb463b94", + "c4746e30bb714d88aed6b768867cbe3a", + "bbf1949c1d064eb092af2da7719a2b4c", + "bf26805f84704e3da374eede63a7aadf", + "807e30e18d8b4b57aad4065e32579dd6", + "1109cd7eaa6843a594c880554c03dc66", + "0f942c6d1ee64cc2af493e5c70079223", + "3bc737e0d9bb4709ac8d6dda81d48b50", + "607b87df698c46839b931a94c1839e0a", + "e65eb283b08b4a6c9ef72f33ecb24d3a", + "07d713c47a824403ae0c83dc2e3cf060", + "224d4671694f4d44ac33a26ff5522a3e", + "9e70231e57244ae48bd8e8db6d97b20e", + "41d570cba8a34d9b91c100b16c909011", + "1891c4d6f280440f8dddc4b17986c77b", + "35b7efda27f142bf9dd29534ddb6ec48", + "1338ca9acc07480d96000a8942d7698a", + "e88bcc874e3b4a7a9c8e89baa635e8f6", + "89350b67df5248d69587db20f3f9d754", + "7bc90769ae144728a1a481d43b13d6f3", + "f63de2fbdf2e474897203f95bc3d7ade", + "b465f94c9f9f4600a8c32e2bf5935288", + "6b00ec0f63f54031aac0561c49255d32", + "d74edee0a5284a0a8c918ba82eafddc3", + "d4928ff1c0b94c4fbbb114646036a9f9", + "f7deccdaa405476c9480f37c09312549", + "867663675612402b9b37568d3da002e8", + "7394bd97b6f940d888e50425a967c108", + "4be524436d4e448689c38ba39e9a31d8", + "f0e21f9c9a2f4d46b29b0705bc0937d0", + "580816e36e644f2e8ddff91a23a943fb", + "d108f4105cff435e82fbca10d99117df", + "5cb8c618ba9d46b48c26fe4c5824d95b", + "5e50c7fc82aa4fb69e1a478db3b5f6d2", + "170071f8ecb146ecadbbffb4694dbc5d", + "21efcd7264254a0bb5e89509ee0c9dc3", + "956dd3d784b04edba1443ac9a66d1d8d", + "72dbab1c342147c2a15c39e291445011", + "54cb0948b54943128578fae6d9facf50", + "67b4f8db49a8414f8e7869829d995782", + "6cd01683b73141f7a0602adaee64e401", + "d0dea2ac7cc44ba5bdd3d3dbd47143f1", + "e7421765457e46e2a9e803b73bfe515a", + "279c876a9104497e923efd66edab1456", + "5e2b4bf682d94cba87ebd8603c80dfbb", + "bed07f445e9f4cacbbfa7a635d47d9bc", + "abe656a397d54fd88fd0826d00718796", + "62038a5c6bd24632a15fa7e83f50683c", + "6d770f063d654645bb921b38d465dbe1", + "0f3a72bef9554fd0a5bdb6ff61109609", + "6b4abd0fd54247fab6960acc8d0726bb", + "27758dc8723d419eb562c2b68b15c699", + "dc13c285246e4f20ad3edf88935061f4", + "57b6ae486974412c84083b6f985d6179", + "1370cee10d944eaea7019907f8458908", + "0eea45d3b68149fc9bf4855133fce917", + "d42feb8693dd4cc7b4f78da407381371", + "6c7330bd3d584c44ad0d1b65bd091352", + "3a8b63682c3e42a4a2a15f229ea3555e", + "638d7b60a54046acacd7288ae87329a7", + "20b32f728a484b9abe84b6ace728f27a", + "067a82fbd48248f0924afa7c735c43c8", + "1409f38baf134f018af7971cc6c79a9e", + "7199f3c5b072405b81d0f8af2143fecc", + "5f6fcfd4977d4839a2c2f12fc354ea05", + "031748f0bd6e4d618e29503141a010f2", + "02b4e0b183f540a59e7134f1ea78574a", + "a467494c4ba44c5aa77be48d58e581bf", + "be7da3bccac349f39f2fa22fc607ea81", + "9471283f4d6f4bcb95260122e6451dff", + "6ce359d02bf74dda82ee317b7609c6c5", + "db7b35eda71b4e7fa551861636bf1e77", + "f6f201546b6a4bf5860eed5a104571ac", + "8559cd7226964daebaea5ca74b978f9d", + "32a1ccbab76d4cef91ee7df87251add4", + "224ab22afe6a4deda20ac49bb4ae4b37", + "a539ecdc441d465696078fe7fb8c34fe", + "d6556d612abb4bae9aa8555140d03c5e", + "d924601d988443d59c07a6e039454f10", + "3f747cead818492182e7f82a46ba785c", + "3057c9d133884659a90466a469e7a24b", + "002be1bab43e4ec3ae9bcc2c1d3a035c", + "7a5faaf0e0bd4e93905fc5daabebe35b", + "76d26b2ee89b43d08cb7e17d67a08c7e", + "5ae2844308874cfe85c5755f68d6f570", + "706c0b2fd2604711a33adf4a1568e02c", + "e9c420fe8dfe48ca95511312844c93ed", + "f2b9049500204054b03be3a9ba373b60", + "9f7adba225ae47008d73a2bdcab36dda", + "ce8ab38c394e4a4b8aa397d50dcee958", + "da28560c3fc14384a55563ee4dc47468", + "9b6e5b018a19402aade252d3ec1b0cac", + "5f0e805b7a674fb5bdb0bc1f7c323e27", + "fe074be44bf54a0aa1cfbca21678be33", + "cbf6ff8f6f254ce6a434f457112da664", + "53446c4a91b143afa01ff68ab4efde4e", + "43fa6eeadd34402baa2200a31dc64b58", + "ef37b4e63dd544c499bba52e68215c4b", + "18a17006b2d449379d1e1ffef69cde1b", + "e592cb5d5c8848c8a91c26d1f2cc4d0d", + "df0e5fd0e3754bbabb1fe694b4a03e5c", + "da22ab9ebd004af7a9a511b5ba6ec1ee", + "735892efe4614d789648a18c80981acc", + "266f8e38b6894e978db88c7ce1e5d362", + "ecb1c6408e0d499989c9755f96d7ce20", + "467b4877c61b49a1ae456795ab91ab00", + "06977ff04bba4faf9bdabc0ce03745d0", + "64cff9b0b598462992c59f623d85e6d8", + "293c4ef99e3b42fcbea2f6269e95fcf0", + "272303af76fa4b53b3fb72a048c30d47", + "98f7cc95674642938df58ae0165bf059", + "8a1028c2e99e48989cde9c95df1f3e91", + "dcea9594c87d4d5f8f4da2a4b4057dda", + "efce53bf85d44662ab582edec6a53ab3", + "a3fa4a8af4374fcba6ab760d57583806", + "a6415ba7bceb4c798272e830740a90fa", + "ea683277a8e646feac68712739bcd7dc", + "8122645ba578450b83cf5002d1787a91", + "1fc1eada323c4f638c8c1a74fd137bde", + "713460e476834a97ba5cdaa2aae6936e", + "3e1fc9770d3c4611b2f05c530f0c040c", + "61ced621389a4b30a3071dd8d221a266", + "a3cd78109ad14bb783b4845e5b88cf26", + "971fc5fc704443dc846fbe379ecd95d6", + "57ce86860dcf420eac584013db882f3b", + "faf9aa4d9748424db18a014e983f7f15", + "5a8bc9b9248c457db4ddc8a2d7599ab8", + "fb87176035f848508882a072bf3fca90", + "6f20f1f92b8442998f4a15d04d0f56bc", + "aac208b1a6f9436f892c54c2adff5c25", + "7d09c026a5014fa5a31064b3fa256f9b", + "41e5545074b84e8f8f724a2c65024920", + "b609d9a85adf40e1a659c964ef7ef12f", + "190f96f7a3874d51911e5a7d988f8596", + "63bcd637f21744218d50e41647759758", + "a63029bcf3de4e0ba2708909e1e9cbbe", + "38094053e28f49d09361aca9f4c94a27", + "fa9c1665d6464fe889e36aca9c41757d", + "867800b1a70c472697efd2f811cffc66", + "718dbe4bce754d3fb05e9b210be751b5", + "ac004fecb61c41d6ba0d14d3c4f37f6e", + "4fba815763a74940ba738bd8213f2977", + "0178105c72204d93a01948f560944851", + "865969d16a764804bcdcf774bab0c5cd", + "46a034c1ad1140c398056d5bd7f4d153", + "892f2cd3144341a5b23e029aaae5799a", + "3dc13bfc4f0f4112838dd10da13e13dd", + "4cc9f0bf7cb143c793ff71f433aaf5fc", + "8ab1d185cf264725ac3591cae610ea4b", + "9941e39db2424f5e9b4be88777ae52ac", + "c238a32ad8114990bf6003574334ee75", + "2972936520874b69b31c5b04fd7c59d7", + "04201c0ef38b43a4ace67b7a9e19da7e", + "352157c95ae04202ab6a03f0c199c2ae", + "bb3bd5fc2b114cc08650e1fda243b740", + "df461d8fee844e92932a35e9d564711e", + "ef1a737aa6df4994956dde38d613dcb5", + "ad85ccfa48e84c208902ee3ec9864230", + "913476ff15f14095a6c7d4297ed845e4", + "6e2c56b257a04436b6b7135c7b31716d", + "6b5f9470f8ee422a80aac59e81ffe8d4", + "0625488520764b81b6688c04e85dadd1", + "3a48452b7add416e9b062cdfdc39757c", + "2a99b893df8b4177a69b280a6e4cf367", + "86977a9ff8504f6686510c2ce3cbf06a", + "5cb7a67bf4cd469eb7733180f1dba79a", + "e3bd6ee8c22549e2adbdf7654c1d356a", + "2519659339824903b4e2bb8f5390fd86", + "7d611dc2e8714d178f02bc059e6c8881", + "0ea47c3cd6444483bd32e6950fd70e9b", + "981c7ec329c74a6ba63b777c1dc921ee", + "1302e04154064797b8d2640c53482a03", + "0c2a777c896a440887678742a3832e55", + "04fb43555f904a11b09330df314a6b60", + "e4ec3d6b76eb4423bf43998ff72ffd72", + "6521c463d6cc4ceab30593bec84e5534", + "29f16da3c08948e4a7abbd65a4402aae", + "4b9ccaa19674440ba048e79c69281ff2", + "7baa726e848f46d1af37d632feeb80f2", + "b77ed14fd23548b4944711aafc3a410b", + "824e8425372e441590582c3bbf03f9b3", + "8739aac497d34c2aba1a182a0b83fa31", + "626f547502094c3bb50a6e66ca647304", + "20acc0800d564a97b77b7e27ddfb336b", + "6f80bd6e209746fdbdf8be76535cffc3", + "271f66ee43e64137b599f8714e7665f7", + "c9c1445d6f3843a2bfa877bebaedcaff", + "bf1b5c420753469e80201fd9f8c6547e", + "a7fc73b06e8142d5b457b5351ce2dab8", + "04153ea9c0644cf7b51e838c158b9057", + "5f00c7e6e90f411eb652271a259aa2f5", + "66a37b37735148c287e255fda1d63a10", + "491b3e698dc94aad810a55b4a433160f", + "35a124eba2644f239e0eafb87b57ddc5", + "74feeaeaf86546c0898bddb01a821df4", + "675726e906b847c092d10a5371691c28", + "97323b9f549b42f5aa09203ff3b24aa9", + "e42cee7a7b574720b32f31530d34b413", + "8679b68ee4a9427c933c8e67ef1857bf", + "3675585be7f245aab4f875950e144d0f", + "667127a223a94b65bc650fb4960f3b68", + "168fcbd75f2a487f9f239844663bbda5", + "78e1dffbfe574100b3855b8ae605d175", + "d8ea3148b1ad43c680de3f227853b92b", + "b055cb23efc347899ab3bf91460063ab", + "97a4c0b1178e40a8a528380da980bf11", + "3b9e565687f9415fb0071673c1aef01f", + "2a5f588b762f46888e6d2e065ae03617", + "c8db829680cb42b5a2b297c7625c013a", + "005dc8b502e4420184c5776d21381373", + "d3a9dea319de451e93583f29d789d620", + "7c94e46f55f844a7a346e9ced3471bcb", + "46ddb799f2904ac0b892e4fe036fd329", + "88e68a54e4fd4da18a87f43142fda6ed", + "5a8782da001e4dd1b79da74377c34e4b", + "fda986e568a54367a5c7f9185fbadf22", + "d4dd30c4c1e243da86778d4beca5d672", + "312b30049026447cb5c6692064096a2f", + "9f98e653ae2a42dbb528b26f2c997093", + "370b1ae7c4ae4f00b8b558d07d945458", + "735e56432c864df48662c88b91b8dd76", + "c19f66257c434dacb3cea913510f5d20", + "f28740f0442c4f60b225078b68d1a422", + "4d5302e73cae471f94e849902abad25b", + "9da5fa00b0c4434bb48835f922156fa9", + "10a374c6970f4c2dbe455b6b791eab1c", + "22d03cbed6864169af65ee2c40b3e118", + "66d94a1deea948da904f251a428fe8b6", + "19fab7d90d534705896de7671fd34ab7", + "b97a0c5a481840708a4477118cfbe1b0", + "63909e67e3074c34b0ef71eec48245a9", + "a64267f5efda4319a74e69c634d282e9", + "3c144ee1155149ed842af77886d8d847", + "d02e87a159894161bfb7873e34425fee", + "8c5bf4d1273c401ab58d638228c0ddaf", + "c55f6d5d59ba41299adde37fb52ae34f", + "bc1fc83a773b4e109eea4396b772c6c8", + "bafd7a61bfd84861bcaca9168ba785f1", + "5c643863402348e999851717a9456139", + "85acd10eab0a4f3e817238870d728fee", + "180fa355cd724856ae53f4e799d0e18d", + "e44f5fd2e0f14e24b8f0628a2802a67b", + "5f998023eacb4667ad16dc04e310def1", + "9cda74602d694fdd85c6a7c08b829312", + "3cd6029178804a518b446c65439c00c8", + "66de1423691f41dda55ae6769277026e", + "a1f6ab84e96d43c79fdae7c21a652404", + "a182fb9073c946598ac597b9ee911a01", + "6b38f71bdca149d1bca7c77dce043f28", + "f4e6bd7ce5264688a656ae23c108a407", + "a59865b9db924c2f9c3057bed67b62ac", + "2461dd6b9b1d464e8e4ad25c02c78962", + "f148da14dabc4e0591dd4c679f654c7b", + "ebd6f045ed664f228847a7177813c025", + "792828939420423cb9e685f31d3ea50f", + "9d8346f997dd414e87a3c55fd7b755d1", + "815ab8286e3448dcab2282cc5a6c522c", + "b5496fac21bf4a969a372cd5ebbbc508", + "5a0e036f52644a76a92158e7d5b0f1b5", + "8771a1cb7547424a90dae7a361917d53", + "732996a092954b90acd2b8ce103edd72", + "08756b5124ad4fb094cba5c769e5cb34", + "e5505793a2154066b253b17b08144d0e", + "f24884a2307e41639c3f312d050dfbe1", + "996271a5d26b4748b8d8e0878441f007", + "7a35a22e4d57401aa4251e5a76ea91bf", + "986e34acfc63499eae29413cdbf5e0eb", + "df7a41cba57e490e91f2d6ecc154eab9", + "93591faedfc54484b9d76bfc45cfd95a", + "f38a2f61bd2a4114ad88d19563d1a4e3", + "c1799b821c5c4356a86901497c02c297", + "273a1267705e4e46a193a22a64cdd376", + "07653619de164b41bf5985eb23d6c441", + "201d9c38e3df40a2a31e7b8a2ce2e04e", + "4d132476faea4ae6a7ed984801050f58", + "224fab27d5a54287a0a441fded831cb1", + "1584490ba4bf481fae2b9328c7dda12e", + "0d4c5cabf231425591ad329f4db96bdd", + "a6dd56d8245e488c8eb38d6157eb63dc", + "ee880606377c402caceb693ab95366c6", + "37fc2487cf3b414eaa6b56dc1792d0f2", + "1e5f36fb1f2942989564e7814370fa99", + "659d4a449d95414db3f0b94748965472", + "c95f3b7e721049559feef8d321f68c81", + "0bde091f8c76406b83d385c4d6255329", + "32783ce119f8433d929a96771c8e01a8", + "bc8f302fcfd9454ab11126dfc2bfa502", + "9009f71d810744af87fdc0cb7ddffc24", + "31127427e2414c8d9d3bb9968c4c5fb3", + "04c476dc94fc4a628e4f0f76ef177d20", + "bafc8d2f6bda4554b974629c510f604e", + "9cf301ef01f44b47ba5395eeb6374a66", + "78a26ccfa72347539f3a5bcff0864222", + "235f0b12e4004ca489ab88996b226f95", + "debda9563c504ac5a8a3c63e137f3e97", + "0fb937602de1492b8d8e7d461071868b", + "aeefe585b1fa4adb848eff27baec481c", + "e4d2438d327d47279d57cd8642943174", + "45df8dfdb03e4c85af67b072bd472438", + "688418a304c04d3e9bc79b34620f76f7", + "69069900296e4a9c9831f988b55f1eed", + "9cf1e93dbb8a466fac9ed0c4aeb0bca9", + "aa7abcce29fb4ab9bcc28f973f94acf2", + "30aef895f3ac4528bc0d9559e634d162", + "7a51899a39f2418598924c5daf4d80a6", + "427ad5c8e0be4e0fbae5c4663452d3c3", + "4bbeed70cc154d5c9dd9952b6c7fc4de", + "4d0a04ab1e9b4ead86cecb98b6d848b3", + "c0982939865c400aa29d0d91d8eeb4c4", + "391120c7c66144ca943770ea9dcb5fbf", + "0e2aad04fc2a4eb4951ca4d9f6b3f87d", + "d423288197434a219eca131562fcda5b", + "45fecc81cb464bc09ce494739cc66ce5", + "9b9fd9ae872548338ed9d720d6617f72", + "0f940df74d824262b6fcccf816f554c7", + "004a3a69c5ee4fd38cef25b9002248fc", + "79af527604d34246bdd54dc44ffacb89", + "f6e2400fea224fe7ae571f8332ed2306", + "b3e4d69ca88c4f94936912e923d5d242", + "a838f6c2a9ea481b978c6680cfbab5c5", + "1138f4f5c9194aaa9b7cb41047c1a41a", + "358917cdb83d4855a9b96c6a338250ae", + "61b18b987c4d458f9fa92a76a9aa2b27", + "0ebb37d7e09f498998be75d253cbf923", + "d310bda9e7444a75a6aba44318fce7b5", + "a840e29b9801497cb4c323062ba914ca", + "c3345e7aaa894c629235826479a6b9a2", + "e009bd2da7ee4bb0a7dfb3267ba54542", + "022621e0410c4d6ebf6a0b06e57ed543", + "46e4777a2630463eb5220d8c4ae51950", + "0ecbddf77b7349f4ab005d62bf9f41f8", + "f165549dc6aa4f739d11e3bf680ff27e", + "048b298b6e994dfc8521ccf1ab73047a", + "efb52d6edd104939b0d79641212d8349", + "bcffee6731bd4147bea76ef50f2f53fc", + "2343de1118c24fafa2dd1694fd904e55", + "bfd6b76f15df47e9809d0bbfd2ca34d6", + "fe6d165386a14f8fba9648ff4682dc5e", + "be7af758749a4883af1923460914430f", + "198ea5194347426fbfc4e1b2207f5b11", + "609355257d334d5ca9430dcb5bf9b42b", + "4b86cbc8b7534f9dba15269d4a233102", + "5dc50fba434f476b8f09abcee4699100", + "430f29de522b4ae2ac8e7cc5c01b8fad", + "a5f2e970501e4f9f882dba371f808aad", + "209ae9bab5c44f64ad50410c052d2078", + "98c3f5bb136e42a38677e6e702aa5b4d", + "1dd374ef2f594c209f975a7c712a831a", + "4aba491ea9ea4212a8e3fa673fb6bc55", + "05d0092dcf3e4e96a83ef47f8dcacb42", + "d9aa051cb2274aef9cae7e3d48603896", + "a6e19f3fa3224eac8d70a8f1b631f21b", + "dce5df6362a04af1aaafdcde5c9cd39d", + "97480574e3c24b8babcbe84ff7ab7faf", + "d4d811a6f76942589fba18dd54126d72", + "9429581a6f6f47a4b4f8978b13fd0689", + "baebd6bba1ac4bf6890b6912972bd0fe", + "dc21e186f5d54ec79c798846ccda493a", + "4ed90e577de245578bca628ae762f242", + "20a64ad6863a4245924732bd37242c39", + "c108ba8ac64d48d381635867359c60b7", + "12c24fecb1e84ceabce261d92bb26dcb", + "6cf2d5a6b40747b98c917eb37ab1d180", + "86b9223c29de41139015e0cfcb6aeb09", + "3802bf67ecf045548230b0b2b8b80fc0", + "b470b1badd604e6e8683b87445fd939c", + "7505591e3e7942eca8fe55cb091a2966", + "ccc517602b3340929a66e31d993daf6d", + "1ca42067c6ec4749b81003c2be9faf97", + "6344487bd06e4ceea6c4cd2a63677955", + "4ed23593cc2444188d58c50078d858ee", + "a059c526e52e44f09f8fd16751085356", + "308cd4cf2acf41c084e019fa7b3299c9", + "0e3b7787ef734c25964985cdd8bb8e9e", + "0f90505913014b08a54c65fa3ee5729d", + "3bbdff40a20a4b0db21144dd8e5d946e", + "3f98e6848f7f41559d16456c93ddd5c9", + "cb5dbbfa5f564f49b39fb889ad242845", + "4f584b0244a9475fabfdfaa1038cece7", + "4b2c07137067469785f2c44f60916c59", + "297cb3e292104c6a8fba68b9cbcd8180", + "576bf4854d5c4b0cad839d591a6b1138", + "3d95e94fc47b49c38eec3a7453551ad5", + "fc7744608d0b4e6b96482d3c56efd201", + "08df5b2142b648c0a4bcca106777e1b4", + "4855960e90e64820949616dac3577d0e", + "10dd4bc6ced440acb42b6c60b4eaf6bf", + "8994069aa7974e5ab22d5623f5ed8d18", + "f340fd9c3d674e6393758eac649518c5", + "81bcda3e07ee46d8aaa80507c7f133d9", + "1899d2d621a04ab58d89c751d6c60c65", + "ccf12e4babb847ffa7cdb90bbd228e5e", + "fea6ec13a3774d2a91bb1e048fbb5b0d", + "e20d3d6c019a46628d8edd5403e4ad9d", + "b29a36fe4ffb4ee08a198656d5d24383", + "bca409afcf734b9c9f7cacf61644453b", + "7485873af19e421797115b3b0169301c", + "27344782b8944a85ba4ed81611c64d25", + "8f3ea7e04a874d90aef6840b477eb84f", + "8ffc3dcb4f0c43f399940428f8675e6c", + "2b5f32131c8f4e72a46aba1ae180beb1", + "9ab3a9bdb7464e5a9fc1d6b7b2e586ce", + "6b74f9dd2ead41c0b913e5a74d1862f8", + "816fe6e445594535a024f2859381c67e", + "f5142f94d8ac4d7da61eed0e1fc4b0cf", + "4a903c74d27c44aa816407a7c8f24806", + "35dd58e62a514d78b284e39afd7c56c0", + "6c174dfe55a04e2587f6fad719a43783", + "33fe3ae708f44228b869a1ddc69c11a3", + "1ec661fdb6b3417bbba853df5ea47da0", + "f3855199ab7745289c571c4cc07b10a8", + "a5e22c85dbea4578b6c6565ae4a973f1", + "570a0c98b82e4cc29dab5b86e634b23e", + "427040e4340041e69694661badea7101", + "e8c27cb2c49d4e5fbcc2c3ff946c749c", + "050da136ab2243eab0fe310bf4452eb4", + "6c2f0a0911894e9aaa162ee7fc6c0698", + "a381965428e34560a8243c5caa87dc82", + "1cbed24b92bf433baba9a569eae5943b", + "bb09adb502864a078b07b0ab18fdcb9f", + "b8c33f8505b04396994df01c73bec547", + "bef6760f3a624676be701953ee2d07cd", + "1ff57edef144411aa186d2fdc79ce074", + "2b3113e58fbc4c1eb02fa4aab8761fde", + "877d164804364132b795ae21090d3b31", + "99f906a9a4c641588d26e34f98de8cc4", + "d5160c773a6f44f883146b706efc9ea4", + "8ad3017fa51e44f19f1c24a140f8a89e", + "c4592b245d2e45099d9ff6bc01db7a98", + "84f6984a24e242d2813c1c86a4bd586f", + "41deb1e168d849e595787bb414529bcf", + "de20c7c6c00549f98b1ffa51c83d929a", + "16dface34ed043fba31a1ba2b1c34b0f", + "dce7a7cbba4e44ad88731a067fbed8b2", + "dee655399bc046b7ae421161d362da7b", + "29655705e4a646ccb630b034b55d7484", + "39a934e54fd842bf836433e4ddefb477", + "d2b9db67cadd429ea855aa75e27d931e", + "e999ee4895984b0d934ef0ffeff5b0a6", + "e1892dd196c341989910232a2d0e3b92", + "f0c0bd0560ef4242928fbc957cf95922", + "c4023b3ed67842fdb47e3309eea97e61", + "32100335bac747a8a5c9fca13d23057a", + "da5a74b24a39498f946c52a6bb163a5b", + "805486a5f09747518983e7f02e898714", + "987dac675e7f4b99850c8d66cfd4d495", + "76ec5696b9d54c41a72c9ccaf393257e", + "f845f3383d144d6a8afbd7262f2732f4", + "d4e6d638a7c1432688c52dddda885158", + "bd4611b632434463879c1afa448dde3f", + "af8ac5837b404e8c9be0890b823749d6", + "95cf02b21489485680d411418b0172b5", + "9a4f03e979984c05a96da5a689cf5e00", + "a78b87a372924fbd9552799d3a1ffc6d", + "ea128f17fa124b8faa10a2c6865f1a95", + "90cc265ef93d411ea59b9f262f07cf2f", + "e2ab0fe6182e49e9b7484c8cfa4ef1bd", + "e7b29363312246beb9976cffa7dc5a36", + "49037a3a0265484abdff123930fefcf4", + "247262b1eda54ef4b87f8bd7ab347fc0", + "1e13df65cd0d49e58417c7a26b5e439f", + "7324b0000dc64434a8627d885549e8d8", + "edef1961d52e4270b0739d903f5bcf24", + "d2f02512827e4fb3a3cd20836c57acc9", + "270fe0d412f24fda90be217c320d7d9e", + "286f501016ca4c74802e698ae93295f6", + "4318d4a63e564d9083f25097bdd31f53", + "818761b923884903bac3250ff9991964", + "2252ae678b6649dd8c3457573798c52f", + "e7f88d52b35841878a31bafeb48ee03f", + "25dbb936fcef46ff870b7978ab0b78dc", + "4f9435e4e7494a5290ad80ced109e8ce", + "4b7ed37da35544bd95a30636768d3d28", + "22811c75e7594ab48b5b20d3a90e66ec", + "2718415ec9744943b771b8832d50e985", + "3fab7b4b75404459bef8df121148155b", + "3f88ce3f73ce4ac8bc3ee8213dfff49b", + "bdc8eda5f7f840f98047d55628618cc7", + "031112bc58194dce94332f793c2bb478", + "b67165f5c65441ab9b132ff657947970", + "03e2d402b17d47d587213b13c465e33f", + "4d6e911b55704fb7adb062922c7180de", + "8888d4ef7ac44c3682cf6a594f64ec6c", + "4ed7ac0907f648888b61d47ec7ed030c", + "61abe938552442bd92e2df10cd0f104e", + "eeaf3fa218054886943ec847a8997b6e", + "454cbb12f178474e8908ca1090d9bdbd", + "5b0ce46641a94fd4a43d117bd4a5562a", + "6dd276515b194d38a0a676207b45c479", + "f1da68a086e0440ea8ac3025d760cb53", + "21e29be615ce48118b8d884f610f9222", + "f6c70308fec94e1fbf2483cdc81aab7b", + "85f7aa26902341d8874eff91a80e84b2", + "518e53c6c21842278f3c7c7235f73597", + "f4e9eca1762a449cb00e2df7f99142ce", + "372901d71ea64893b5f72c6e034534fe", + "29dfe72f06044181904cf2d8c66483d3", + "f925272e577340e4b8d5c03ae9407941", + "e48d52041ea04e389b1d553110f34c0c", + "463fcb9f914a4476a6a7c336105b38db", + "d0dde7c225a14ebcae88cb8246720443", + "ef7407a533e04700bfda0ed2b800f9c6", + "4aea62b6119a46098da7c9d367a58c2f", + "a91629823f8748448a5881cb6448fddc", + "4f291b1a7a044fee9e0ef5792209c1df", + "1f285e2234824bd69f1e43261cbda2ea", + "799d14bf692646d7a165bb1daa867afe", + "e6fccf1828224bbfa74586452e483200", + "85fb0e700d404e4ca77a8fafd7f6a42a", + "021ad40da5624ee1a03f9b765e16e515", + "820445f928e749b6a92dccd7e3cfed2a", + "0629a5ef34a64449a0f59db2a9ac6cad", + "af3e1d9164014a6fbab5e1aa2768d4e4", + "abac517d33d141c59794e481e6b267b2", + "996be45b3fe047b29db9b1e55c694a68", + "a9e62067f7bf4f619ff6cc2aa9bf6e52", + "6cd3153a0afd45ac977a39064c72d877", + "72d2e2304465418a930ed3c739d1cceb", + "952d932e0b9a4c29acd358ea0d5480b6", + "d7987aa3e296459ca6479bcd907288ac", + "2357de284a3e466db4913de03d8157d4", + "3a899964136a48f08cd4c5f554f1c53f", + "841deb223cfa4078bdc98f7af991a1a5", + "44c27d16faf24050994d10ef8f229e6b", + "eae93106c34b453abe93d68bd821fa97", + "6194de7d55b040408245c7ced9df7372", + "1b73710660284834896963c46a704370", + "e784e9ec442b49a69a38fea1cfd9eb8b", + "329977b56fe6419aa7879814544bc401", + "9582c396815f4d65a3238c1aa82b5e81", + "fba0aadede54480e8b7174f609745cbc", + "d21eb1bb706a4db6b5381d55968b589a", + "ff6373535542463baa5f9450f4f03b47", + "df646f586cee4756a4b621115b7aba0a", + "c075e41f9feb49468bd34344c0c43e6e", + "b374514bb2c349b4b6d235dfe366e067", + "472c36591b2c4e2abf2a2204264a7fa6", + "2dc73a26a2754d38b80981dfdc7732b7", + "b4a99ff6ffeb4b08842ef36516165e4c", + "79a76712bd934ae89bb063d192cc788f", + "abf7a6e3ba954d0b8696881befa72cc1", + "cbc1588e14d2433ea890a9693037e089", + "45123c43317c41e49afc5957b59500ca", + "68a4a9fadfa044e39866fba1067445a5", + "3f9c9d0281074566a4997b3ebea4d357", + "07ad7fae51a64752be13861891bb9094", + "6aae706347b3492e95183e9dee43c0c1", + "4461a81e235e43b384a7b247caf1f1ee", + "c9dd592d67524f6ebb3bc4893d0c472e", + "fd759bc308db42fcb7e4a798bc2b7b01", + "e40963c709d6443ab182a2f1e5a61ee6", + "12cb496e571f48ad95ed676a64e4ab36", + "b5a60944fde6465681583b5dc89ced45", + "2e7647ebb6c340c99f98359ab75921f4", + "0440e17d3ab94424b4bb44de75b3993f", + "39ab5875b7b6481b806cbe3ceff77c7d", + "17af3a09d4d14c99aa7ce74a99bb8ad8", + "957294fac0c040509690462ed545a8f3", + "feda56e153ed4770a5c40e4cd931414a", + "b5e1329fc71b48b89fc8d12f9a4cbc70", + "156aceac175e4179a2c6db241cce4167", + "3c15ade0b6d84841b9378be0399d4d5c", + "8c1090ca1002478894cec9a672d9c676", + "98d7274056fc40919d464948c60a84dd", + "3ae84c5c0f0f4c548b67b058797c52b9", + "27e785eab4704145a267fd1479a101fb", + "7a91ba8493f94f47b33797c0abfb4af2", + "c316bc42e45b4e88b4c701f582075a96", + "e7b16514941b4665a1c14bba8952ec25", + "5dc943df8d93491488d1d234e4fcee9f", + "4a0e020045b64e62a453aaa4a01363c2", + "a3c1d85529d6414288b676d8a29ba5bf", + "d8749847290e45768fb1960ecf228a4d", + "8bbcf67cb82d4069995380af7c0f09eb", + "108fc9d5ffeb40cc94b24703fceaf9e6", + "6bba120f27b34128a7c2d0772a2358f5", + "eec7ea7a5ea5437293d0cba2bb9a8301", + "a7bd984f0dd0487eb5519e0718f2fb7c", + "6927afac189e4c0d85bfb887ad07d01c", + "4322e576af554c43a635db616d72726c", + "8fcb671e19e242f79703635fe2b8670f", + "effaf1542d8943148a826a29563cdca6", + "ced0e00537d24fb2bd1aa321754a83cd", + "8f29ee4ab49b42e4a97b9405f6c9862f", + "c152c59192c5494f9f1adf1a88daf204", + "ba0ac7d4a9894a40bb8d3a80daaa727a", + "fb0d8b7d174348a48b33c60c23a30865", + "a844d05684ac47079d4b8781f58725d4", + "765bd705894b4e14aa63f4853d846fa7", + "5928782509274cafa1ca837633b05bdd", + "decf1dd0a89f4a16861f05fd1c645c73", + "37eff685093b454b8339f63c390e97d8", + "4c04d5281a3e4216b3e7d50c746882a4", + "00cf2d7136ec4180b589787642938e23", + "b735dd96efb54fa3825066e3702fc3a1", + "dfb7f4250910415881124c5987597110", + "0543c820ef044e2baca0b4e250fc156a", + "e1ab84060783484f88a372e744dc179b", + "202e72d1e83e4463b46384665466904f", + "6e3551e1879c4c9d90b1f956993bc4ca", + "cf5572ef5e18471e83e8520374ee9d81", + "1b830087912141e888e952c3ed77dbd6", + "ee860a528a5f495baa9085b9f5b5bcf6", + "6fc76ca5b0a14fa1bcceb3490d6f080a", + "74e24aa3a4954e8890028fb31949f147", + "942e6c7d5bd24be08d4aee9e0ec11294", + "dd4c0d8e5ae04c3aae781c2dd4d39098", + "c3dd590621d94645a5c7cd3e963e3bfe", + "64018aa2fdb646f7acfe88263bba5599", + "69356515785845168ba437af5a1c4fe1", + "16be1f63080443f2a6e22f6c331f1444", + "686e9f300be7405c8dc042031bc01ff9", + "8aa5590166fe434bb5e994278ec0a075", + "ce2453a9bc714a17b0c1340363811fc5", + "71822d9108274df6a02566973b7183d1", + "91bbcfa0e9c246e1ad9bed655627ed97", + "ccb54ebe854e4db88a3217d08abe12d8", + "2135ff7215594af4a46e8be68d8e0cf4", + "3687ba42b695450b918729723c2ee9c7", + "91e87cb232f244f9a632f6edbc92bbbd", + "762938af7c604b80b56e6a7d19d9ccdf", + "88bd5f91fec44390a860d5da3e798ed0", + "2e54cba6633c40e19acef500f819cc04", + "9544136160c6420c8ffcf591388947c1", + "f3fc2dcd4e834197a02f35f176723825", + "4f4b9b9b9b864851b3da335195ab65c0", + "5f3b0739a69d45e6a980e2bf159f7655", + "dbebddfc606e4156a34b6b22b3e18a93", + "94cbb0bb3fec4a368da80af027f4e85a", + "d018c89b776241eea14831a4f1a67376", + "92cfd2b084864490a8dd2a8965903298", + "636780d432714e63bc073113eb296cfb", + "7eb2c811750540dcb6a9bbac95faee83", + "16fb9ef9524b450baba4e4d98832d7b9", + "8ae34d290b374ece842bdea5c31d1dcd", + "a12aca897fa04f5fbd56e048986235dc", + "f5be4e33b0dc423db1acb619d945650d", + "24b8981672654745ac20d4ebaff7beb7", + "6d382136bd3543728cbcdaaf06f17b71", + "21d5a3cf43e8475ab7d51e51a4460bcc", + "d8bfa2e2e69c4498ad19f5652a3eb026", + "f2d4e03f6c10430081e00ef7d7a3d0dd", + "1a1a2ea5313d41938c6ec28ef8c537b1", + "03b3628bec714858894a7ec0f1494b91", + "2f906219e63d4a36bf717c97c7b62f78", + "c76f97f17e2d477fa9d1bfd393aaf5c6", + "cfd5a6fadbf74e989ad2359458ae7d94", + "191b8d40cba34423acdf78c808c8e01a", + "0b83fab6cd864f51bc27d484de1218c9", + "8ae299e5d910437a9329ca5ee4fee27b", + "5e5efc500d654167969a44597438ac3d", + "90a4786432584562af1e132efd55d86d", + "1e86ed2a1bbe4751ab8b8176c6381fe8", + "865d2c45c91c4b09aa653d9772a067d5", + "f8c461e3106d4dc9abbe638a50a65d05", + "5dbfebba68764a64aa893f19d2e6fff9", + "b2cbc10da14146aea2ae0cf9acd7dd15", + "6e71c2efae8644c6946c852aad18f3aa", + "00b3b8c5e54e445396bd59f47c5ae439", + "0ae4b3b1e0be4f51a2ea6a5d14d394a5", + "be99274ea5e340fa834687459e1dff17", + "86f775f2d4bb4e4a8d48f285fb35323d", + "98c95c3269824f668b1d3d09ce7ef199", + "af790f44d1404bf8899ead101fefa3d6", + "a131444a7d114e788fd0f86996194af4", + "f0b6f3bf540a40f2acb0df2c6d339374", + "d5128eff33344b5b875f54c7a1c498bb", + "0df1d14dc6df4730a2ba57f08a8b80af", + "8780a862f0c2476199a3a8b5c71b971a", + "4c32de8d92ea4e35bb8ac06084b34c39", + "a6c70a4e0f8f42dba810c883f14f03e6", + "abc1a53e133a4f588051d7712d5dac9d", + "740a594cffb448ff8497a8a34c583f71", + "aa9e873d7f49438bb2dc353186a0c8aa", + "81043773ce57420cb386e8af1534b5f9", + "21709e8f0f574fc99a4f1f32d9159385", + "3fb2783d1bb240dbbd129de6a1c300af", + "e9dcb0c543c645cdaacd60dc8d87d069", + "539540afcc9048deab1076be09316033", + "997e07f4b5634e2fbd076c63488e1c76", + "0ac3423904f542f5a2fde096044e5b68", + "2bbc4bd37e3e4acc929f71b5fc3e7e60", + "53cd14433b4d4f379aa1faeeb4ca4b76", + "11fd8e99cb4840f88920b0aebf442c81", + "de3130a90a154f198ef002cbecf26e10", + "3cc6993f175846c19644a8a741096f62", + "abda537ca08c4e6cadada8eecfce2ace", + "212761b416df43e288913610face17e3", + "2556e38d9007449b8d383035dc46e87e", + "15f0982ead2443919764a693e17fe072", + "081287870bc04ca7b58e6424f7bc0a82", + "03720bf88eea4b2a92b13f1c43320ae9", + "a462dc2d6efa4f158535adf95303e5fe", + "71018a32d8674f469f7b852dd083c42b", + "297250e5ec6346ef9ee00cc0546c6e25", + "948e4e2bee5f4d58be42d0f8e416c62e", + "746d94847ec143689f47014c89e3869c", + "5435ac08dbe441ea820fdc9326436f70", + "d423f8b82a41427aa975aef62f68636a", + "623a6989431e47f188fc94712341a8e9", + "60328019fe0544a28a0a718d73d59d37", + "4fc4c35954f34cdc88d83c70e0dd3187", + "3a4f2ade8c3a4a7b91ed62050b3be036", + "7894f96491a04ab0a8558589c370cd85", + "b187fabb2ca048cda99e208ccaf3fe24", + "4acfcecf77dd431a91b93c9211c7f5c4", + "52be2121a70048018611012a4e137997", + "151638ee50bc4f7d85ceb3904c1e98d5", + "5a82976b06c345aeadd49368e9250a94", + "f19f4b0b782c46b09622aa924cea7ec3", + "1852849e406c489284db2e762d68a33a", + "85af0da4413141658c571c5bd15c99dd", + "15602ce5be184a1e9baa02eb16b5e386", + "4583dd0ebb6843ad9690074bd251b159", + "1b68f992361145caaab5f5d6f785f150", + "003d330f4b8c41ddbc97a87675c5292f", + "8ee83f1de4fe4bf4bbafe6bd5373dc3e", + "4cfe0c52c09743ce9d20eb6d318b3b52", + "370a97861ee74ffab4966bfdc6fecdea", + "e228d0aac4e342879b92a491eba729ae", + "5a45ba97bf9a4f3bb859d77063ff700f", + "bd6130e6dbc04d6ea40ddaea67ad898a", + "11941a4501294ac597a85e03eb08fc84", + "4df80c10140c4bcb841d48c9419a2cc7", + "0e0966c5944e4213bbcb451fb189befd", + "f88dddebaf764f5e8eb519ab86574a2c", + "6afc0da18b4f487bb9ae58a90e7caeb6", + "414ad83f724b40f2a6b65779570d2aa7", + "61857043913a4bdb8537ea5885c7e454", + "e071f065f1584ebebd96c6deecaaef90", + "2750ba7142cf4e4787443250e2535738", + "c3fe75fadf29466abd37b7848ae33ab7", + "b304fbceee2b46658fd5cc9fd0c45064", + "cba2de472adb4b988ecf4150bb3afbdc", + "4592bf7530bb4f0d8cb0d44d75483440", + "0a97a312abc74f6684404fbb50713b38", + "51f40141fb5a46d39fe45e2263d9cf9c", + "e01324cf79a44111819e42bc50b5852a", + "5b051efd6cce4daa9b4f2f4f0a1b201a", + "d2db7ae0193c4c31a30bd2804c150e98", + "848cacace75f4113bf43d4e8e934d760", + "6c0a165f40c4446792fb2091f5dbd5be", + "ee060dd584664f098c94f32d5dd6dca2", + "4cb5c10b763d40dc9503b4ea73076978", + "630125ced2144f7381c80970516da3b5", + "0f8b3c3d84164704874f191cc6f5a9ea", + "6cb3d726d68a4557b72e691dd296dff9", + "10a963e789084919817d10516c1d1c24", + "83d5184d54204aba800110df00447698", + "e5723ee745224bc3913b12627154a3f0", + "67f703d8309b4c5ab9c72f3b4fc5e447", + "4628238c8ae549409f9cb6f9c7e5b34e", + "64e5be7466904d388f6a6cafa7282b99", + "cf5428a983fc46ff8e246c8eec4443be", + "be832542dc7d446ead31099f75cfca7a", + "af68c02b21f0464181645b63c98e0b60", + "3d55399555594f099a80186d009dd23b", + "3177d7890c1f4d3abbb58dde9115f556", + "4c98fe7693fd4645ae9b240f32160b29", + "b9dc8ee4e1b9433fba7d62b72542b121", + "304d7f0029c7475992ec611b797418f1", + "9d958827a196455c9aec9f8c6c73692a", + "0510d7e4902e41fa8d3d78c9df7b6515", + "610d50ab8b544122a4645ab809d325d9", + "3e7dc4e65cff4301b9976211b0f95c6c", + "533fcabec43648e38340ca69ed0aaaf2", + "dd2220750e0a4f4cbd2c29ad4bbf2afc", + "efc8af0f648a49cf9385fa0e3cbc6566", + "5bccf4ae2c2841fcb4647b5af624416e", + "13811b0173ae4f87872a27423a0d3b63", + "e87e785873544b9faf4c5a2779ccef4d", + "fe3643bc91eb47a6bacdd65badb5f677", + "6477a714c99c493b9c58d4fc24fc9ca5", + "3adafbecf5a847b5b5480c1f695b2513", + "256af76a0aec429a84d21524473b03cf", + "8e5936344a23481eb7b5b59f73f6a64e", + "113c3c0f803848a5b47cdb69a0f6ece7", + "5dabb3ef3f074be6b2218513ef47d345", + "6602e30b5e9343ee8c640eb8ae0c3458", + "9f64e634504e43c7825438e171f54d86", + "c198ac2075d44ea2ad1fb1f0d969ebbd", + "6216e0dcfcee482a883e66ab93b9cc36", + "6266ec2c01c0487ba5301c78a005dc0d", + "bee677c64eaa4e248dfbd6dafda5fb9c", + "1f14c21135214340a6689a67062fea27", + "a89580183c8c470cae94471a590923b0", + "e180fee2e4494eb8aed5fc4de3fd90b4", + "333a283720f74345b5c5ad5f13658bea", + "7e6d0e3bd5cd4deea6f31d55e52c087a", + "5e2a6424b3344e2d9c66a18448344805", + "87bd5aca08ff489c86a828a5b7e67602", + "41e9b90a25f344748622f03f053ff3a2", + "6209ffa9fa524ec48b583d589d806823", + "6a419bc4b6f74d49b1a11fdb85f44414", + "23a94e8cf6734d208c2a1a078a3b5eb8", + "0156b588701d43e5be62e831b54282fc", + "26800e67fc694f298c58b29d4a480166", + "ac3d37697e234bf48f7eaf2529c0aa6f", + "97fc2cd08da147da9b48a43fa3bd935d", + "abe1dcc2c3f14b5798d33b671348ce16", + "bca79ab0dfd24ecc968d6d9bd5275339", + "b9915876e5a44470b8bd15ee27ea65ad", + "f5bd69a46e6042749b105236d4b77dbc", + "619f6ee65b094ebd95fb7c37b770bce3", + "b0eb1c61af8640769b64846fd3584001", + "3d5e5e5c948d4ec1a732cee7019f699a", + "90f014dac48a44988d1793021c311637", + "abb07b5ec2534e769eab8b58ce870fb1", + "3d08bf4f0c5640eaa8035fdc1fa82979", + "acebaf4ec6a041cf8b7e2c5dc32c8b1e", + "5a8c09df40fa4fea93603afd02c7c0df", + "be1a6f4b56594ee88141b51b319acd49", + "032b554f959f4e94864a0b6f69865221", + "1d32040d16e94dedb5c07e82078b5ae7", + "5126eef78d224ce28eac64c759179fdd", + "e70168a29aa941bb9fd59b509f7afe45", + "dbcc2efb67124b3c975745c6c6a0d243", + "b8b009492b3743d5a23520994c28a5e0", + "d20e570e23f2481f91d1b88248e2c64e", + "b9bd3fd4fad44bd489b0d6336ec2fa59", + "8fe70986066f4080b15662855346445d", + "136c2041dabe492ab7a245d1cf3e5511", + "04b54b17daee4c69afa127ef2dd3deaf", + "c4f9f32e99c64e46a1806763610f5353", + "777de14a354c46e994703f905d643ac3", + "3f6b9dbd631f491c99fc14f54985abb2", + "744883da78a145cf94f8dbba8c7da811", + "518c7fd9387749fda6032d28e1d8710d", + "de29cd32eb9c4ede942b58a454a83249", + "ba9e2eee0db644b4a49baf2b28a56194", + "313dcaf00bc84851818c88c2ae1d2b1b", + "2d7c1d2d7c2c4f079f37abb6c02766ff", + "774c1672e5f04e6b86649aad2545ddc4", + "bf63b1f78f604fa7966884cdca812aba", + "6517248280fd48c188b6dd86f81d0051", + "f8d500875e3e4f1aa2db0980c326cfb1", + "aef83806918d4c7a8caad33c6161b325", + "84378fbe420d4ea487741b9d2fdaa8c9", + "56fc03904d144e8195c09fd69f121947", + "971698261a5945349e08c5d144d19244", + "2162deda1f474851b4b251a73e41e7cf", + "8b253bd80d1647b5825b35a459d258a0", + "a2dd4059f94f4ab9977dc1d988e2f615", + "cf82fd8c87e941188776a5216d86fb22", + "95cdd411d4da4aa4bd768b33630d191c", + "b50e180052a14043bbacfe74a65eb56f", + "8fb76ad28bb9452c8d6c0eaf8ceceea8", + "993660a2cf94404b958a7928f222f1a8", + "9ef80566a1064a1d8ba63deca8f5460e", + "c5ea0664d75345beb9654dcd076a8b4d", + "5cfa7b1a625b4459b3980f14f711ad1a", + "6bcad1b5dae94d3b8af2bbedd9c52817", + "faea991e32a24c24aa180e57d8a621aa", + "71f8fda25186451a963b5e8f194960fb", + "e8950a6843cd4877912f82af8f805896", + "8b39ca18dde5474f86b8fdd35bfa70ae", + "da452f58ab0f4b5d8ca2ab78372901c2", + "330fef9278f64aa79739da75c08337e8", + "6dee28c18d2c40e79dd57a207ab879a6", + "ab1479b58041476ca4902a09701eb8e1", + "71b4a67f22aa4074aeb5fbdaf2de6cdc", + "4d8611b8150c4fe29e7ea5f71040f1fd", + "ce4598cb76f14208892472f873e92604", + "281c2cc5498a4fdfa406f056a6d9d5e9", + "143ab32ae3f24bc49caca54028647f79", + "7b6965602a574205912e23754c37b30e", + "d5434c3de5ef4652a794f5659ea7cb37", + "e2357e0ebad6432b890ee402831e89bf", + "c74826ca9cc94c12bd722fb614795d74", + "489715f5e48b40cebb1843646fe21c4c", + "2ff14872c04f4d0aafdd19612b7d9de5", + "5adb7a7887ec4b4da27ad3f69268f089", + "c3859a177749424fbcfe0489ec7c9681", + "42e4e2726cfe4714a814f053100a25d9", + "1018959981044d8ba8b7b4e32ffdd1c8", + "000ddd73c72640a080bf17d77ef60501", + "7145952dddd74f12843e86f6e273e65d", + "feb9032f2e3f491e951460524a2c5969", + "2699c95fc647494f85dde9a7c16e65ce", + "44bb1d4e39a24af6a74c759260053c2b", + "8b6b6595b6e142779d2a5075c070523f", + "59dd60ada48c47d796bdcb7399f8ea5c", + "cadf31da28ab4255bddfe04d955065a9", + "8f472d02cf774478b636ee73e1c0d0af", + "28371424c4e4489fa29e7f9a44feb41c", + "dfe6487b549e4df286d1a9d212e3bd48", + "037f59ce99df44e1bac8ebe105d408ac", + "b063d9e87952499595ac2e4dbde5d326", + "2651707ebed64a2bb5d5e61b4430d1f4", + "4eaf70d83a6c4b0c8b2920fbb736a16d", + "1387a7827c2f4bdcbd8d31318e5d4c0e", + "6992cddc81f24d6894cad5eebe0aaa7e", + "f9bb0527367d40a98e909c0ffdfc7a1f", + "babd42e2869f476884904f1b2eefcaa6", + "f728c64feb19430ca63779a80f3109b4", + "e6914e7911ab4ea2b53523b2ce3e6a36", + "5eefc88ce10245969dd4e443fb257ded", + "7f7430d7ce914efab0c52834c9b75d69", + "d4eda7b7bd094da592791143efc33b1e", + "ec01c7266ea44ff0aaea90de5023b90e", + "b489615fb7d84978a8ea2a43148f3573", + "a285b3a223ce474189e247ea4bcb8a0c", + "760fcb3097774df8aac8de99956cd70f", + "0a87e7cfd39a442385beb382177ca88b", + "4bd3e009e49b4e19a6a335a814e40687", + "2a68a571d61d4b5ab5cf4b17261ddf58", + "e8ccbf86150d4795ae146516cbbdda6c", + "8a2a1eee3d0f4f20a31058b50d37e00e", + "767c9269ee3645dbae7d43f67cf768d5", + "8bc2e00251d047cdb0ca6c5b3f0db576", + "3b5015c9109841b3ac02f711c70ee088", + "66bfd4cb5af747409f35ff62cede57f8", + "76203e624017419db3b068e91dedd270", + "1b5f8580d2f846b0804092a0af1fa002", + "4a830102b38842418fe868bb0a94b1dc", + "c017550f91e94311a63e200f52f79e51", + "c7e542a871e54ef6a9691afd2bb63aab", + "86a1ccfc8349419c9b0d3f8774376ced", + "8ef31846fddf4bdab3ae1044081f87a1", + "8baaeab1c96847dfb9bcf7fbe089ad5f", + "17959dcde6d04f8db0c8f3ac243f2639", + "1ee466b4065c46278c0e527fec82d095", + "6a924ea1045941318c2aaff1f53dc262", + "ef8a6bec1eea4ea99dcda84c79cfd627", + "fed8fcd08221440bbcd8ccfe2db7150c", + "c43400a14c6d4db1a812b999619b4f82", + "240349f2e6284171a3625e4bf1e1f87b", + "1948bdbc5604401e913fb2285463fa58", + "05e52d8bff134185b021d9a7821030a0", + "8439d0de0b074a4f9e897a12b61e07af", + "47604a8fb403480d952cdc12b991bc00", + "24fbcea4ab9e44d19e6b9bc614dcc0ea", + "a359d0e750b84bd788d95561b2cca5d4", + "caa52752a4384db3bcb3e692140fc3ae", + "de0e2b1d5ee04a56be2266baf90ac6d2", + "d59d4ff105c041a1bfd7fadb193c1b2b", + "99a746b5dc30487b9462ac5cae2eaec5", + "5e3b4949a9744a2a8fc1d8297a908288", + "05422e3fb8d141f09aa68087c55b046d", + "8958adb7191e49bfb7f967d5ddedd176", + "f6c43e7af30b405ba29c4f9865ede2be", + "2be2861b01b54eea9ffb777a6e0e7430", + "5c9df771fb2540e08db4ef073af3a62e", + "43b3d8852fac4dadbae61b99e63b76ee", + "3afc0347eaa2486a9a41cfe37f515872", + "11ba032dabf245859715df73bcf28e41", + "26e40f3314e5423a874ae9e97b347778", + "6e27c669db614ff293e3175d10e36b49", + "34f60884eecc464cbb6a0da9b2eaaa6c", + "dc6da509c16b4758a728b05dddeb5e40", + "49648a17a3cc4330943e7703ce499d90", + "2a900385fe41441e90eed8503a7038d7", + "8b33309f14414234bde5c59c91a7552f", + "72b4c674089d4ba0a288c2675bce3e80", + "2624d94257374d7190c0a079f5891f5f", + "ff33697ae23b4848bc1827ff395a8c21", + "d6878cc0294f4e20bba6be832cb7460d", + "d389b14fc1c849db929621ec6629f973", + "5d8d40bb35754b6e88e561b41647736f", + "982035d1f728450588a586f6ce2ac9b4", + "7e8f281314c64f27abb88704991397e7", + "54689096175c4c488329065acbae7c0c", + "37c2d65e4beb4edbb2247a82df6d3aa3", + "bfc4e057d0ec46bbb0f0c61a41bfaaf4", + "be9d698ec0674d0d9ab869e8d60a47cc", + "aada838c00aa43fdadab607308564a6e", + "aa3a0af825da4f0c8c27ed64ba18f6bf", + "f4e68d125d3149708b2ff1218fc5fb5f", + "c75ddf370ed94ba2983a7c467e73d67d", + "66fd607e39524a4e80bcc571da766073", + "604b455c4a02479fb84a1d5ce7db2e34", + "df201f282da0465d81c739004e4fe50e", + "1ebcdcd3fef5439d81ec1ff1209b49df", + "630002fa5df84cc9a3c243ca7ddac942", + "c91f05839ca64ca698934839ed25a687", + "6594fc508a334f82978d4e20775fd997", + "3822439f820b4f2aae1ac40b2713790e", + "6322f4ad86b2420e881037e39eaa6b66", + "1c5724e0ad4749c1a475e0ec5ceb2283", + "ba7eab62371a4242b216a1115767a8fd", + "9e896ef65ab848c29b8a03019b60f2ab", + "923ff5bc0fcd4333a21c12df490b30fb", + "599f5d19c49846509e541e7fb6cd963e", + "229e7a3672844eb7b91ac921d015db3d", + "21a37596715e4ea69034a33b0c97449e", + "26a4b2dc2feb434c8c885ab9f10fecda", + "c8076f1eb9824b7390f240c198dc73da", + "2b04bba4853a406491c506cf406f1f26", + "36939ecb36764685b74892049a0867d4", + "8e714ea18bd14d73934fcddf39d40b07", + "4affa335061646bb9128319706c73f8d", + "5c651be0246e42da9709ae2cc6891347", + "600915bfb5f7469f8e150d0ef94ac068", + "29e88c7c398b466fb5d124807d0edfb4", + "7356c3da4ffd49c0a50d2100205b9042", + "17711c924fdc4a34bbc4f8418553f4e3", + "48009fe55d0b45dabb350cdadf46ed55", + "9ad8dc3936f947179ae0e5e7b7f5c074", + "9f6fd69384df46c6bfdbc30ed63405f0", + "7b3e87cc613d40e48dafe8d0e48108cf", + "7ca00ae3b9314d7ab97cb78022b639d7", + "10a0c4ae99664ce69090751061c3f115", + "bbd12018b1c8444c9b23a71d0becf6b1", + "2a7d961ced3c4cf197e7da9f61794a33", + "d99b84ceaabc49328ac6b4fdbaa6a771", + "a7c2c4542c2a40ff8d15d0b16b1284dd", + "945bd6119be846e58cd2f87dc95909a3", + "3171acfd70a84575ae8df8453bb42c84", + "cd2e9c89b7d6438899c56ff66f143849", + "f664d6b6e13f49f0a2d2ca64c18dfa39", + "f6639a7bb0fa4e368f7f39eadedacbda", + "a2273de7420f405a8a30794b536ed529", + "887e614c0f564b239a5c14fbb2afc1f7", + "273530e08a194f5c8287a4245dad17c0", + "97313105457546d4a613e09955a26436", + "c05bca9bbf904d379d3ec169f74318e0", + "56761df4cf9541e28195dab824648698", + "b2f20ab6b75945719e82f84c2a53f406", + "d65100ae45fa4882ba85719f2410dddd", + "82f4408d8fa843e4bf2645b62e71e158", + "54b3d3ce8b9d450ab505feb7cfa06d74", + "486459edcd2e44f1ade79a97eb2710ef", + "3088febaabb143ab9e5d45aa796bffd0", + "3bc6deabe4a04e2b8d104797daf100b9", + "f8dad2add695474aaad6e495fac3385d", + "13671cd5de774311aa1441df822fc20a", + "73fccb774bf5498d9b788d6657a811b9", + "42bf1386036d42069767a2ed76938e17", + "5e7b67ad5ecc44ee9e976279d97bf970", + "53b7c6ead1844a66a84a5ddd172d9c13", + "2eea3132e1f145c4866b4285d4301578", + "20fd885a761341e39430ab458f91ad76", + "63d0bd0bea4b499fbd9fa0ae2540d16e", + "0950b227013d45f597e9915e3f0026a3", + "1c07174a89bb4d228f123883e599ab82", + "87b0d38c99ca4e049f200e1414f4718b", + "7f35b1309b5a429ca6326d7085a7c1c3", + "6834979ba6e04468b592280fd82402c4", + "be04c6db8e6c4ebc90f652902630889d", + "4ff1fd61d104494ba1d799f92cf1f822", + "d2b17e5d7e5f4de097b78bda09c2a0ba", + "44f6d2ea4dee4d59b7670c4911b470de", + "0c37a9a6dc3747d8a86b93b271dfc8ca", + "5c5b9474d4c9457ca2c9db3ec451fe45", + "81c9ab3973344ed48e2403f9390f696a", + "8d4abb4186454071a6df45e1bf337cbd", + "df61e006299d4177a1a53abe0021d07c", + "bf5eaeddebbe4160bf1b9c700e950524", + "e249e9e30337416ebf243f1035b3ab2a", + "0ad40f5b234b4b5f81d57c9fc719f71a", + "1a0b331aaa9046a7a0f59ed7bfaf8ade", + "1119caaecf5d4367a8093653be1f1552", + "b32a5981d02f483e887d702d1b52cac7", + "bb20572475444ac79fbdd1783e8268a4", + "6bf5d7bfc51d480a95ca5ce4341e6ea7", + "71af08e8a28b4d009c2139670579b1ce", + "1b95817bafb74d6ba11edbf51bca5529", + "8cbc27bf8ab8484599be9e8d455194c3", + "283239cd77cb403493a6b7bd9466bd21", + "448ac1240bcb4aacb67039a6e7f083dd", + "529bafcf9444404ea535915c61079c71", + "10430d5e7744471aa4f8c3d375204dfc", + "867f7b186073408c82b2e4aa1e56128e", + "f5af86107f914807810ed1f616a0f0fd", + "26ee2f77343a49a89c48e825734a83a4", + "52c89d48222947fbb194caa8bed4b06e", + "290725147caa45ee9de18ec487593a90", + "c43d6ccd06f648a1973c73526e41126f", + "8aa4da128bd9417c8ca7d5da784237be", + "19f86551600e405f9ba92b945866aa91", + "dcac3399bfcb453390fe33e46e7bd265", + "390b8daf1d4b4f3cac63f7b9cddedf46", + "df5d5e7a6e47467b9f249a5ebc518265", + "46e55eac088e4e588305c5efb8541376", + "8ce6c4aaf0154298b3fd95272fcb695e", + "eb7b799e95ce4b7e81f02d9fafd8abd4", + "29004eaf3f6c49459b5b7e008680df54", + "ef9e41b5336649dc827d35b05813bb81", + "e61ee0e755934ff3ba386b7ad3fd2153", + "21496942c1e047d78f2bab8b4b58ea29", + "6a659c4c62a6429fb35038aef7312d0d", + "028b48b8e5354d1bb33208a0bbeeb4d5", + "0baae1ba475843feb7524ff523baceb7", + "a8d3e41804244168937f1dbbaba3b84b", + "0b87da4ca7d04cf181c25b90293bfdbf", + "fc6c05ad531a4fe49b857e582627be0a", + "6036b2d06c7e4476a5d855c3c7f39ed0", + "90bb477ec4994d71a25cbabf5a642c09", + "73f222fb64c149128f3066211a92f2b4", + "d432794abb0a445db42edb156f928562", + "3b9259b5795c4acda9eb0eadcd463881", + "be30a55331ad49229d2e3d9deb579981", + "3c4c5a6de7084c0fb6301ab23b8efe0c", + "f3f7cb27b9804546bf5ec879535f4b8f", + "10395e6611b74cba8ce0906eaa6f65c6", + "84ea0080b8734cc08e203a99356893d2", + "1acc96a87c6646c3b0af2c85f34460fa", + "bea05180abb74673b7ffec1da75399f5", + "10849a345dda40209699c6b64744a9f6", + "94896cff0a6e4e85adb9a9b879d057f4", + "b83787dbadf54af9918433736e2942c5", + "082b47fe4d384d6e8e7f9dccbd3ad88f", + "984a9d05ad4a454dab9c3e2b02d380c4", + "5b1e41ddbb334e18b9c0c96c5cc18110", + "b1fbc43bfb884fc889d6c682780166f1", + "d06a5608d7e147029380f027feffd01c", + "12dba7a889fb497ab1735719f48593db", + "0e6c4748ace34707881d48fb97fa4e39", + "8ffd0ab55bd042f09ec9570b282e24fa", + "073343d3ad41492990e78181706f1c2d", + "f1f4bc023ee346759a75100fdf0696ef", + "b8b502dd2e834e11b1d380ec5d887c77", + "e8284078885f48b9b81dfe67d8b47e0b", + "3f1e11ee86d0424ab9c1fbee84b66ff7", + "d5c4ffe1a8234a5ea04c5e41c1e11180", + "9b64da2c845840f387d3275c11879a06", + "df8520e96a8c488fa6c56e458447b35e", + "54cd958df624460cb12ef946cab223b9", + "f429c4923ba14e19ae118bce0b95108e", + "c834596814e842369bfac5701bc48773", + "28a7e3caba22465caf9bdffc520240ba", + "40f6939a7ba44992877652eda54f4d42", + "ea632105ec70407ab3e4b0beec53a8b1", + "edd799a90da048a9bd8a46ed11647cc1", + "9d35a2f6545548b894850fa5dba93068", + "3c0d4b5f5f8d4a8dbae04419176ca5cd", + "87626c8cdedc4ec6bde7a790f4292b84", + "8a95bbfca2d64f7cbc748c6e3a6f7ffb", + "4c47860668384ba49e01fc7f2572fa04", + "6d90ce9c453d40debad26d111588d56e", + "bc3d170ee100465ea4a9a18292d1845f", + "991f4769953c47d1927efaec1ffb0fb3", + "5ddf79a346434cf9806e60064f3b87a3", + "0597f410c49346b09f180a28368144e7", + "4b5ea1a6be61411899bd4e06aa32e63f", + "9c7bd4b5f04540bf909ac6760fc82596", + "f488d75c2fb1400f8adf46ad037a16a4", + "150b507627f5469989e3e5bdd76c0898", + "58a846398cdf4b7f861b7ed4e55ec75d", + "b7908be4a20a48cf85a35e5915cff6b0", + "1ac8652f6cdb4f66b0fedbb7a8a0c9bf", + "a013889774064dce822e277f725b3567", + "34fe91939013441796fa4e000e422a8d", + "3aecd15d44d64644bfdbb14cc692de2e", + "2d82f410b1d84d24af31d5d1bb4c4abd", + "e55ca6414374413fbceb6c861d446a14", + "a2049889c73b42969d6ad98bb8c7b6f6", + "3f3b856fe6c44f4bb2c6a3b35011ce70", + "7975a43ded2e435080d52f9332faae17", + "402e91b8226745d4912f2d7c24405272", + "f46f808e641d4f5d9b0aea788ee2fe14", + "38b62372f2544f71840ee45346d12b33", + "28834ce3a9b84920a0ebccc76a84da65", + "70fcc52f62b7461197558753ca9eb4e3", + "0f1c59d7cb62400ba726ba651ce4f46f", + "984d20f9067b468bbaba09d2afb61806", + "630b39fbabc14290b4f924c6e4946ac7", + "9b2709d1d69a412faca54a29a3169912", + "efdcd010e89c464ea07c4e33ce196bbb", + "4636b450f3604784a22637d58f391b9b", + "336a916933304164bdb8680dbb0440dc", + "a8da40df709846fbabe3370b80f66f66", + "baa06381b4094acba963821fec39542f", + "324b4f6c8cb744a48788265c4f62445c", + "cccec470f59446c0890fac7b941bd559", + "74881f36bd114df0ad67596b540e2228", + "96b7ead791c74e859f2443f1681ad82f", + "1d8af0d898034ae9b7fcdddfc27a2b3d", + "0975e7951e03456490f84a31ed5a70d9", + "663179fdd41b4c2cbd299bbf1de69919", + "d38eadd842ea404b8116a09a658430e1", + "c6ea6b4596b24da1a902fd7c2717ca40", + "a0c93e239fac45c3aeb3982c5a8ec136", + "1c15180e45ce48ee9668779bf11a9f2b", + "18d49c0a5d614408850be4114a65a966", + "a606cf2910f1431abcef70eff201b1b5", + "af3579eeaa7546f588efa5d7c44235e0", + "ebf49890a3d749c5b150be525a95ff79", + "b34735dd6f8743c783342635fabbce1d", + "656e8f03ca7444fab150b69a7d3ad611", + "593effd3a8e2448bab6ef5fc5173d71d", + "40c2864d30aa49a78363dffc442d3f31", + "25c22ecae7b34895bd48638336079367", + "f1d18891dfd84ebf89b9f2ec6d10d4c6", + "877f22d80b0f497e9955e85aa7b44a98", + "97ee09600e51442195a6f49bf3ce3225", + "9214510172d349bbac239ba9ec9f8e07", + "8d3d55367834448ebcd4dbed785da6f8", + "e94e63a22a5a4bd384b65f058ec29249", + "c48d9a97675348a0b0d0c2f7488fbbb7", + "8c7a8a217e96470099f1b355d891e8b9", + "3a9bef50652345539c435349b396201b", + "9ec48f2018284d24883d0aefd5a9a40f", + "9b5afe08dd034a399930048d346424b4", + "ffaee0c9244d4e118ee42b905ad4ed15", + "f7874fc95c0e4bdd8af96521fd0d338f", + "85a2e3d32e5d4bb291a8c38a95eadfc2", + "8935d87e77984dad91a46711c6c21ea2", + "e9589806ecc145c58b91ca19f46cc7a3", + "a297b302abdb4aecb6b031bb80a851dd", + "7c23ebdf26c84f9db404a97391b2b788", + "6563af144a594425829b2fd0425e9b46", + "4a359b8cef3143a4b6bc68071be32cad", + "7f4417e5e1db4e0c82769f877b0ddc81", + "6bf8f96fa0b54c8a913879b331ebe945", + "0952bc8c87f443f5b5365acab618d053", + "dbf5da631e044a20976c8f53c247f719", + "d1e847bc4f3d4f88bd478118147e2cd4", + "a921e11551f04301a1a08618710b28fd", + "4b9edcb3c2274cf491d9780fa7b6c592", + "287c0f7a6c2642d79dde22e675553434", + "bab44610fa8c4784930e47b0ce4e31dd", + "ac7a40f37b5d4cbc9064f0e1e25ba841", + "3d94e32db66b431aa7d7e6d20437927b", + "046b5572f1714992b3a6195e659abd3e", + "2bfade71b79b42cb864ea5032fc67eb6", + "1a6f4ce7b0944653bddf3f19ea839389", + "fa53fa118dbd406b89b898aec16df7b0", + "d79b6eb090e9451dbbbcdf6a1e5681a9", + "43deee2f116949888b003c1a404b2881", + "763caa3afa894d1ea049d3744e8fb063", + "4feb8f8a563e435a99625c19d348e457", + "9104c95570734b2dae1f49b18faa4867", + "74e52e5482c9473dbbed970cfa236a60", + "ddaacfcbe39849a283e90877eeb641ba", + "c981fccf1e7e49aa945bae1520c6edd6", + "2cac0aaa5d78400390ff3be68ac9c721", + "8d4f104f571b4cc284ad08a64bae6717", + "95daab324ffe4cdd87b64586414cec90", + "5951c4b02b0b41788620180d12fd1c46", + "6d2d3c232fb84a8fafb784e194984c67", + "72c58cd0741d47839e0deffde1102b51", + "3fbecb93c3894cacab5be334f9b5bf06", + "052874dddb6348139c54c7dd5d47a9fe", + "059e5e0ea0a44ca18e4092b326410f29", + "c725c0392a9d4c83af689eb9ca8e1998", + "8f5510d2ff7649a8b5aa076f95fb98ae", + "0e888430d0c24a1298336191239b87d9", + "9c96af28794c481e8d8dd1371de222c1", + "9f459da080f14532826b50ebc19b88b2", + "56a1ca3698c3409aa1a566afd19a5cbf", + "e916caef66cd409db2d50b6aed4312cb", + "4d1d7b106d8b4c43a143873166a7853d", + "c714696e1eb448f4a6dfb7bcd598449a", + "9995f8f4332a461d85f1674757178a0c", + "cb2f27999742496999a89538a2a0bd06", + "600797b828744348a1ec700f2573d298", + "d7f71a5cd0b14a61959e80a976f0e54a", + "77bb76889e444910b7102e53fe528d74", + "e277a24efb5f431e970b1e36c4e1d64f", + "8952c389c72e413d9b9498299c3ce6fc", + "cd9e07ff65ba4aaf92d8c36b66895919", + "de56a1c232c94c46b3f9d350cc35424b", + "e6d079da14c94053b07d6688840d798f", + "3bb0467510e247f19dee0fc99ff0e461", + "d8456d7fbb2846b095dae54544a498c6", + "d66a3360ac484afaa65cc591a1d237f7", + "df4f2d7a9b0b470ea2ea7017b1a575c8", + "56fff845d88548d7b2467bae750ecf21", + "98e3ea844adf4cc0810cc5e5676a0649", + "0e504b61fbee4df9abbe2eb28bb529eb", + "d51b7838ffa74399bb30860493535dcc", + "22482d92390d420f930c6e4fd3c37293", + "670db8d03b994b26aeb28c2737add2f0", + "2837e955cf31443fa1b5b8fc72dccab5", + "d563a32d42b44d6c91632368986754e9", + "c75661fe91614c2cafba411c3934ec1e", + "633b24e380f04397a0b0c39ce534e37d", + "90c5df1d7aa249279f80d4ff86859686", + "138df1fceb6340779be9f3c5bb76291f", + "fa6c3580347649f592ce09c6e8de2681", + "0be0eb2c7e9a42668f19d42aac8884cf", + "ca05105903184af1a5d7acca197086b8", + "52ab3db977f14bb488e05eb3e14f96b5", + "d3e0dffbc82c49b9a57a6af90fa8638c", + "af24aa466ebb43a39c1248a6b74c0111", + "92b91b71a5944c6cae6d929dd692337f", + "b5f375d0088a4623a489ea4176f17c57", + "689b1863849b4b9aa4bf6e1ed1dc3d02", + "4576c980433b431b9c29426ec90c9801", + "60327b28bb5b4c06a6e386c9ef40267e", + "2e0926bebbc048b390b6cd4e36282fd3", + "5e272c5e159c4d6fb9ee9b8a46311caa", + "fa244b718f55490a82239d4396bbaf75", + "6986493356184956a2208950ffb2766a", + "39f82b27a4b04067af4e8ac95f8ed993", + "604aad8383784eeabedd82367e027ef9", + "c28dd31c5c5b4260b128225ac36d4a53", + "3b3c4d22f0964c899247d27887935bd6", + "218b776db5bb4215aa9890c410b23fec", + "42d5782cf13d46bfbebfafdc995ece08", + "107736bd600b40b4900489742c371bb7", + "3526350eef79468fa910998b909735cd", + "5bab3272da394204b18fb8ba90ad0e57", + "fd7b47fb760548e7825f94550cccc2d4", + "fd4349ed5ad34c9ab07aff3f1cb6d1a5", + "1fb4dca389e64709b827a7a44c456f71", + "380a5d2dc6b8453ba90050db3d04a49e", + "5102dead7a9f4108a0e0ab5d3895174c", + "76aa018698ab4789ae0ccfdcdfb552d6", + "ff0583be1a154593b46d4756eecd52ff", + "9ecb1f7364b04104b45f2bb8d315481c", + "7f664f299e154ed7a96d075c7b10c28e", + "cf7b517505804869a335899e4e90097e", + "95a10c5c569b49feb15b4e72a1fbd9b8", + "e2fd7c69f2724a54b301cccf034d119d", + "1545d97bd8fd4abaaf6996bcad22bb28", + "218e7c7cb55b4b83b8da8410b782b83a", + "db007fd697914163b36f553cc62b6aad", + "4b77319e5be44455931bb6568ac4c430", + "c54ad8422ae94a46a33abe567b93ef23", + "7f707108eaa74a359305e9006d94aa9d", + "7adf7a3e1f6149b29cd4462679bf4e55", + "3b5b2b4693bf4eeda3522637565a4cbc", + "cfc6d3717b584d6aa2aed5ac3c64d7b7", + "adfcd3f90c0f47eea724f3fb0cb4945e", + "77573bd8b27b4a6590a7207938ec1329", + "43b01c6741c6448cb3f6a4cbd3737e28", + "25149673ddbd4242911ce49dbd9ff825", + "5fb3c04660404711aea5f8a70d9f8b1f", + "f448cae3177f4a7d8ddd42c18e879137", + "3443b75610f24bba80d711205df06688", + "dc871bb1190c4585a32db3054fcb197c", + "6800242f33a344db9acf025d94626871", + "10712ed0462d47c28145cfbd63976f2a", + "dbc141c2cf7d414f969d5533a5a7bf15", + "8f7eb1b0d8514315acd53dcec9ca5a40", + "928b9c3efc6f45dea754194050b21523", + "8c41ca2ae5ce4e8b8c7147123efed9a5", + "36e184e3561146148554a921509e4bda", + "a16270478d3a483a9495da1ba33deb78", + "0ae8ad9cad654bcea25c1dc3a8520c3c", + "db8c2ef511084de796f27df6c4338bfc", + "e5463b3682b9420ea7de57aa1b8efb52", + "9669abe7939a4b33ae20d2139980e848", + "3aac18862a2941dfaf3854099131550e", + "cc3b5a43f8b64328bf29a70f96d1e88d", + "610bba0b7ee64c019167df4f2211c3ba", + "f783d06954ce4cfba7bfb23fd10d731f", + "4181895453614aeeb801c89aa0709658", + "d5722b7efad240afa8a89cb20912b017", + "871f9c60f68a472885834d26ae067aec", + "f2d401d0e82349f2a34cece1d0fc6afd", + "4eb2dfedd0d345078ccdc9634c4b9765", + "b5433181172b4a8297651eadb1300b2a", + "3b5f7d771ce84178b96aee2e38ecad1b", + "8a14c8478a234bf9bdff5946b528750d", + "7060de60382e441188e3015d877b4cef", + "c4f07837746540d0915265e878ce7325", + "2467364824b94f1487a73a160b64bd5a", + "0b6aacbcf4ed4b21b6d3b3ab1ef86512", + "a4063adaf42d49a6b6b0daffdb55bd1b", + "f36fa18f77484f0bb93d1d71d90f0d99", + "910863e6f2084df2b95d3da395809ba4", + "ba25157fe251485d9226ff220694a7e1", + "d34e2804a3e24ad9bbade5ccb78dcf28", + "4c6210ac897443779f25393c732ae6c4", + "5b10034c2d764d668fe84d908ad1fe9c", + "f07fd619ec894f90b2728db21c6bad25", + "9f98d0edd31442efa401259b1831bd73", + "270ebb5e88a2443b9036741a0b6ceee9", + "80078307785946a4ab1442d7f31e1ceb", + "bab025d8b5ac480f865c176bb59afe7c", + "f68e3a2d3ff24259bfc6999ed2813a39", + "0a8c114d05104885bea01dad64f13301", + "3dbbaf3157e04b7686746f85f44a79f7", + "371dc2da735246e19caec760f9898885", + "c6c75bb1f72c46d09b575e405ae5a928", + "c7ca375d02e04eb3b7371bde0c4882c1", + "8b6b0b9a75fc4ea884571abb70603de7", + "4b49dd379e744024bb746a9a28584d9c", + "fb097e3d27bc47f996687e81330deb62", + "77638d2926e14e008f4573e55d199cf0", + "a7320d1e67994690b42a566e226d64b4", + "53c619d1ec9e42e7808bf3137ccb20ba", + "7a583a65366249c4880eb06396d62aaa", + "0c62c62722aa4573919e447a4e2f882b", + "05b091520e464f88b355b794dc51e7de", + "ce3d573703e94b1cb5987d3b86a800f0", + "3c4f4d9b490d4430ae329277c9a824a7", + "1a18c7c217e94655bf4bea4a9f0f311e", + "983a02d12ed345fbb71d0e9e136a772c", + "c1b57f3b4b214c8d823289069944b145", + "d4aa3513f2a64a84b24789ce5667ff36", + "6d04960e0ae642e38960fbff380d026c", + "e70935d945ec4142aed13424911611ce", + "c34de2aac9894e50b26d9ab361e645be", + "2497c59831ce47b99d344602a30eb6e2", + "16a8bebdeb7d46f2a971723af33a503a", + "fa3352109cd9472580b64af3b94ead76", + "56c6c6294d1a4e2f9c9155c284456814", + "6636745f59844e9485cd2592a1230a8e", + "031416df4b2e431493e7da0108e7c82f", + "dcd71e189a8b4e88a1268b372630e9f7", + "dcc5a8c1e6e3418b827ec703ae6604cf", + "75bdbe315f31486ca5328e494903bf60", + "ac46bbd7477d4e7da0c635bdf8364015", + "a8b9aae040b145cabb680daa5991be02", + "a7c2a725d7af4f72b0a5ac850d311558", + "47d90d0ac9e340f5b239c536263b3670", + "3c6461c3ab75439aa98721a2638e41b5", + "fe4973362c234209b69b19872d1f0088", + "c6692c15606641949e248285cf86c324", + "99efc103b7954432915471e38d2afd6d", + "71d200c8650b42f6b60db279abfa251c", + "459b0406436a45d8b2df4f6b2b8aff79", + "ec5f577564914615a460bf5dd09cd364", + "b242c4444710453799345e60654545a3", + "cb9c16185e6b4aeeb06e29b1a4ad3b8f", + "de0eac2d731b495bb410045f080e041a", + "cae095198ebf4b3f8fa72a62ce7921d8", + "06fc1287114c413793bf7f682fde94d6", + "df10c9942d5f4a1a907b507841d22da1", + "7c8961f537374ff3a9492fdf8bacacd3", + "95cf8e6ecea541e2bb570f94ce2a98b4", + "0e343df2f5fa4b54bd6a15656f7bb0db", + "02ed346f54f3439ba59754790c4f8686", + "6e645c114b47428682dc23ad557e7d71", + "f5625328650640b9a59d7fcdbfde57d1", + "74ab3941083b4c52ad402dfb46ab8a51", + "eabfa507e8ff4287bf99c9a28f3151bc", + "5ea15d7e8cda49c88936c7b2c744f62a", + "5fa9f2d82608429c91df18b5a093153f", + "d542943879d742ba884dd1a567406cef", + "31f79ad33d4c4e17ae0991e66877ab5f", + "4da3cebba1564bb0b1537b3c49e28068", + "92b9f108970a4fccb2ac469e8fb3d158", + "b3f12a115dbd4f8088cc331bcc8ef95b", + "17abb4ad030a4b4cbd75000806a24477", + "6dfb4f22a7254896af7c6dc09cbecf51", + "ac9884e6d6084907b4354c33eed1561d", + "18f97f0d55114678bc172a826eaff078", + "21b9e5d2c37f4a4babbeaf968140422d", + "8d343342a2e743f5af38f8defb49c1a7", + "14a1b589d4454c32a553965bedda17c5", + "78bcf01dd53b4b498e39b303ecd4b035", + "3ea450c4db28413a8d319c54c3bcd4dc", + "c5a635808b7c496b94fd0d1fe9a10188", + "015425e0f9d74f47b640aaf80dc3ac56", + "cce8a0f4f2f84ca9827e6b131da339b6", + "c6b44ef3857d4e39961e6e85aa6545f9" + ] + }, + "id": "2acnD1HPz3l5", + "outputId": "10e68e14-8107-4217-b381-088ef79b7e6d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO] Variables: 54 | Years: 26 | Months: 12\n", + "[INFO] Parallel by VARIABLE with max_workers = 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:19:59,170 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-28 10:19:59,173 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "2025-09-28 10:19:59,179 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-28 10:19:59,180 INFO [2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-28 10:19:59,181 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2025-09-03T00:00:00] To improve our C3S service, we need to hear from you! Please complete this very short [survey](https://confluence.ecmwf.int/x/E7uBEQ/). Thank you.\n", + "2025-09-28 10:19:59,183 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n", + "INFO:ecmwf.datastores.legacy_client:[2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO][2m_dewpoint_temperature] Downloading 1997-01 -> era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-01.grib.zip\n", + "[INFO][skin_temperature] Downloading 1997-01 -> era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-01.grib.zip\n", + "[INFO][2m_temperature] Downloading 1997-01 -> era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:19:59,958 INFO Request ID is 8db5270e-a33c-4865-a78a-cfc25716126a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 8db5270e-a33c-4865-a78a-cfc25716126a\n", + "2025-09-28 10:20:00,204 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:20:00,400 INFO Request ID is b852b5f9-0de7-4446-a572-c269f2c9c3de\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is b852b5f9-0de7-4446-a572-c269f2c9c3de\n", + "2025-09-28 10:20:00,569 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:20:00,575 INFO Request ID is f5c9a6b0-08e8-4fd4-ba80-bf6b672a1f67\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is f5c9a6b0-08e8-4fd4-ba80-bf6b672a1f67\n", + "2025-09-28 10:20:00,752 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:24:20,820 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-28 10:24:21,208 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-28 10:24:21,735 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "413db91e8fe94901a68f5e6346cb0082", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "76d9dacc7921e0bd06d9383480d75e62.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-02.grib.zip\n", + "[INFO][skin_temperature] Downloading 1997-02 -> era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:24:24,358 INFO Request ID is 941fa3e5-ff31-4521-9efc-b7a02658ce54\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 941fa3e5-ff31-4521-9efc-b7a02658ce54\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO][2m_dewpoint_temperature] Downloading 1997-02 -> era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:24:24,591 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:24:25,030 INFO Request ID is 056d112a-aad5-4d9a-86fd-1058aea98a8f\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 056d112a-aad5-4d9a-86fd-1058aea98a8f\n", + "2025-09-28 10:24:25,214 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:24:25,326 INFO Request ID is 025a7ae1-a29a-4344-965e-61c7770ff141\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 025a7ae1-a29a-4344-965e-61c7770ff141\n", + "2025-09-28 10:24:25,491 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:25:41,081 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-28 10:25:41,774 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c4746e30bb714d88aed6b768867cbe3a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "fb9b879b1f3f45efa9b7f1c26688ce49.zip: 0%| | 0.00/4.04M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:25:45,133 INFO Request ID is e19476b9-2c48-4ce5-8142-6a4c483d7ef7\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is e19476b9-2c48-4ce5-8142-6a4c483d7ef7\n", + "2025-09-28 10:25:45,294 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:28:45,891 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-28 10:28:45,993 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9e70231e57244ae48bd8e8db6d97b20e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "69920cc1164c1f8447b47a015c7401ec.zip: 0%| | 0.00/4.05M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-03.grib.zip\n", + "[INFO][2m_dewpoint_temperature] Downloading 1997-03 -> era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:28:49,444 INFO Request ID is 82eac26f-5084-4865-b553-2a22f8893740\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 82eac26f-5084-4865-b553-2a22f8893740\n", + "2025-09-28 10:28:49,607 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:28:50,007 INFO Request ID is 593b0622-6950-4d4d-9204-7fb2b07bd10a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 593b0622-6950-4d4d-9204-7fb2b07bd10a\n", + "2025-09-28 10:28:50,177 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:30:05,877 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 10:31:42,894 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 10:32:06,508 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "170071f8ecb146ecadbbffb4694dbc5d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "a18aaf2379ab53da50d98ba07d3b29eb.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:32:10,154 INFO Request ID is 38152af0-eb7f-4225-9228-987ec7a43d16\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 38152af0-eb7f-4225-9228-987ec7a43d16\n", + "2025-09-28 10:32:10,343 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:33:10,027 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-28 10:33:10,473 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bed07f445e9f4cacbbfa7a635d47d9bc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "5d05445e9231cc679fb613b416ab34ea.zip: 0%| | 0.00/4.49M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-04.grib.zip\n", + "[INFO][2m_dewpoint_temperature] Downloading 1997-04 -> era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:33:13,627 INFO Request ID is 49def0eb-3f46-4f18-b7d9-5397bc6f1dc3\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 49def0eb-3f46-4f18-b7d9-5397bc6f1dc3\n", + "2025-09-28 10:33:13,959 INFO Request ID is 3595da89-f1a6-4336-8f1a-55fcec27bb4a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3595da89-f1a6-4336-8f1a-55fcec27bb4a\n", + "2025-09-28 10:33:14,104 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:33:14,189 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:38:31,777 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 10:39:35,298 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 10:40:32,429 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a467494c4ba44c5aa77be48d58e581bf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "c9c9098b381bab73c81c407a2cc91c56.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:40:36,361 INFO Request ID is 03a872c1-3531-4ec3-bb77-b03cd63f79e2\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 03a872c1-3531-4ec3-bb77-b03cd63f79e2\n", + "2025-09-28 10:40:36,576 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:41:36,078 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-28 10:41:36,220 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d924601d988443d59c07a6e039454f10", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "da0b793ffe7d0670c76bf39f75c3c163.zip: 0%| | 0.00/4.36M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-05.grib.zip\n", + "[INFO][2m_dewpoint_temperature] Downloading 1997-05 -> era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:41:39,446 INFO Request ID is e84e7551-b4fd-4e43-8375-d0724acdb18e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is e84e7551-b4fd-4e43-8375-d0724acdb18e\n", + "2025-09-28 10:41:39,617 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:41:39,936 INFO Request ID is a8f99a1e-ff24-42bf-88f7-76c153f0194d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a8f99a1e-ff24-42bf-88f7-76c153f0194d\n", + "2025-09-28 10:41:40,131 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:44:58,189 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 10:46:00,521 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 10:46:58,823 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "df0e5fd0e3754bbabb1fe694b4a03e5c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "fea524e6521ccd8144782e8dcc34147e.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:47:02,461 INFO Request ID is c421a1cb-6d8e-4659-8731-1fe3d2049212\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c421a1cb-6d8e-4659-8731-1fe3d2049212\n", + "2025-09-28 10:47:02,648 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:48:01,155 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8a1028c2e99e48989cde9c95df1f3e91", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "61e4077fca4d0666ec01de07475756d5.zip: 0%| | 0.00/4.49M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-06.grib.zip\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a3cd78109ad14bb783b4845e5b88cf26", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "3de6f0cfe49d98bafcb92237ff88652c.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:48:06,174 INFO Request ID is b9cff508-fcaa-4cd9-8202-28a2306ce8d0\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is b9cff508-fcaa-4cd9-8202-28a2306ce8d0\n", + "2025-09-28 10:48:06,355 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:51:23,413 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 10:55:24,840 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "190f96f7a3874d51911e5a7d988f8596", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "6890e21659bfc564b34c4bf557c199eb.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:55:28,662 INFO Request ID is a70adbc1-0d5b-4428-9c8f-bcbe4e18aca1\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a70adbc1-0d5b-4428-9c8f-bcbe4e18aca1\n", + "2025-09-28 10:55:28,860 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:56:26,437 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 10:58:26,899 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "46a034c1ad1140c398056d5bd7f4d153", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "15c71ca2849c0ffc0df6f2fc88b667ad.zip: 0%| | 0.00/4.35M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-07.grib.zip\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "df461d8fee844e92932a35e9d564711e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "6f41f9f0d7dbe9d37d8b5036664a989f.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 10:58:32,433 INFO Request ID is 163be7a2-9d09-417a-93b5-9269f0c4295c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 163be7a2-9d09-417a-93b5-9269f0c4295c\n", + "2025-09-28 10:58:32,593 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 10:59:50,189 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 11:01:50,829 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e3bd6ee8c22549e2adbdf7654c1d356a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "a6835e2f1046472c5fdcc424c2b257df.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:01:54,762 INFO Request ID is c14ff4a6-9662-4acc-b3b1-6261161d8905\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c14ff4a6-9662-4acc-b3b1-6261161d8905\n", + "2025-09-28 11:01:54,995 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:14:55,269 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 11:16:55,880 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4b9ccaa19674440ba048e79c69281ff2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e20c0c87cbf9bc874d9f0fc69f1a8bf.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:16:59,508 INFO Request ID is 599e094f-ab90-4f00-9345-8fd75482af22\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 599e094f-ab90-4f00-9345-8fd75482af22\n", + "2025-09-28 11:16:59,676 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO][2m_dewpoint_temperature] Downloading 1997-08 -> era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:17:01,069 INFO Request ID is 41f672ce-3e49-486f-8023-af979305fe43\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 41f672ce-3e49-486f-8023-af979305fe43\n", + "2025-09-28 11:17:01,233 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:18:19,474 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3675585be7f245aab4f875950e144d0f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "3709265a3f871e0a1eed60d4ed23a47b.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:18:22,811 INFO Request ID is b0d522d7-04fc-4c69-9176-d87e52e5d9e0\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is b0d522d7-04fc-4c69-9176-d87e52e5d9e0\n", + "2025-09-28 11:18:22,982 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:39:26,867 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 11:40:49,547 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 11:41:27,494 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-28 11:41:27,499 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d3a9dea319de451e93583f29d789d620", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "6214c06680124551acdfee7b671fe8e7.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-09.grib.zip\n", + "[INFO][skin_temperature] Downloading 1997-09 -> era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:41:31,130 INFO Request ID is ae08f32f-8274-4d08-8103-29ccba2366b7\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is ae08f32f-8274-4d08-8103-29ccba2366b7\n", + "2025-09-28 11:41:31,187 INFO Request ID is 4390c1ec-3a33-4511-9a7f-96e24de2124e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 4390c1ec-3a33-4511-9a7f-96e24de2124e\n", + "2025-09-28 11:41:31,327 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:41:31,368 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:42:50,315 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3c144ee1155149ed842af77886d8d847", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "3ca0d69e73286c58e8a263af1be8eda2.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:42:54,223 INFO Request ID is c9797e77-a998-4f5d-8f10-5e9fdb89d1fb\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c9797e77-a998-4f5d-8f10-5e9fdb89d1fb\n", + "2025-09-28 11:42:54,382 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:44:24,830 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-28 11:44:24,841 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9cda74602d694fdd85c6a7c08b829312", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "a4b135cfd6417ae86401a63954d380d6.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:44:28,486 INFO Request ID is 726d3543-2e91-4fd7-94bc-24baa5192357\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 726d3543-2e91-4fd7-94bc-24baa5192357\n", + "2025-09-28 11:44:28,780 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:45:51,806 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "792828939420423cb9e685f31d3ea50f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "6375e988527ab825618dff1e4cb020eb.zip: 0%| | 0.00/4.36M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:45:55,430 INFO Request ID is df563da9-7a07-422c-bd58-8a612d9dcd55\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is df563da9-7a07-422c-bd58-8a612d9dcd55\n", + "2025-09-28 11:45:55,678 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:47:15,121 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 11:48:49,600 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7a35a22e4d57401aa4251e5a76ea91bf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "5d495e08d31059bafcc940d2d42e2d85.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:48:52,902 INFO Request ID is 0fc947ca-a3b0-4d12-bbff-8440e42b6dff\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0fc947ca-a3b0-4d12-bbff-8440e42b6dff\n", + "2025-09-28 11:48:53,069 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 11:49:15,791 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1584490ba4bf481fae2b9328c7dda12e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ce3f959f2e894b84a99606315e5bb92b.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 11:49:19,853 INFO Request ID is 0e118b26-6775-479f-b748-bf9a7ee32799\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0e118b26-6775-479f-b748-bf9a7ee32799\n", + "2025-09-28 11:49:20,297 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:06:21,123 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9009f71d810744af87fdc0cb7ddffc24", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "3cb3ea95379c57f2c54d60f28664bc1.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:06:25,014 INFO Request ID is b7b624fe-c7cd-4557-a82f-7e7b905df082\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is b7b624fe-c7cd-4557-a82f-7e7b905df082\n", + "2025-09-28 12:06:25,177 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:09:46,621 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 12:11:19,520 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "45df8dfdb03e4c85af67b072bd472438", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "781887e4e82483b1fd3b179de98b23a1.zip: 0%| | 0.00/4.33M [00:00 era5land/2m_dewpoint_temperature/1997/reanalysis-era5-land_2m_dewpoint_temperature_1997-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:11:22,750 INFO Request ID is 2c25ce43-7547-4d48-a7f6-834b4ceb3cdd\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 2c25ce43-7547-4d48-a7f6-834b4ceb3cdd\n", + "2025-09-28 12:11:22,942 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:11:47,252 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "391120c7c66144ca943770ea9dcb5fbf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "db6e66399cfc5fae1b833bdf40010aea.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_temperature/1997/reanalysis-era5-land_2m_temperature_1997-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:11:53,978 INFO Request ID is 7a5ab713-17d8-4c93-9a87-3f1bfcbb750c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 7a5ab713-17d8-4c93-9a87-3f1bfcbb750c\n", + "2025-09-28 12:11:54,145 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:12:46,737 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 12:14:47,406 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1138f4f5c9194aaa9b7cb41047c1a41a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "2ece900d86afc1490c0dcc26afbf1de0.zip: 0%| | 0.00/4.35M [00:00 era5land/skin_temperature/1997/reanalysis-era5-land_skin_temperature_1997-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:14:51,269 INFO Request ID is a623881a-afe3-4dc7-952d-b0d2777f53ca\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a623881a-afe3-4dc7-952d-b0d2777f53ca\n", + "2025-09-28 12:14:51,452 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:31:49,386 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f165549dc6aa4f739d11e3bf680ff27e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "76cd3d1682f98381d25ea02c37ec806d.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:31:53,158 INFO Request ID is 597b91bb-382c-4235-ab8c-24de3d3e99f8\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 597b91bb-382c-4235-ab8c-24de3d3e99f8\n", + "2025-09-28 12:31:53,375 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:34:20,461 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 12:35:17,050 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 12:36:21,076 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5dc50fba434f476b8f09abcee4699100", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9088c5a34b29ef6ee7f5a3aaf9de43c4.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:36:24,580 INFO Request ID is 2f8289af-8d37-4d3b-91e6-0d1a998f0bfa\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 2f8289af-8d37-4d3b-91e6-0d1a998f0bfa\n", + "2025-09-28 12:36:24,743 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:37:17,698 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "97480574e3c24b8babcbe84ff7ab7faf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "c9f3af5b745823386c8d42c942d26431.zip: 0%| | 0.00/4.48M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:37:21,656 INFO Request ID is 96d4cf1e-2386-40b7-8e04-6bbcfaf896fd\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 96d4cf1e-2386-40b7-8e04-6bbcfaf896fd\n", + "2025-09-28 12:37:21,826 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:38:15,117 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3802bf67ecf045548230b0b2b8b80fc0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "af35a07f1f31e13e52480256c6bcd7c2.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:38:19,265 INFO Request ID is 7eddabbd-ad4c-4ed2-8c0d-bcb4b2419d33\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 7eddabbd-ad4c-4ed2-8c0d-bcb4b2419d33\n", + "2025-09-28 12:38:19,453 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:56:50,612 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 12:58:51,243 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3bbdff40a20a4b0db21144dd8e5d946e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "352f11a15ba84122cf57c9749116a1bb.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 12:58:54,923 INFO Request ID is 36e20ac4-5fb9-45b1-9072-0bb6f17a306c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 36e20ac4-5fb9-45b1-9072-0bb6f17a306c\n", + "2025-09-28 12:58:55,088 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 12:59:48,762 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 13:00:46,771 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "10dd4bc6ced440acb42b6c60b4eaf6bf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "f35bd89dbdedd10f3416fa794886b452.zip: 0%| | 0.00/4.04M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 13:00:50,685 INFO Request ID is f0d4afc9-0266-4f83-b71d-d069a275c945\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is f0d4afc9-0266-4f83-b71d-d069a275c945\n", + "2025-09-28 13:00:50,886 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 13:01:49,251 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "27344782b8944a85ba4ed81611c64d25", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "8416d7025c77b8ce856ad0c2e4671e02.zip: 0%| | 0.00/4.47M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 13:01:52,726 INFO Request ID is 3a169853-ce15-44a6-a01a-c6d77b196dea\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3a169853-ce15-44a6-a01a-c6d77b196dea\n", + "2025-09-28 13:01:52,903 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 13:21:20,694 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 13:22:18,814 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 13:23:17,488 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "33fe3ae708f44228b869a1ddc69c11a3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "2db5b639d02ee54f7a25b723f93957f7.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 13:23:20,880 INFO Request ID is a52cfdb1-47ef-4544-9700-1b39109c062b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a52cfdb1-47ef-4544-9700-1b39109c062b\n", + "2025-09-28 13:23:21,057 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 13:23:21,191 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1ec661fdb6b3417bbba853df5ea47da0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ed59fac4abd7b1e1a07756eef846fb69.zip: 0%| | 0.00/4.06M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 13:23:24,857 INFO Request ID is 8a825d94-284a-4719-b83e-c21a50db221f\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 8a825d94-284a-4719-b83e-c21a50db221f\n", + "2025-09-28 13:23:25,023 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 13:24:19,581 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f3855199ab7745289c571c4cc07b10a8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "4cbb212f2250ebb9155c0c382ec69c4f.zip: 0%| | 0.00/4.06M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 13:24:23,491 INFO Request ID is fe3dd625-b6a8-4f02-a20e-9c93456c8abc\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is fe3dd625-b6a8-4f02-a20e-9c93456c8abc\n", + "2025-09-28 13:24:23,672 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 13:45:47,483 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bef6760f3a624676be701953ee2d07cd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9d37ea99c82dd5528481fde7cb685220.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 13:45:50,168 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 13:45:51,353 INFO Request ID is 039b85cb-7bc4-4b58-a2bf-dc4b0188804d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 039b85cb-7bc4-4b58-a2bf-dc4b0188804d\n", + "2025-09-28 13:45:51,530 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 13:46:51,035 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 13:47:50,815 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "16dface34ed043fba31a1ba2b1c34b0f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "44d0f2a1ddbc51f30d52db861f735b1b.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 13:47:54,805 INFO Request ID is 76a4c691-b03e-41fb-9a06-b23cc60fdb1c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 76a4c691-b03e-41fb-9a06-b23cc60fdb1c\n", + "2025-09-28 13:47:55,061 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 13:48:51,710 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "da5a74b24a39498f946c52a6bb163a5b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "c116b6e9d1c762ec3b53a8e966762cae.zip: 0%| | 0.00/4.49M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 13:48:55,488 INFO Request ID is a9faf20f-2cd0-40fd-a238-170ea7bc4a6a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a9faf20f-2cd0-40fd-a238-170ea7bc4a6a\n", + "2025-09-28 13:48:55,734 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:06:17,601 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ea128f17fa124b8faa10a2c6865f1a95", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "bb397d72990de295e8a427ad09527a01.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:06:21,063 INFO Request ID is 9f2046e6-cfb5-4d2c-b324-431cdd03d166\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 9f2046e6-cfb5-4d2c-b324-431cdd03d166\n", + "2025-09-28 14:06:21,232 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:10:20,462 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "286f501016ca4c74802e698ae93295f6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "2a13117e6e8320f86aa41da8f264fbd4.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:10:24,192 INFO Request ID is 0a3c8604-2855-41e5-ac6c-66946b3da55e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0a3c8604-2855-41e5-ac6c-66946b3da55e\n", + "2025-09-28 14:10:24,378 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:11:22,821 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 14:12:42,678 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3f88ce3f73ce4ac8bc3ee8213dfff49b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "67c24bc2bf34a386eed72b53af54b731.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:12:46,304 INFO Request ID is d60aebac-8de9-40a9-a998-b3091d2bb25b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is d60aebac-8de9-40a9-a998-b3091d2bb25b\n", + "2025-09-28 14:12:46,470 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:13:23,420 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5b0ce46641a94fd4a43d117bd4a5562a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "7d99d065cac6e6e968076dbb7f806691.zip: 0%| | 0.00/4.35M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:13:26,937 INFO Request ID is 0a370d46-710a-457e-8326-8c470ad24094\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0a370d46-710a-457e-8326-8c470ad24094\n", + "2025-09-28 14:13:27,117 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:34:51,321 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e48d52041ea04e389b1d553110f34c0c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "64a44fa5023287d899d5eca19658ac5e.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:34:55,216 INFO Request ID is 0b470679-9d0f-4727-af96-bb7658a01e13\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0b470679-9d0f-4727-af96-bb7658a01e13\n", + "2025-09-28 14:34:55,389 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:35:14,222 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "021ad40da5624ee1a03f9b765e16e515", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "25f5dacd4dcbb3ad81556ccd8eba0b0e.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:35:17,877 INFO Request ID is 25dc9c31-0f13-46b8-88d1-a0ba23dc0f09\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 25dc9c31-0f13-46b8-88d1-a0ba23dc0f09\n", + "2025-09-28 14:35:18,044 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:35:54,084 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 14:37:54,794 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2357de284a3e466db4913de03d8157d4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "f6483ae7816a4f260fc0342a1b9cd0ec.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:37:58,305 INFO Request ID is 85ec0af3-2bb2-45f1-b8e6-34d10f7fae8e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 85ec0af3-2bb2-45f1-b8e6-34d10f7fae8e\n", + "2025-09-28 14:37:58,600 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:53:20,703 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d21eb1bb706a4db6b5381d55968b589a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "40b08e0ddfe7b8ff9d06334566953c65.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:53:25,120 INFO Request ID is 75b321da-6c08-45d6-9aab-3b614c033435\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 75b321da-6c08-45d6-9aab-3b614c033435\n", + "2025-09-28 14:53:25,300 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 14:53:43,366 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "45123c43317c41e49afc5957b59500ca", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "53387819da43a34bc6ae468fd09fba1e.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 14:53:46,688 INFO Request ID is e8fee576-9329-4dff-a100-ced608b82345\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is e8fee576-9329-4dff-a100-ced608b82345\n", + "2025-09-28 14:53:46,854 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:00:25,741 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2e7647ebb6c340c99f98359ab75921f4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "2e9589544d690f44bad03c2465641657.zip: 0%| | 0.00/4.36M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:00:29,262 INFO Request ID is fccb5b0b-2632-44f5-8722-e2259cb9a012\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is fccb5b0b-2632-44f5-8722-e2259cb9a012\n", + "2025-09-28 15:00:29,430 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:01:47,271 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 15:03:47,910 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3ae84c5c0f0f4c548b67b058797c52b9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "952e909330790c033be4af854de7f460.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:03:51,543 INFO Request ID is c924cfb7-f871-43fd-9eef-be21196df567\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c924cfb7-f871-43fd-9eef-be21196df567\n", + "2025-09-28 15:03:51,749 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:04:09,426 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6bba120f27b34128a7c2d0772a2358f5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "d209fb0314c8f790cec89d8d65fc0195.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:04:13,157 INFO Request ID is 04b7a655-b082-46ad-93de-a3a3f514b013\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 04b7a655-b082-46ad-93de-a3a3f514b013\n", + "2025-09-28 15:04:13,356 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:24:56,293 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 15:26:56,941 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fb0d8b7d174348a48b33c60c23a30865", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "4360f90a568d0f6de96c24eeb9a27fce.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:27:00,546 INFO Request ID is d5420a54-0673-47e7-a0a7-e65bee1f13a3\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is d5420a54-0673-47e7-a0a7-e65bee1f13a3\n", + "2025-09-28 15:27:00,761 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:28:19,194 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 15:28:41,376 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e1ab84060783484f88a372e744dc179b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9a32872b62c0d9269307fb78ec852d4f.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:28:44,610 INFO Request ID is 7b5d9b60-6ccd-4d73-8083-cebfa9b43a19\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 7b5d9b60-6ccd-4d73-8083-cebfa9b43a19\n", + "2025-09-28 15:28:44,795 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:28:56,005 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 15:30:19,651 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "64018aa2fdb646f7acfe88263bba5599", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e07f5c40809a781532f1238b7b277b48.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:30:23,422 INFO Request ID is abb05402-6cf5-47ea-bb3e-2c9334fef80e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is abb05402-6cf5-47ea-bb3e-2c9334fef80e\n", + "2025-09-28 15:30:23,600 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:31:21,627 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "91e87cb232f244f9a632f6edbc92bbbd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "73b0a81a0318223c11809050929de1ac.zip: 0%| | 0.00/4.51M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:31:25,329 INFO Request ID is c268a8ad-1c5e-406a-ae2a-f5e07100f228\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c268a8ad-1c5e-406a-ae2a-f5e07100f228\n", + "2025-09-28 15:31:25,510 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:49:10,676 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 15:51:11,298 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "92cfd2b084864490a8dd2a8965903298", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "f68c09df0243fbc0f87f966dc27e6188.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/1998/reanalysis-era5-land_2m_dewpoint_temperature_1998-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:51:14,702 INFO Request ID is 22e24663-e57b-4dec-9c4d-411fdfba8342\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 22e24663-e57b-4dec-9c4d-411fdfba8342\n", + "2025-09-28 15:51:14,898 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:52:49,899 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 15:53:52,341 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 15:54:50,532 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f2d4e03f6c10430081e00ef7d7a3d0dd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "19dd251323490dbb9dd1e97716677e2a.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:54:54,514 INFO Request ID is f5eb245c-9f5f-43fb-90ee-0181a2bcfe11\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is f5eb245c-9f5f-43fb-90ee-0181a2bcfe11\n", + "2025-09-28 15:54:54,688 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:55:35,690 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e86ed2a1bbe4751ab8b8176c6381fe8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e1a9d8ebe0f5ff838c1193dde80a6f28.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:55:39,167 INFO Request ID is f51c7862-b9a6-4902-b312-5a3c5cd8f8cd\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is f51c7862-b9a6-4902-b312-5a3c5cd8f8cd\n", + "2025-09-28 15:55:40,665 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 15:55:52,978 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "af790f44d1404bf8899ead101fefa3d6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "cd470c3fcb2867eb240759cce42af484.zip: 0%| | 0.00/4.35M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 15:55:56,741 INFO Request ID is 21ee451c-69fc-4dbc-8933-d180e650f5e0\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 21ee451c-69fc-4dbc-8933-d180e650f5e0\n", + "2025-09-28 15:55:57,038 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 16:17:21,384 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 16:18:24,316 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 16:19:22,055 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "81043773ce57420cb386e8af1534b5f9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "b9511bf4382beb540f15e1c523ca19c9.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 16:19:26,211 INFO Request ID is 60c69186-b8b9-4c4d-a8c1-61418800670a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 60c69186-b8b9-4c4d-a8c1-61418800670a\n", + "2025-09-28 16:19:26,468 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 16:20:07,835 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3cc6993f175846c19644a8a741096f62", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "97d5f5e4210234a0593cbac796cc9941.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 16:20:11,733 INFO Request ID is 7e8aa9cc-08d4-47ec-87a0-f2276440a0f1\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 7e8aa9cc-08d4-47ec-87a0-f2276440a0f1\n", + "2025-09-28 16:20:11,897 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 16:20:24,926 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "746d94847ec143689f47014c89e3869c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "a2885284168c4a65e0569f67dadffe24.zip: 0%| | 0.00/4.49M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 16:20:28,718 INFO Request ID is 86828da3-4b3d-4e9a-b456-4070975869eb\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 86828da3-4b3d-4e9a-b456-4070975869eb\n", + "2025-09-28 16:20:28,883 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 16:41:53,624 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 16:43:54,249 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "151638ee50bc4f7d85ceb3904c1e98d5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "d56615b1ff25713f34f2633df70eb3b5.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_temperature/1998/reanalysis-era5-land_2m_temperature_1998-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 16:43:57,723 INFO Request ID is ca62b92f-17ba-4534-90ff-f12fa751c3b3\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is ca62b92f-17ba-4534-90ff-f12fa751c3b3\n", + "2025-09-28 16:43:57,896 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 16:44:39,246 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "370a97861ee74ffab4966bfdc6fecdea", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "6d0cff7324eb7f4a5cf394258754dee8.zip: 0%| | 0.00/4.05M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 16:44:42,861 INFO Request ID is e97af208-5d4c-475a-94ad-00034e5613b8\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is e97af208-5d4c-475a-94ad-00034e5613b8\n", + "2025-09-28 16:44:43,083 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 16:44:56,807 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e071f065f1584ebebd96c6deecaaef90", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9aaff2286d8e17222b337ae857be263d.zip: 0%| | 0.00/4.34M [00:00 era5land/skin_temperature/1998/reanalysis-era5-land_skin_temperature_1998-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 16:45:00,422 INFO Request ID is 196ddc4d-417b-4e2e-adb9-832f2508f435\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 196ddc4d-417b-4e2e-adb9-832f2508f435\n", + "2025-09-28 16:45:00,601 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:04:23,831 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "848cacace75f4113bf43d4e8e934d760", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "c823a6e056de103c72905ce0c3d96995.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:04:28,764 INFO Request ID is dfedeb67-0f86-45e0-ad54-8885f9bb77fa\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is dfedeb67-0f86-45e0-ad54-8885f9bb77fa\n", + "2025-09-28 17:04:28,993 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:05:09,830 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4628238c8ae549409f9cb6f9c7e5b34e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "459939ba12fb5c1d2b9c06ac49cb718f.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:05:13,550 INFO Request ID is 3444401d-da72-40fe-b9f9-f561d7994bb4\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3444401d-da72-40fe-b9f9-f561d7994bb4\n", + "2025-09-28 17:05:13,828 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:05:26,876 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 17:07:27,488 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0510d7e4902e41fa8d3d78c9df7b6515", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "22b9fbcebf21236ae0df41944226b3c8.zip: 0%| | 0.00/4.48M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:07:31,176 INFO Request ID is ae3477c4-e50d-4cd7-9ab7-b3720dcd7f78\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is ae3477c4-e50d-4cd7-9ab7-b3720dcd7f78\n", + "2025-09-28 17:07:31,359 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:10:51,000 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 17:11:51,878 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 17:12:51,662 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3adafbecf5a847b5b5480c1f695b2513", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "c39df31c4ce53b3e10b07d57ec62027f.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:12:55,795 INFO Request ID is 695611ea-f52c-423c-9968-c22f7d060ede\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 695611ea-f52c-423c-9968-c22f7d060ede\n", + "2025-09-28 17:12:55,983 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:13:36,324 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1f14c21135214340a6689a67062fea27", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "69b5e9c08dd9d55dbd1f12a769504c8b.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:13:39,892 INFO Request ID is 09f87ea2-ce0c-441d-bf94-823085234a4a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 09f87ea2-ce0c-441d-bf94-823085234a4a\n", + "2025-09-28 17:13:40,087 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:15:53,171 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0156b588701d43e5be62e831b54282fc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "334c29f478e24427fecbc16b4bb9acef.zip: 0%| | 0.00/4.49M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:15:56,435 INFO Request ID is 42e0c023-c6a2-4c0c-b466-2628cb014309\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 42e0c023-c6a2-4c0c-b466-2628cb014309\n", + "2025-09-28 17:15:56,601 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:33:22,128 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 17:34:05,977 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "90f014dac48a44988d1793021c311637", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "122ab23d1c2623d60041c082d45e3aaa.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:34:09,898 INFO Request ID is 59780588-c3de-47e7-b7a2-cccfed51b947\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 59780588-c3de-47e7-b7a2-cccfed51b947\n", + "2025-09-28 17:34:10,060 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:35:23,031 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b8b009492b3743d5a23520994c28a5e0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "50cb77f06aafe9920604b2fb6c50b5b7.zip: 0%| | 0.00/4.05M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:35:26,970 INFO Request ID is 60e2e53a-87a7-449b-9fcb-a8df9da77a1e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 60e2e53a-87a7-449b-9fcb-a8df9da77a1e\n", + "2025-09-28 17:35:27,160 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:36:22,578 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 17:38:21,531 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 17:38:23,043 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "de29cd32eb9c4ede942b58a454a83249", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "86333933ae7b233998f0e04840080d50.zip: 0%| | 0.00/4.04M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:38:34,578 INFO Request ID is 1ee171cb-b08c-4137-b862-83ea7a66d45c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 1ee171cb-b08c-4137-b862-83ea7a66d45c\n", + "2025-09-28 17:38:34,759 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO][skin_temperature] Downloading 1999-03 -> era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:38:39,838 INFO Request ID is 70c24b5c-7e16-48b1-bbbd-f299db1b03aa\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 70c24b5c-7e16-48b1-bbbd-f299db1b03aa\n", + "2025-09-28 17:38:40,161 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:41:49,325 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5cfa7b1a625b4459b3980f14f711ad1a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9592ea8f45390f3c2799c3df4ef2a03c.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:41:53,641 INFO Request ID is 3c14166b-d177-414f-84b4-895187db185f\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3c14166b-d177-414f-84b4-895187db185f\n", + "2025-09-28 17:41:53,833 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:59:00,658 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4d8611b8150c4fe29e7ea5f71040f1fd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "11608f52b0223c5bb6f110efd8060b98.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 17:59:04,591 INFO Request ID is a304395f-be9b-4c76-8716-01ae6cfd5fec\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a304395f-be9b-4c76-8716-01ae6cfd5fec\n", + "2025-09-28 17:59:04,752 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 17:59:06,046 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 18:00:19,662 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 18:01:06,664 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c3859a177749424fbcfe0489ec7c9681", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "caa302f476ed140050fa6675f2f24002.zip: 0%| | 0.00/4.48M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:01:10,664 INFO Request ID is cf930149-33e2-4b25-92c7-1b40710e19fc\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is cf930149-33e2-4b25-92c7-1b40710e19fc\n", + "2025-09-28 18:01:10,841 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 18:02:20,335 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8f472d02cf774478b636ee73e1c0d0af", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "5d8d082314badfbbbbbe33454c4e6534.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:02:24,069 INFO Request ID is e7a7b605-26c2-4932-a88d-fb981c8452c4\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is e7a7b605-26c2-4932-a88d-fb981c8452c4\n", + "2025-09-28 18:02:24,264 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 18:21:31,268 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f728c64feb19430ca63779a80f3109b4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "c155446171470a8d0f82b7d9eb8626cf.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:21:34,989 INFO Request ID is fb7d3b0a-f576-4bd5-a4ae-417af116d51b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is fb7d3b0a-f576-4bd5-a4ae-417af116d51b\n", + "2025-09-28 18:21:35,157 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 18:21:36,846 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 18:23:37,496 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2a68a571d61d4b5ab5cf4b17261ddf58", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "151116531ec2b6a216a0ccace348684d.zip: 0%| | 0.00/4.35M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:23:41,256 INFO Request ID is 65bbfed0-735b-4679-9e71-7032ccd95512\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 65bbfed0-735b-4679-9e71-7032ccd95512\n", + "2025-09-28 18:23:41,433 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 18:24:51,034 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c7e542a871e54ef6a9691afd2bb63aab", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "2000694300ee7851dde7c09fc949eb25.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:24:54,297 INFO Request ID is 2f36696c-d577-4710-a3c4-75db335294ba\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 2f36696c-d577-4710-a3c4-75db335294ba\n", + "2025-09-28 18:24:54,529 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 18:42:03,261 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1948bdbc5604401e913fb2285463fa58", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "1152322dffcc8a106e1269bb22dbac32.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:42:07,139 INFO Request ID is 928b7dc9-97ab-4891-9fde-14b9ee015b8a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 928b7dc9-97ab-4891-9fde-14b9ee015b8a\n", + "2025-09-28 18:42:07,312 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 18:46:06,492 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 18:47:23,025 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 18:48:07,118 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "05422e3fb8d141f09aa68087c55b046d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9f76bbf39b7eacc4cf5d43dbae9067e8.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:48:10,955 INFO Request ID is 3e0b7a69-d21b-4e95-a3f2-a499e5d0027e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3e0b7a69-d21b-4e95-a3f2-a499e5d0027e\n", + "2025-09-28 18:48:11,121 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 18:48:28,421 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dc6da509c16b4758a728b05dddeb5e40", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "769166ba686bc54e365ce2bb535bf2a7.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:48:32,097 INFO Request ID is 33d7bced-d5a3-422e-9552-cea1ce6801d3\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 33d7bced-d5a3-422e-9552-cea1ce6801d3\n", + "2025-09-28 18:48:32,262 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 18:49:23,785 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7e8f281314c64f27abb88704991397e7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "6f5a9a4bc5da369ae0b6ec5daa18e27d.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 18:49:27,474 INFO Request ID is 66d75a99-b12e-4233-84c2-a83afc2afbaa\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 66d75a99-b12e-4233-84c2-a83afc2afbaa\n", + "2025-09-28 18:49:27,667 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "WARNING:multiurl.http:Recovering from HTTP error [500 Internal Server Error], attempt 1 of 500\n", + "WARNING:multiurl.http:Retrying in 120 seconds\n", + "WARNING:multiurl.http:Recovering from HTTP error [500 Internal Server Error], attempt 1 of 500\n", + "WARNING:multiurl.http:Retrying in 120 seconds\n", + "WARNING:multiurl.http:Recovering from HTTP error [500 Internal Server Error], attempt 1 of 500\n", + "WARNING:multiurl.http:Retrying in 120 seconds\n", + "2025-09-28 19:10:50,348 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "df201f282da0465d81c739004e4fe50e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "29a2ba6a54b5fd6ab0de5a078a36c93a.zip: 0%| | 0.00/4.36M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:10:53,706 INFO Request ID is 014c3ff8-b58c-45c5-b066-950808c96853\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 014c3ff8-b58c-45c5-b066-950808c96853\n", + "2025-09-28 19:10:53,890 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:11:11,694 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "599f5d19c49846509e541e7fb6cd963e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "2840b4ab5e6f71ff09264850816af254.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/1999/reanalysis-era5-land_2m_dewpoint_temperature_1999-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:11:15,580 INFO Request ID is 34558367-015f-453e-9f9c-db321edca53d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 34558367-015f-453e-9f9c-db321edca53d\n", + "2025-09-28 19:11:15,905 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:12:04,761 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "29e88c7c398b466fb5d124807d0edfb4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ff013f561000a4fff08acac758c68d14.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:12:09,436 INFO Request ID is a39c0b04-1e47-4ed3-b587-35c7bd7f375f\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a39c0b04-1e47-4ed3-b587-35c7bd7f375f\n", + "2025-09-28 19:12:09,595 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:31:20,022 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 19:32:35,296 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 19:33:20,726 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d99b84ceaabc49328ac6b4fdbaa6a771", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "a02956824a6d4a64c6dd714d59d2bdec.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:33:24,579 INFO Request ID is e0168617-d0e0-4f41-b664-59243d0bf9a9\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is e0168617-d0e0-4f41-b664-59243d0bf9a9\n", + "2025-09-28 19:33:24,783 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:33:42,676 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c05bca9bbf904d379d3ec169f74318e0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "d90f897e09f97ad60385a9000220dfd1.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:33:46,015 INFO Request ID is 1462df20-ff79-428c-92b3-f96980f9d1ef\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 1462df20-ff79-428c-92b3-f96980f9d1ef\n", + "2025-09-28 19:33:46,196 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:34:36,122 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "73fccb774bf5498d9b788d6657a811b9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "1863ae73d73939992ec624765e79be45.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:34:40,014 INFO Request ID is 985258dc-98f5-4c6d-8930-43c910a5006b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 985258dc-98f5-4c6d-8930-43c910a5006b\n", + "2025-09-28 19:34:40,223 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:36:18,277 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 19:37:33,563 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 19:37:45,393 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6834979ba6e04468b592280fd82402c4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "27a2b62c50f8f37ee2669eaf070bdcc1.zip: 0%| | 0.00/4.51M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:37:48,700 INFO Request ID is 21076683-6cf8-4acb-84e0-f42ac74e7ee2\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 21076683-6cf8-4acb-84e0-f42ac74e7ee2\n", + "2025-09-28 19:37:48,862 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:38:06,731 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e249e9e30337416ebf243f1035b3ab2a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9b3c99a97e0eec215bef624e026bc453.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:38:10,160 INFO Request ID is 19663956-a570-40af-b64c-15a735779775\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 19663956-a570-40af-b64c-15a735779775\n", + "2025-09-28 19:38:10,328 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:41:01,334 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "448ac1240bcb4aacb67039a6e7f083dd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e0eee446ea734d4407464d78c636cd67.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:41:04,986 INFO Request ID is 8c8f0797-a8bd-48de-87d7-05db72e77146\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 8c8f0797-a8bd-48de-87d7-05db72e77146\n", + "2025-09-28 19:41:05,171 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:42:09,465 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 19:43:58,677 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 19:44:10,130 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dcac3399bfcb453390fe33e46e7bd265", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "8f4adccd02519eea77c64cf415658fb.zip: 0%| | 0.00/4.36M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:44:13,491 INFO Request ID is 5e02db94-5c23-4046-be74-11ea4594a68e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 5e02db94-5c23-4046-be74-11ea4594a68e\n", + "2025-09-28 19:44:13,671 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:44:31,790 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "028b48b8e5354d1bb33208a0bbeeb4d5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "5f792576d039031463f04bcfdf66ab6a.zip: 0%| | 0.00/4.19M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:44:35,130 INFO Request ID is 8950791e-11c1-49fc-a5a0-5d2f4cc7aae6\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 8950791e-11c1-49fc-a5a0-5d2f4cc7aae6\n", + "2025-09-28 19:44:35,395 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:45:25,812 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3c4c5a6de7084c0fb6301ab23b8efe0c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "7a258122d9bb2fbc4c384d5083cf5101.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:45:29,553 INFO Request ID is ac6efb0c-b7fc-4768-ab15-bcf655a82a99\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is ac6efb0c-b7fc-4768-ab15-bcf655a82a99\n", + "2025-09-28 19:45:29,750 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:50:34,908 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 19:52:35,716 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5b1e41ddbb334e18b9c0c96c5cc18110", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "3bce2679de292550f537cd73bbb5a571.zip: 0%| | 0.00/4.49M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:52:39,302 INFO Request ID is 5da0c2ed-5d83-4df4-a6a1-173d95f2c9ed\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 5da0c2ed-5d83-4df4-a6a1-173d95f2c9ed\n", + "2025-09-28 19:52:39,466 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:52:48,477 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 19:52:57,425 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d5c4ffe1a8234a5ea04c5e41c1e11180", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "f9f183f8576a63dad9fa9069b14bdafb.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:53:01,151 INFO Request ID is df1a7c48-9b65-4a4e-80b4-fff66f94d15a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is df1a7c48-9b65-4a4e-80b4-fff66f94d15a\n", + "2025-09-28 19:53:01,313 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:53:52,021 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3c0d4b5f5f8d4a8dbae04419176ca5cd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "f3e1f8e94eddf744a63d378d9f92d500.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_temperature/1999/reanalysis-era5-land_2m_temperature_1999-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:53:55,555 INFO Request ID is 521a23c3-e3d9-4b03-b1f6-532a8247bc1c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 521a23c3-e3d9-4b03-b1f6-532a8247bc1c\n", + "2025-09-28 19:53:55,834 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:54:34,835 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f488d75c2fb1400f8adf46ad037a16a4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "7510e309d86c4f497b96d8a8a9f8bc94.zip: 0%| | 0.00/4.35M [00:00 era5land/skin_temperature/1999/reanalysis-era5-land_skin_temperature_1999-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:54:38,501 INFO Request ID is 7c7f760d-d2d0-4525-853e-605f6f02e529\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 7c7f760d-d2d0-4525-853e-605f6f02e529\n", + "2025-09-28 19:54:38,821 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:54:46,950 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3f3b856fe6c44f4bb2c6a3b35011ce70", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "23409b4ae82772a0813041619de3361e.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:54:50,767 INFO Request ID is 39023da2-d8de-4d17-b913-9c897b46902b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 39023da2-d8de-4d17-b913-9c897b46902b\n", + "2025-09-28 19:54:50,939 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 19:54:56,548 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "efdcd010e89c464ea07c4e33ce196bbb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "bd29b2644252a8a1b0af1e92c612bc41.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 19:55:00,693 INFO Request ID is 2fce231b-d58a-464f-9fcc-e481e536f0c1\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 2fce231b-d58a-464f-9fcc-e481e536f0c1\n", + "2025-09-28 19:55:00,858 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:13:04,344 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 20:15:05,000 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "663179fdd41b4c2cbd299bbf1de69919", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "5956a9c7d849126befaefe0b4996f3c8.zip: 0%| | 0.00/4.47M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:15:09,052 INFO Request ID is 0faad14c-9e5f-47f4-8363-490a4f80612d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0faad14c-9e5f-47f4-8363-490a4f80612d\n", + "2025-09-28 20:15:09,433 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:15:17,409 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "593effd3a8e2448bab6ef5fc5173d71d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "348b84a997c865f293373d283c569d5.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:15:21,311 INFO Request ID is edb336d1-4f3c-4c79-823c-fbdcde11a19e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is edb336d1-4f3c-4c79-823c-fbdcde11a19e\n", + "2025-09-28 20:15:21,522 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:15:27,050 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3a9bef50652345539c435349b396201b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e7811ede919fd09c21f38dc03febe29f.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:15:30,476 INFO Request ID is 2c38511a-39dc-40f3-8f8a-229c3d739938\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 2c38511a-39dc-40f3-8f8a-229c3d739938\n", + "2025-09-28 20:15:30,643 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:18:03,303 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 20:19:30,451 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4a359b8cef3143a4b6bc68071be32cad", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "8068b06c0861a23653ecb128c9b225b0.zip: 0%| | 0.00/4.48M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:19:34,334 INFO Request ID is f5308622-1beb-4cae-9984-85fc7ebee1f3\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is f5308622-1beb-4cae-9984-85fc7ebee1f3\n", + "2025-09-28 20:19:34,509 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:19:42,099 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3d94e32db66b431aa7d7e6d20437927b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "f60db32fcda20309b3371c4f7cace9cb.zip: 0%| | 0.00/4.19M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:19:45,902 INFO Request ID is 39edf82b-d621-4efe-80e5-e77ca6272965\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 39edf82b-d621-4efe-80e5-e77ca6272965\n", + "2025-09-28 20:19:46,063 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:19:51,175 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ddaacfcbe39849a283e90877eeb641ba", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "aa0898d096deb54cbe7aa663e48e2a5d.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:19:54,932 INFO Request ID is 23ae33cd-0e31-4581-96f5-7bc8b1298982\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 23ae33cd-0e31-4581-96f5-7bc8b1298982\n", + "2025-09-28 20:19:55,102 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:35:59,410 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c725c0392a9d4c83af689eb9ca8e1998", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "7c5c5d4f140aa3f9b09306ed56552dfd.zip: 0%| | 0.00/4.19M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:36:03,255 INFO Request ID is af1e0535-8635-44b4-9fcd-2b98a0307ea8\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is af1e0535-8635-44b4-9fcd-2b98a0307ea8\n", + "2025-09-28 20:36:03,442 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:36:11,680 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "600797b828744348a1ec700f2573d298", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "98ad4c2d5566f375a9745167e4ff8452.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:36:15,402 INFO Request ID is 0843fd49-e65e-4ab6-bfda-00c0809d08d8\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 0843fd49-e65e-4ab6-bfda-00c0809d08d8\n", + "2025-09-28 20:36:15,592 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:36:20,341 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "df4f2d7a9b0b470ea2ea7017b1a575c8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "93395fdad936519f5df9c29893a29834.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:36:24,001 INFO Request ID is c54cc5ab-9e42-46b1-add2-4b2867bdc8bd\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c54cc5ab-9e42-46b1-add2-4b2867bdc8bd\n", + "2025-09-28 20:36:24,165 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:42:24,875 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "90c5df1d7aa249279f80d4ff86859686", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "dabe9a84a174c2ed56267b6ff254859c.zip: 0%| | 0.00/4.48M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:42:28,315 INFO Request ID is a36d5103-50b0-433d-908e-6c292dbd51f1\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a36d5103-50b0-433d-908e-6c292dbd51f1\n", + "2025-09-28 20:42:28,485 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:42:45,659 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4576c980433b431b9c29426ec90c9801", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ddd2d5b2a989eb6591e997f6b4eb0faf.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:42:49,155 INFO Request ID is 8b19f835-5a2d-41da-b6e6-9d6a6a8b23ce\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 8b19f835-5a2d-41da-b6e6-9d6a6a8b23ce\n", + "2025-09-28 20:42:49,316 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 20:44:38,016 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "42d5782cf13d46bfbebfafdc995ece08", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "82445cc3f8e717d7407a7938cc41ee03.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 20:44:41,337 INFO Request ID is 73ffd0b5-1ad4-4a59-a65c-9d743387388b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 73ffd0b5-1ad4-4a59-a65c-9d743387388b\n", + "2025-09-28 20:44:41,526 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:02:54,826 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 21:04:55,457 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ecb1f7364b04104b45f2bb8d315481c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "7bad8f5b7851e363357c755646b87652.zip: 0%| | 0.00/4.34M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:04:59,455 INFO Request ID is c806a619-6339-4aab-9d6b-68df48c3d5cc\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c806a619-6339-4aab-9d6b-68df48c3d5cc\n", + "2025-09-28 21:04:59,618 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:05:07,785 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7adf7a3e1f6149b29cd4462679bf4e55", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "cd43dd876190665e6148cb329d24db26.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:05:11,598 INFO Request ID is 41dc86e5-7366-40d6-a317-8a582a1bb737\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 41dc86e5-7366-40d6-a317-8a582a1bb737\n", + "2025-09-28 21:05:11,790 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:05:16,558 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6800242f33a344db9acf025d94626871", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9391d005a2ee51faa0625957e362ae00.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:05:20,047 INFO Request ID is e03617d1-2bb9-458b-bcbe-a2ca92360454\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is e03617d1-2bb9-458b-bcbe-a2ca92360454\n", + "2025-09-28 21:05:20,214 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:31:28,176 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 21:33:28,779 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9669abe7939a4b33ae20d2139980e848", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "89b5461034525a32fbcbc8ebd8f7b644.zip: 0%| | 0.00/4.49M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:33:32,283 INFO Request ID is 9591428a-3fd2-45b2-9bec-0fda529b7695\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 9591428a-3fd2-45b2-9bec-0fda529b7695\n", + "2025-09-28 21:33:32,451 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:33:41,120 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3b5f7d771ce84178b96aee2e38ecad1b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e2948968602e0a2443d7bad69015ea54.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:33:44,581 INFO Request ID is a6a52262-2c77-498b-803f-3a958e4388ce\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a6a52262-2c77-498b-803f-3a958e4388ce\n", + "2025-09-28 21:33:44,751 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:33:49,533 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4c6210ac897443779f25393c732ae6c4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "8f343ad77beb9511fb7a04277db995c7.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:33:52,884 INFO Request ID is 4aff4261-1066-4fcc-8c26-d4adac4d7892\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 4aff4261-1066-4fcc-8c26-d4adac4d7892\n", + "2025-09-28 21:33:53,054 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:55:58,659 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c6c75bb1f72c46d09b575e405ae5a928", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e280e98aec26a4532858180961dd3355.zip: 0%| | 0.00/4.36M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:56:02,417 INFO Request ID is 3e35b608-a676-459d-b4d1-1d97f9191ff7\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3e35b608-a676-459d-b4d1-1d97f9191ff7\n", + "2025-09-28 21:56:02,579 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:56:11,508 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ce3d573703e94b1cb5987d3b86a800f0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "361383d34e740e6c5ee38c6517a39c65.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:56:15,139 INFO Request ID is b32f9a64-31e9-4e72-849c-af52ef236c5b\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is b32f9a64-31e9-4e72-849c-af52ef236c5b\n", + "2025-09-28 21:56:15,305 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 21:56:19,825 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fa3352109cd9472580b64af3b94ead76", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "59138b25400d104a72a0af25d76054ca.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/2000/reanalysis-era5-land_2m_dewpoint_temperature_2000-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 21:56:23,371 INFO Request ID is 83a0db06-0184-4fc4-96e4-9fcd7e3f4d98\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 83a0db06-0184-4fc4-96e4-9fcd7e3f4d98\n", + "2025-09-28 21:56:23,537 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:14:28,384 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 22:16:29,031 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3c6461c3ab75439aa98721a2638e41b5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e45ae09f7eff811f795aba8f6494cb09.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:16:32,866 INFO Request ID is c4fe2ebb-ab99-48de-82fe-c386eaa7124d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is c4fe2ebb-ab99-48de-82fe-c386eaa7124d\n", + "2025-09-28 22:16:33,286 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:16:41,435 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fe4973362c234209b69b19872d1f0088", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "7be9a23861d9473d39344ae19f3e37af.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:16:44,871 INFO Request ID is aa2a67b2-331c-4d3d-ba8d-73fdecfa68bc\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is aa2a67b2-331c-4d3d-ba8d-73fdecfa68bc\n", + "2025-09-28 22:16:45,043 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:16:49,603 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c6692c15606641949e248285cf86c324", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "3a4ddf8bc43026d0b894b89af625e683.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:16:52,846 INFO Request ID is 610ebceb-931d-476b-ad7a-d1065b523db9\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 610ebceb-931d-476b-ad7a-d1065b523db9\n", + "2025-09-28 22:16:53,026 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:20:54,128 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 22:22:54,749 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "99efc103b7954432915471e38d2afd6d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "95afc043911abf9b82efede210b878bb.zip: 0%| | 0.00/4.51M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:22:58,267 INFO Request ID is cc434eec-17a9-4870-ad48-a6264ca9f979\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is cc434eec-17a9-4870-ad48-a6264ca9f979\n", + "2025-09-28 22:22:58,439 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:23:06,190 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "71d200c8650b42f6b60db279abfa251c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "e8492633f6af9483e5f397024b82cf24.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:23:09,840 INFO Request ID is 6f7a00b8-859c-45e7-aa7c-4bf852305a7a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 6f7a00b8-859c-45e7-aa7c-4bf852305a7a\n", + "2025-09-28 22:23:10,011 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:23:14,246 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "459b0406436a45d8b2df4f6b2b8aff79", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "63276c3384cf57bc5bbb20626136a9a1.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:23:17,673 INFO Request ID is a1f944df-5092-44c7-8f93-00f04e025e57\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a1f944df-5092-44c7-8f93-00f04e025e57\n", + "2025-09-28 22:23:17,872 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:45:25,315 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 22:47:25,955 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ec5f577564914615a460bf5dd09cd364", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "d9a36814dba5febbbefce644c30da247.zip: 0%| | 0.00/4.35M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:47:29,252 INFO Request ID is 5f841d7e-3d80-40ec-a04a-864871c1b30d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 5f841d7e-3d80-40ec-a04a-864871c1b30d\n", + "2025-09-28 22:47:29,419 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:47:37,401 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b242c4444710453799345e60654545a3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "7c5dca310de29d66fdaa2525fd8aadb5.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:47:41,347 INFO Request ID is 1ef93fbf-2b1f-48ca-8b53-56e1a27566dc\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 1ef93fbf-2b1f-48ca-8b53-56e1a27566dc\n", + "2025-09-28 22:47:41,527 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 22:47:45,500 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cb9c16185e6b4aeeb06e29b1a4ad3b8f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "5961ab2c26919d206b7bae965b1d0a9.zip: 0%| | 0.00/4.04M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 22:47:48,846 INFO Request ID is cc45f3bb-fc84-48da-b7a9-3578c4ba6d43\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is cc45f3bb-fc84-48da-b7a9-3578c4ba6d43\n", + "2025-09-28 22:47:49,009 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:07:55,862 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 23:09:56,487 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "de0eac2d731b495bb410045f080e041a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ec15c5ec430dc9d16aef338aa73b511f.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:10:00,080 INFO Request ID is 73ef2488-cb67-4651-b26a-c4789754017e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 73ef2488-cb67-4651-b26a-c4789754017e\n", + "2025-09-28 23:10:00,277 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:10:08,346 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cae095198ebf4b3f8fa72a62ce7921d8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "48416c8bf4753f539ff047b37cd6c7e6.zip: 0%| | 0.00/4.33M [00:00 era5land/2m_temperature/2000/reanalysis-era5-land_2m_temperature_2000-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:10:12,498 INFO Request ID is 95dba13f-2564-4e84-a083-b655cc51b77d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 95dba13f-2564-4e84-a083-b655cc51b77d\n", + "2025-09-28 23:10:12,697 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:10:15,592 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "06fc1287114c413793bf7f682fde94d6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "2e1e4e7197475d80d92d0118f59aa1a.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:10:19,438 INFO Request ID is ab0cdb5a-a5c2-41c7-ba8c-a370d27f9d04\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is ab0cdb5a-a5c2-41c7-ba8c-a370d27f9d04\n", + "2025-09-28 23:10:19,620 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:10:33,626 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 23:12:08,057 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "df10c9942d5f4a1a907b507841d22da1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "49c5d31fe0381d3e4be6d80795b65dc6.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:12:12,491 INFO Request ID is 97251dbd-9c62-4c65-938b-00c5ac5f3943\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 97251dbd-9c62-4c65-938b-00c5ac5f3943\n", + "2025-09-28 23:12:12,658 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:12:14,647 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7c8961f537374ff3a9492fdf8bacacd3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "5f1baa7a662c253def68433ca83a213.zip: 0%| | 0.00/4.35M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:12:18,716 INFO Request ID is 4ea34fb4-6b3a-4bdd-8a44-d43e7b0c33a7\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 4ea34fb4-6b3a-4bdd-8a44-d43e7b0c33a7\n", + "2025-09-28 23:12:18,924 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:12:53,586 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "95cf8e6ecea541e2bb570f94ce2a98b4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "fa6a5426ff345aac741edb45c8d06693.zip: 0%| | 0.00/4.34M [00:00 era5land/skin_temperature/2000/reanalysis-era5-land_skin_temperature_2000-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:12:56,971 INFO Request ID is cf0dfc78-7853-4ba9-9571-f135b84e6c67\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is cf0dfc78-7853-4ba9-9571-f135b84e6c67\n", + "2025-09-28 23:12:57,168 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:31:23,306 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 23:32:38,625 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0e343df2f5fa4b54bd6a15656f7bb0db", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "b3dce5023e93964a069c7b955d2c8d25.zip: 0%| | 0.00/4.46M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:32:41,899 INFO Request ID is f49eb7a7-00d5-4982-a93a-233b606f41df\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is f49eb7a7-00d5-4982-a93a-233b606f41df\n", + "2025-09-28 23:32:42,066 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:32:44,783 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "02ed346f54f3439ba59754790c4f8686", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "9ae13c2b031e9c790869e612dbee1b8.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:32:48,752 INFO Request ID is 3c22601b-4638-4965-ad45-ad45df57d8cf\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 3c22601b-4638-4965-ad45-ad45df57d8cf\n", + "2025-09-28 23:32:48,918 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:33:23,972 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6e645c114b47428682dc23ad557e7d71", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "669709dbdded189faadf36725498ff79.zip: 0%| | 0.00/4.49M [00:00 era5land/skin_temperature/2001/reanalysis-era5-land_skin_temperature_2001-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:33:27,347 INFO Request ID is 73d30bd3-605b-424f-adf6-0397dd7920c9\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 73d30bd3-605b-424f-adf6-0397dd7920c9\n", + "2025-09-28 23:33:27,529 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:35:22,578 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-28 23:35:35,433 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f5625328650640b9a59d7fcdbfde57d1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "c28bb67fbeb83c1f9ffff7ffa9a4cdf7.zip: 0%| | 0.00/4.05M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:35:38,817 INFO Request ID is ab4eb50f-db7b-42d7-90e7-2fed7bca1bec\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is ab4eb50f-db7b-42d7-90e7-2fed7bca1bec\n", + "2025-09-28 23:35:38,997 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:35:42,316 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "74ab3941083b4c52ad402dfb46ab8a51", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "b3634127592e5fef55829c0c31c898f1.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:35:45,727 INFO Request ID is 280dda53-0171-4867-9602-dcbec5f0c104\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 280dda53-0171-4867-9602-dcbec5f0c104\n", + "2025-09-28 23:35:45,903 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:36:55,431 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "eabfa507e8ff4287bf99c9a28f3151bc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "dbbbb57ff5fe20852e16b352dd7016b.zip: 0%| | 0.00/4.48M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:36:58,854 INFO Request ID is bb77fabb-ba2f-4e8a-8964-1edcbb457dcc\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is bb77fabb-ba2f-4e8a-8964-1edcbb457dcc\n", + "2025-09-28 23:36:59,148 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:37:40,905 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5ea15d7e8cda49c88936c7b2c744f62a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "2dc92ea4f51aefae4f5558e9a403c1d6.zip: 0%| | 0.00/4.49M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:37:44,294 INFO Request ID is 8e920ec1-72dc-4807-806e-0b02f2ee025e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 8e920ec1-72dc-4807-806e-0b02f2ee025e\n", + "2025-09-28 23:37:44,463 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:37:48,003 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5fa9f2d82608429c91df18b5a093153f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "87f40f8e1f023392cad2edb054018d74.zip: 0%| | 0.00/4.46M [00:00 era5land/skin_temperature/2001/reanalysis-era5-land_skin_temperature_2001-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:37:51,621 INFO Request ID is 45e2d504-184f-4c07-a8fd-40bce1d3ce6e\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 45e2d504-184f-4c07-a8fd-40bce1d3ce6e\n", + "2025-09-28 23:37:51,864 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:57:25,435 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d542943879d742ba884dd1a567406cef", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "5fd59709a1bbbdfc541ffd738f300495.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:57:29,466 INFO Request ID is bec55a14-fb93-4c50-b601-09efbb676d5f\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is bec55a14-fb93-4c50-b601-09efbb676d5f\n", + "2025-09-28 23:57:29,653 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:58:10,566 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "31f79ad33d4c4e17ae0991e66877ab5f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "f9a8025ee70a9c62baba8f6301d96bd4.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:58:14,082 INFO Request ID is a905bfbd-2c00-4dd4-99ea-8f5e5ec793e1\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is a905bfbd-2c00-4dd4-99ea-8f5e5ec793e1\n", + "2025-09-28 23:58:14,246 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:58:17,877 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4da3cebba1564bb0b1537b3c49e28068", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "cd715e2a27b272e5ff94b19f08aab732.zip: 0%| | 0.00/4.05M [00:00 era5land/skin_temperature/2001/reanalysis-era5-land_skin_temperature_2001-03.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:58:21,623 INFO Request ID is 76641ce0-3ecd-4485-84e0-46a5045855f2\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 76641ce0-3ecd-4485-84e0-46a5045855f2\n", + "2025-09-28 23:58:21,802 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:58:46,250 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "92b9f108970a4fccb2ac469e8fb3d158", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "d280ea8011c96f11ea11f05a526398c7.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-06.grib.zip\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b3f12a115dbd4f8088cc331bcc8ef95b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "79047a0872e867bfc325eb2f913ec736.zip: 0%| | 0.00/4.34M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-28 23:58:51,808 INFO Request ID is 9ebc05d1-84b3-483c-a927-cfd5887d4350\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 9ebc05d1-84b3-483c-a927-cfd5887d4350\n", + "2025-09-28 23:58:52,143 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-28 23:58:55,237 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-29 00:01:15,665 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "17abb4ad030a4b4cbd75000806a24477", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "96cc7ff13545a21a4188e7525959c6d6.zip: 0%| | 0.00/4.48M [00:00 era5land/skin_temperature/2001/reanalysis-era5-land_skin_temperature_2001-04.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:01:19,124 INFO Request ID is bc89aad2-76ce-427c-abb7-27e5c88c5f6a\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is bc89aad2-76ce-427c-abb7-27e5c88c5f6a\n", + "2025-09-29 00:01:19,309 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:03:10,846 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6dfb4f22a7254896af7c6dc09cbecf51", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "f0db92a18f18decffdd7c483b7d6a767.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:03:14,578 INFO Request ID is d87eab6e-ab6d-483b-8fc7-534640787380\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is d87eab6e-ab6d-483b-8fc7-534640787380\n", + "2025-09-29 00:03:14,759 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:04:12,974 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-29 00:05:09,880 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ac9884e6d6084907b4354c33eed1561d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "fe2dc6640af45c186b9234e35d9d7efc.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-08.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:05:13,320 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n", + "2025-09-29 00:05:13,402 INFO Request ID is d563b10f-a19c-45c4-96b5-67c269d37179\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is d563b10f-a19c-45c4-96b5-67c269d37179\n", + "2025-09-29 00:05:13,750 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "18f97f0d55114678bc172a826eaff078", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "35a17f562bf576c581703db09e815cb1.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:05:16,953 INFO Request ID is 6951d6d4-11c0-41ca-92a5-43abaee4747d\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 6951d6d4-11c0-41ca-92a5-43abaee4747d\n", + "2025-09-29 00:05:17,118 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:05:40,243 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "21b9e5d2c37f4a4babbeaf968140422d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "79388c195006cdb1837cf8ef694d00dc.zip: 0%| | 0.00/4.34M [00:00 era5land/skin_temperature/2001/reanalysis-era5-land_skin_temperature_2001-05.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:05:44,076 INFO Request ID is 91900306-69eb-44e9-85c6-8e2dec2b9d96\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 91900306-69eb-44e9-85c6-8e2dec2b9d96\n", + "2025-09-29 00:05:44,253 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:25:40,142 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8d343342a2e743f5af38f8defb49c1a7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "66c01a2468beb17b9872dc6188b88c62.zip: 0%| | 0.00/4.51M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-09.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:25:43,599 INFO Request ID is 4cd8b4a5-21dd-4184-a049-5b5d03735dd1\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 4cd8b4a5-21dd-4184-a049-5b5d03735dd1\n", + "2025-09-29 00:25:43,761 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO][2m_dewpoint_temperature] Downloading 2001-12 -> era5land/2m_dewpoint_temperature/2001/reanalysis-era5-land_2m_dewpoint_temperature_2001-12.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:25:45,050 INFO Request ID is 383cf503-521d-493f-9a3e-d60db7fe6de9\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 383cf503-521d-493f-9a3e-d60db7fe6de9\n", + "2025-09-29 00:25:45,506 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:26:10,736 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-29 00:28:11,488 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "78bcf01dd53b4b498e39b303ecd4b035", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "4b09bb23c2b2380fc71784f75bf8c00f.zip: 0%| | 0.00/4.50M [00:00 era5land/skin_temperature/2001/reanalysis-era5-land_skin_temperature_2001-06.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:28:15,271 INFO Request ID is 6778242d-d6da-4462-aaad-131d6ec7ad18\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 6778242d-d6da-4462-aaad-131d6ec7ad18\n", + "2025-09-29 00:28:15,453 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:28:37,455 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3ea450c4db28413a8d319c54c3bcd4dc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "b42077676c34d78a44885e93cc219032.zip: 0%| | 0.00/4.36M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-10.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:28:40,797 INFO Request ID is 26dc3cdc-dd2c-45be-9cea-223285891e25\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 26dc3cdc-dd2c-45be-9cea-223285891e25\n", + "2025-09-29 00:28:40,960 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO][2m_dewpoint_temperature] Downloading 2002-01 -> era5land/2m_dewpoint_temperature/2002/reanalysis-era5-land_2m_dewpoint_temperature_2002-01.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:28:42,356 INFO Request ID is 5ecf7a3b-5ff2-4a17-ac00-f3761a2ce33c\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 5ecf7a3b-5ff2-4a17-ac00-f3761a2ce33c\n", + "2025-09-29 00:28:42,533 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:28:49,170 INFO status has been updated to running\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to running\n", + "2025-09-29 00:30:37,626 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "015425e0f9d74f47b640aaf80dc3ac56", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "129b37c2aa11c9eb4320af6c6598a740.zip: 0%| | 0.00/4.47M [00:00 era5land/2m_dewpoint_temperature/2002/reanalysis-era5-land_2m_dewpoint_temperature_2002-02.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:30:41,147 INFO Request ID is 758d96c7-4b0f-44a1-9299-0bafde246281\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is 758d96c7-4b0f-44a1-9299-0bafde246281\n", + "2025-09-29 00:30:41,309 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:31:09,150 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cce8a0f4f2f84ca9827e6b131da339b6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ad1a2826c27c0ddf5f35df12dd847597.zip: 0%| | 0.00/4.36M [00:00 era5land/skin_temperature/2001/reanalysis-era5-land_skin_temperature_2001-07.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:31:12,751 INFO Request ID is eb7692d8-c750-4a53-8825-25ae3938ff21\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is eb7692d8-c750-4a53-8825-25ae3938ff21\n", + "2025-09-29 00:31:12,924 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n", + "2025-09-29 00:31:34,374 INFO status has been updated to successful\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to successful\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c6b44ef3857d4e39961e6e85aa6545f9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "858b87938d166e82590ce0d1878b337b.zip: 0%| | 0.00/4.50M [00:00 era5land/2m_temperature/2001/reanalysis-era5-land_2m_temperature_2001-11.grib.zip\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-09-29 00:31:38,052 INFO Request ID is bcdef6ff-573f-4368-bf81-4abeb26f8972\n", + "INFO:ecmwf.datastores.legacy_client:Request ID is bcdef6ff-573f-4368-bf81-4abeb26f8972\n", + "2025-09-29 00:31:38,241 INFO status has been updated to accepted\n", + "INFO:ecmwf.datastores.legacy_client:status has been updated to accepted\n" + ] + } + ], + "source": [ + "# download_era5land_chunked_full_parallel_by_var.py —— 在你的基础上:按“变量”并发\n", + "# -*- coding: utf-8 -*-\n", + "import argparse\n", + "import time\n", + "import random\n", + "from pathlib import Path\n", + "from typing import List, Tuple\n", + "import sys\n", + "from concurrent.futures import ThreadPoolExecutor, as_completed\n", + "\n", + "import cdsapi\n", + "\n", + "DATASET = \"reanalysis-era5-land\"\n", + "\n", + "# ---------- 时间维度 ----------\n", + "ALL_DAYS: List[str] = [f\"{d:02d}\" for d in range(1, 32)]\n", + "ALL_HOURS: List[str] = [f\"{h:02d}:00\" for h in range(0, 24)]\n", + "ALL_MONTHS: List[str] = [f\"{m:02d}\" for m in range(1, 13)]\n", + "\n", + "# ---------- 重试设置 ----------\n", + "MAX_RETRIES = 8\n", + "BASE_SLEEP = 10 # seconds\n", + "\n", + "# ---------- 变量全集(你的清单 + 注释项全部纳入) ----------\n", + "VARIABLES: List[str] = [\n", + " # 2m/skin/soil/lake temps\n", + " \"2m_dewpoint_temperature\",\n", + " \"2m_temperature\",\n", + " \"skin_temperature\",\n", + " \"soil_temperature_level_1\",\n", + " \"soil_temperature_level_2\",\n", + " \"soil_temperature_level_3\",\n", + " \"soil_temperature_level_4\",\n", + " \"lake_bottom_temperature\",\n", + " \"lake_ice_depth\",\n", + " \"lake_ice_temperature\",\n", + " \"lake_mix_layer_depth\",\n", + " \"lake_mix_layer_temperature\",\n", + " \"lake_shape_factor\",\n", + " # 你原注释掉的项(已启用)\n", + " \"lake_total_layer_temperature\",\n", + " \"snow_albedo\",\n", + " \"snow_cover\",\n", + " \"snow_density\",\n", + " \"snow_depth\",\n", + " \"snow_depth_water_equivalent\",\n", + " \"snowfall\",\n", + " \"snowmelt\",\n", + " \"temperature_of_snow_layer\",\n", + " \"forecast_albedo\",\n", + " \"surface_latent_heat_flux\",\n", + " \"surface_net_solar_radiation\",\n", + " \"surface_net_thermal_radiation\",\n", + " \"surface_sensible_heat_flux\",\n", + " \"surface_solar_radiation_downwards\",\n", + " \"surface_thermal_radiation_downwards\",\n", + " \"evaporation_from_bare_soil\",\n", + " \"evaporation_from_open_water_surfaces_excluding_oceans\",\n", + " \"evaporation_from_the_top_of_canopy\",\n", + " \"evaporation_from_vegetation_transpiration\",\n", + " \"potential_evaporation\",\n", + " \"runoff\",\n", + " \"snow_evaporation\",\n", + " \"sub_surface_runoff\",\n", + " \"surface_runoff\",\n", + " \"total_evaporation\",\n", + " \"10m_u_component_of_wind\",\n", + " \"10m_v_component_of_wind\",\n", + " \"surface_pressure\",\n", + " \"total_precipitation\",\n", + " \"leaf_area_index_high_vegetation\",\n", + " \"leaf_area_index_low_vegetation\",\n", + " \"high_vegetation_cover\",\n", + " \"glacier_mask\",\n", + " \"lake_cover\",\n", + " \"low_vegetation_cover\",\n", + " \"lake_total_depth\",\n", + " \"land_sea_mask\",\n", + " \"soil_type\",\n", + " \"type_of_high_vegetation\",\n", + " \"type_of_low_vegetation\",\n", + "]\n", + "\n", + "def build_request(\n", + " variable: str,\n", + " year: str,\n", + " month: str,\n", + " area_box: Tuple[float, float, float, float],\n", + " fmt: str,\n", + ") -> dict:\n", + " north, west, south, east = area_box\n", + " req = {\n", + " \"variable\": variable,\n", + " \"year\": year,\n", + " \"month\": month,\n", + " \"day\": ALL_DAYS,\n", + " \"time\": ALL_HOURS,\n", + " \"area\": [north, west, south, east], # N W S E\n", + " \"format\": fmt, # \"grib\" | \"netcdf\"\n", + " \"download_format\": \"zip\",\n", + " # \"product_type\": \"reanalysis\",\n", + " }\n", + " return req\n", + "\n", + "def safe_retrieve(client: cdsapi.Client, dataset: str, request: dict, target_path: Path):\n", + " \"\"\"下载单个分块(含指数退避 + 轻度抖动),返回 True/False\"\"\"\n", + " # 轻度抖动,降低“羊群效应”\n", + " time.sleep(random.uniform(0.3, 1.0))\n", + " attempt = 0\n", + " while True:\n", + " try:\n", + " client.retrieve(dataset, request).download(str(target_path))\n", + " return True\n", + " except Exception as e:\n", + " attempt += 1\n", + " msg = str(e).lower()\n", + " # 明确不可恢复的错误(变量无效/不可用/无数据)直接跳过\n", + " unrecoverable_signals = [\n", + " \"unavailable\",\n", + " \"not available\",\n", + " \"invalid\",\n", + " \"does not match\",\n", + " \"no data\",\n", + " \"bad request\",\n", + " \"cannot be found\",\n", + " ]\n", + " if any(s in msg for s in unrecoverable_signals):\n", + " print(f\"[ERROR] Unrecoverable for {target_path.name}: {e}\")\n", + " return False\n", + "\n", + " if attempt > MAX_RETRIES:\n", + " print(f\"[ERROR] Max retries exceeded for {target_path.name}: {e}\")\n", + " return False\n", + "\n", + " sleep_s = BASE_SLEEP * (2 ** (attempt - 1)) * random.uniform(0.85, 1.15)\n", + " print(f\"[WARN] Download failed (attempt {attempt}/{MAX_RETRIES}): {e}\")\n", + " print(f\" Sleeping {sleep_s:.0f}s then retrying...\")\n", + " time.sleep(sleep_s)\n", + "\n", + "def parse_args_with_defaults():\n", + " parser = argparse.ArgumentParser(\n", + " description=\"ERA5-Land downloader (split by variable × year × month), parallel by VARIABLE\"\n", + " )\n", + " # —— 给出默认值,不再强制要求 —— #\n", + " parser.add_argument(\"--out_dir\", type=str, default=\"./era5land\",\n", + " help=\"输出根目录(默认 ./era5land)\")\n", + " parser.add_argument(\"--bbox\", nargs=4, type=float,\n", + " default=[60.86, -6.23, 49.86, 1.75],\n", + " metavar=(\"NORTH\", \"WEST\", \"SOUTH\", \"EAST\"),\n", + " help=\"经纬度范围:N W S E(默认 60.86 -6.23 49.86 1.75)\")\n", + " parser.add_argument(\"--format\", default=\"grib\", choices=[\"grib\", \"netcdf\"],\n", + " help=\"文件格式(默认 grib)\")\n", + " parser.add_argument(\"--years\", nargs=\"+\",\n", + " default=[str(y) for y in range(1997, 2023)], # 1997–2022\n", + " help=\"年份列表(默认 1997..2022)\")\n", + " parser.add_argument(\"--months\", nargs=\"+\", default=ALL_MONTHS,\n", + " help=\"月份列表(默认 01..12)\")\n", + " parser.add_argument(\"--variables\", nargs=\"+\", default=VARIABLES,\n", + " help=\"变量名列表(默认为脚本内置全集)\")\n", + " parser.add_argument(\"--skip_existing\", action=\"store_true\",\n", + " help=\"若目标文件已存在则跳过\")\n", + " parser.add_argument(\"--max_workers\", type=int, default=3,\n", + " help=\"并发的变量数(建议 2–3)\")\n", + " # 如果在 Notebook 中直接运行,且没有传任何参数,也能用默认值\n", + " try:\n", + " return parser.parse_args([])\n", + " except SystemExit:\n", + " # 在某些环境 parse_args([]) 会触发 SystemExit,退回到标准方式\n", + " return parser.parse_args()\n", + "\n", + "def download_one_variable(var: str, args) -> tuple[str, int, int]:\n", + " \"\"\"在一个线程内:顺序下载某个变量的所有 年×月,返回 (var, ok, fail)\"\"\"\n", + " client = cdsapi.Client() # 每个线程各自的 client\n", + " ok = 0\n", + " fail = 0\n", + "\n", + " out_root = Path(args.out_dir)\n", + "\n", + " for year in args.years:\n", + " for month in args.months:\n", + " subdir = out_root / var / str(year)\n", + " subdir.mkdir(parents=True, exist_ok=True)\n", + "\n", + " suffix = \"grib\" if args.format == \"grib\" else \"nc\"\n", + " target_name = f\"{DATASET}_{var}_{year}-{month}.{suffix}.zip\"\n", + " target_path = subdir / target_name\n", + "\n", + " if args.skip_existing and target_path.exists():\n", + " # 已存在直接视为成功,便于断点续跑\n", + " # 你也可以换成校验 zip 完整性的逻辑\n", + " continue_ok = True\n", + " if continue_ok:\n", + " ok += 1\n", + " continue\n", + "\n", + " req = build_request(\n", + " variable=var,\n", + " year=str(year),\n", + " month=f\"{int(month):02d}\",\n", + " area_box=tuple(args.bbox),\n", + " fmt=args.format,\n", + " )\n", + "\n", + " print(f\"[INFO][{var}] Downloading {year}-{month} -> {target_path}\")\n", + " success = safe_retrieve(client, DATASET, req, target_path)\n", + " if success:\n", + " ok += 1\n", + " else:\n", + " fail += 1\n", + "\n", + " return var, ok, fail\n", + "\n", + "def main():\n", + " # 在 Notebook/Colab 里,这里会采用默认值;命令行下可用参数覆盖\n", + " if \"ipykernel\" in sys.modules or \"google.colab\" in sys.modules:\n", + " args = parse_args_with_defaults()\n", + " else:\n", + " args = parse_args_with_defaults()\n", + "\n", + " variables = list(args.variables)\n", + " if not variables:\n", + " print(\"[WARN] 未提供变量列表,使用内置 VARIABLES。\")\n", + " variables = VARIABLES\n", + "\n", + " # 并发数量不超过变量数\n", + " max_workers = max(1, min(args.max_workers, len(variables)))\n", + "\n", + " print(f\"[INFO] Variables: {len(variables)} | Years: {len(args.years)} | Months: {len(args.months)}\")\n", + " print(f\"[INFO] Parallel by VARIABLE with max_workers = {max_workers}\")\n", + " start = time.time()\n", + "\n", + " total_ok = 0\n", + " total_fail = 0\n", + " results = []\n", + "\n", + " with ThreadPoolExecutor(max_workers=max_workers) as ex:\n", + " futures = {ex.submit(download_one_variable, var, args): var for var in variables}\n", + " for fut in as_completed(futures):\n", + " var, ok, fail = fut.result()\n", + " results.append((var, ok, fail))\n", + " total_ok += ok\n", + " total_fail += fail\n", + " print(f\"[DONE][{var}] Ok={ok}, Fail={fail}\")\n", + "\n", + " elapsed = time.time() - start\n", + " print(\"\\n================ SUMMARY ================\")\n", + " for var, ok, fail in sorted(results):\n", + " print(f\"{var:40s} Ok={ok:4d} Fail={fail:3d}\")\n", + " print(f\"-----------------------------------------\")\n", + " print(f\"TOTAL Ok={total_ok} Fail={total_fail} | Elapsed: {elapsed/60:.1f} min\")\n", + " print(\"=========================================\\n\")\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()\n" + ] + } + ] +} \ No newline at end of file diff --git a/jointContribution/AI_Climate_disease/XGBoost_imputer.ipynb b/jointContribution/AI_Climate_disease/XGBoost_imputer.ipynb new file mode 100644 index 000000000..3a120a060 --- /dev/null +++ b/jointContribution/AI_Climate_disease/XGBoost_imputer.ipynb @@ -0,0 +1,523 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rlAsSGECAmNA", + "outputId": "a53661ba-37e7-4cc9-e98e-c60ffeb041a8" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[OK] Ownsend_Deprivation_Index: {'column': 'Ownsend_Deprivation_Index', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=3.03671', 'metric_secondary': 'r2=0.6825', 'fallback': 'none'}\n", + "[OK] Number_of_Self-Reported_Cancers: {'column': 'Number_of_Self-Reported_Cancers', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01536', 'metric_secondary': 'r2=0.8008', 'fallback': 'none'}\n", + "[OK] Operations: {'column': 'Operations', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=1.65087', 'metric_secondary': 'r2=0.3075', 'fallback': 'none'}\n", + "[OK] Number_of_Treatments/Medications: {'column': 'Number_of_Treatments/Medications', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=2.40922', 'metric_secondary': 'r2=0.6692', 'fallback': 'none'}\n", + "[OK] Number_of_Self-Reported_Non-Cancer_Illnesses: {'column': 'Number_of_Self-Reported_Non-Cancer_Illnesses', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=1.53121', 'metric_secondary': 'r2=0.5638', 'fallback': 'none'}\n", + "[OK] Aidememoire_Completed: {'column': 'Aidememoire_Completed', 'type': 'regression', 'trained': False, 'metric_primary': 'mse=0.15893', 'metric_secondary': 'r2=0.0430', 'fallback': 'median'}\n", + "[OK] Sexual_History: {'column': 'Sexual_History', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.05077', 'metric_secondary': 'r2=0.4014', 'fallback': 'none'}\n", + "[OK] Added_Salt: {'column': 'Added_Salt', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.22884', 'metric_secondary': 'r2=0.0754', 'fallback': 'none'}\n", + "[OK] Handedness: {'column': 'Handedness', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.09320', 'metric_secondary': 'r2=0.0545', 'fallback': 'none'}\n", + "[OK] Current_Tobacco_Smoking: {'column': 'Current_Tobacco_Smoking', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00001', 'metric_secondary': 'r2=0.9999', 'fallback': 'none'}\n", + "[OK] Accommodation_Type: {'column': 'Accommodation_Type', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.05787', 'metric_secondary': 'r2=0.4082', 'fallback': 'none'}\n", + "[OK] Alcohol_Intake_Frequency: {'column': 'Alcohol_Intake_Frequency', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00034', 'metric_secondary': 'r2=0.9956', 'fallback': 'none'}\n", + "[OK] Milk_Type: {'column': 'Milk_Type', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.19374', 'metric_secondary': 'r2=0.1529', 'fallback': 'none'}\n", + "[OK] Insomnia: {'column': 'Insomnia', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.15658', 'metric_secondary': 'r2=0.1454', 'fallback': 'none'}\n", + "[OK] Glasses_Wear: {'column': 'Glasses_Wear', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.08702', 'metric_secondary': 'r2=0.1445', 'fallback': 'none'}\n", + "[OK] Alcohol_Status: {'column': 'Alcohol_Status', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00001', 'metric_secondary': 'r2=0.9999', 'fallback': 'none'}\n", + "[OK] Pacemaker: {'column': 'Pacemaker', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00194', 'metric_secondary': 'r2=0.3678', 'fallback': 'none'}\n", + "[OK] Computer_Gaming: {'column': 'Computer_Gaming', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.14589', 'metric_secondary': 'r2=0.1162', 'fallback': 'none'}\n", + "[OK] Birth_Country: {'column': 'Birth_Country', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.08208', 'metric_secondary': 'r2=0.5226', 'fallback': 'none'}\n", + "[OK] Day_Napping: {'column': 'Day_Napping', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.20236', 'metric_secondary': 'r2=0.1787', 'fallback': 'none'}\n", + "[OK] Hair_Color: {'column': 'Hair_Color', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.22422', 'metric_secondary': 'r2=0.0561', 'fallback': 'none'}\n", + "[OK] Poultry: {'column': 'Poultry', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01650', 'metric_secondary': 'r2=0.6699', 'fallback': 'none'}\n", + "[OK] Waist_Circumference: {'column': 'Waist_Circumference', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=21.89398', 'metric_secondary': 'r2=0.8808', 'fallback': 'none'}\n", + "[OK] Tea: {'column': 'Tea', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=6.09476', 'metric_secondary': 'r2=0.2554', 'fallback': 'none'}\n", + "[OK] Hip_Circumference: {'column': 'Hip_Circumference', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=13.19761', 'metric_secondary': 'r2=0.8465', 'fallback': 'none'}\n", + "[OK] Processed_Meat_Intake: {'column': 'Processed_Meat_Intake', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.04308', 'metric_secondary': 'r2=0.5001', 'fallback': 'none'}\n", + "[OK] Coffee: {'column': 'Coffee', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=3.11790', 'metric_secondary': 'r2=0.2826', 'fallback': 'none'}\n", + "[OK] Diet_Change: {'column': 'Diet_Change', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.20395', 'metric_secondary': 'r2=0.1449', 'fallback': 'none'}\n", + "[OK] Adopted: {'column': 'Adopted', 'type': 'regression', 'trained': False, 'metric_primary': 'mse=0.01467', 'metric_secondary': 'r2=-0.0032', 'fallback': 'median'}\n", + "[OK] Standing_Height: {'column': 'Standing_Height', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.92470', 'metric_secondary': 'r2=0.9892', 'fallback': 'none'}\n", + "[OK] Diabetes_Diagnosis: {'column': 'Diabetes_Diagnosis', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01807', 'metric_secondary': 'r2=0.6474', 'fallback': 'none'}\n", + "[OK] Eye_Problems: {'column': 'Eye_Problems', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11966', 'metric_secondary': 'r2=0.0556', 'fallback': 'none'}\n", + "[OK] Falls: {'column': 'Falls', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.14412', 'metric_secondary': 'r2=0.0938', 'fallback': 'none'}\n", + "[OK] Current_Residence_Duration: {'column': 'Current_Residence_Duration', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=111.30535', 'metric_secondary': 'r2=0.2432', 'fallback': 'none'}\n", + "[OK] Cancer_Diagnosis: {'column': 'Cancer_Diagnosis', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01289', 'metric_secondary': 'r2=0.8208', 'fallback': 'none'}\n", + "[OK] Weight: {'column': 'Weight', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.38324', 'metric_secondary': 'r2=0.9985', 'fallback': 'none'}\n", + "[OK] Ethnicity: {'column': 'Ethnicity', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.05108', 'metric_secondary': 'r2=0.4994', 'fallback': 'none'}\n", + "[OK] Smoked: {'column': 'Smoked', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.19598', 'metric_secondary': 'r2=0.1850', 'fallback': 'none'}\n", + "[OK] Smoking_Status: {'column': 'Smoking_Status', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00003', 'metric_secondary': 'r2=0.9996', 'fallback': 'none'}\n", + "[OK] Other_Prescription_Medications: {'column': 'Other_Prescription_Medications', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11891', 'metric_secondary': 'r2=0.5227', 'fallback': 'none'}\n", + "[OK] BMI: {'column': 'BMI', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.06996', 'metric_secondary': 'r2=0.9969', 'fallback': 'none'}\n", + "[OK] Cereal: {'column': 'Cereal', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=6.16983', 'metric_secondary': 'r2=0.2266', 'fallback': 'none'}\n", + "[OK] Fresh_Fruit: {'column': 'Fresh_Fruit', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=2.10727', 'metric_secondary': 'r2=0.2082', 'fallback': 'none'}\n", + "[OK] Hand_Grip_Strength_(Right): {'column': 'Hand_Grip_Strength_(Right)', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=20.45542', 'metric_secondary': 'r2=0.8401', 'fallback': 'none'}\n", + "[OK] Beef_Intake: {'column': 'Beef_Intake', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.04843', 'metric_secondary': 'r2=0.5084', 'fallback': 'none'}\n", + "[OK] Hand_Grip_Strength_(Left): {'column': 'Hand_Grip_Strength_(Left)', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=20.41612', 'metric_secondary': 'r2=0.8406', 'fallback': 'none'}\n", + "[OK] Overall_Health_Rating: {'column': 'Overall_Health_Rating', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.02892', 'metric_secondary': 'r2=0.3373', 'fallback': 'none'}\n", + "[OK] Psychiatrist_Visits: {'column': 'Psychiatrist_Visits', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.07183', 'metric_secondary': 'r2=0.2951', 'fallback': 'none'}\n", + "[OK] Non_Oily_Fish: {'column': 'Non_Oily_Fish', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.02499', 'metric_secondary': 'r2=0.4516', 'fallback': 'none'}\n", + "[OK] Fractures: {'column': 'Fractures', 'type': 'regression', 'trained': False, 'metric_primary': 'mse=0.08456', 'metric_secondary': 'r2=0.0343', 'fallback': 'median'}\n", + "[OK] Daytime_Dozing: {'column': 'Daytime_Dozing', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.15195', 'metric_secondary': 'r2=0.1684', 'fallback': 'none'}\n", + "[OK] Spirometry_Contraindications: {'column': 'Spirometry_Contraindications', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00493', 'metric_secondary': 'r2=0.9302', 'fallback': 'none'}\n", + "[OK] Oily_Fish: {'column': 'Oily_Fish', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.06648', 'metric_secondary': 'r2=0.3064', 'fallback': 'none'}\n", + "[OK] Sleep_Duration: {'column': 'Sleep_Duration', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=1.14679', 'metric_secondary': 'r2=0.0885', 'fallback': 'none'}\n", + "[OK] Pork: {'column': 'Pork', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.08622', 'metric_secondary': 'r2=0.4008', 'fallback': 'none'}\n", + "[OK] Lamb_Mutton: {'column': 'Lamb_Mutton', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.09012', 'metric_secondary': 'r2=0.3838', 'fallback': 'none'}\n", + "[OK] Incorrect_Matches: {'column': 'Incorrect_Matches', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=3.19447', 'metric_secondary': 'r2=0.1079', 'fallback': 'none'}\n", + "[OK] Willingness_for_Cognitive_Tests: {'column': 'Willingness_for_Cognitive_Tests', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00715', 'metric_secondary': 'r2=0.6377', 'fallback': 'none'}\n", + "[OK] Water_Intake: {'column': 'Water_Intake', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=4.02436', 'metric_secondary': 'r2=0.2531', 'fallback': 'none'}\n", + "[OK] Water_300m: {'column': 'Water_300m', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=82.21683', 'metric_secondary': 'r2=0.8698', 'fallback': 'none'}\n", + "[OK] Natural_Environment_(1000m_Buffer): {'column': 'Natural_Environment_(1000m_Buffer)', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=20.10810', 'metric_secondary': 'r2=0.9693', 'fallback': 'none'}\n", + "[OK] Natural_Environment_300m: {'column': 'Natural_Environment_300m', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=24.21351', 'metric_secondary': 'r2=0.9687', 'fallback': 'none'}\n", + "[OK] GP_Visits_for_Mental_Health: {'column': 'GP_Visits_for_Mental_Health', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.13707', 'metric_secondary': 'r2=0.3873', 'fallback': 'none'}\n", + "[OK] Home_Area_Population_Density: {'column': 'Home_Area_Population_Density', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01900', 'metric_secondary': 'r2=0.8828', 'fallback': 'none'}\n", + "[OK] TV_Time: {'column': 'TV_Time', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=2.19738', 'metric_secondary': 'r2=0.2620', 'fallback': 'none'}\n", + "[OK] Disability/Mobility_Allowance: {'column': 'Disability/Mobility_Allowance', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.03385', 'metric_secondary': 'r2=0.4068', 'fallback': 'none'}\n", + "[OK] Wake_Up_Ease: {'column': 'Wake_Up_Ease', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.03346', 'metric_secondary': 'r2=0.1082', 'fallback': 'none'}\n", + "[OK] Spread_Type: {'column': 'Spread_Type', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.08664', 'metric_secondary': 'r2=0.1012', 'fallback': 'none'}\n", + "[OK] Match_Identification_Time: {'column': 'Match_Identification_Time', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=11765.66602', 'metric_secondary': 'r2=0.1531', 'fallback': 'none'}\n", + "[OK] UV_Protection: {'column': 'UV_Protection', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.07551', 'metric_secondary': 'r2=0.1674', 'fallback': 'none'}\n", + "[OK] Seated_Height: {'column': 'Seated_Height', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=9.22653', 'metric_secondary': 'r2=0.8201', 'fallback': 'none'}\n", + "[OK] Seating_Box_Height: {'column': 'Seating_Box_Height', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00028', 'metric_secondary': 'r2=0.8925', 'fallback': 'none'}\n", + "[OK] Sitting_Height: {'column': 'Sitting_Height', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=1.85534', 'metric_secondary': 'r2=0.9227', 'fallback': 'none'}\n", + "[OK] Hot_Drink_Temperature: {'column': 'Hot_Drink_Temperature', 'type': 'regression', 'trained': False, 'metric_primary': 'mse=0.12885', 'metric_secondary': 'r2=0.0284', 'fallback': 'median'}\n", + "[OK] Chest_Pain_Discomfort: {'column': 'Chest_Pain_Discomfort', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11280', 'metric_secondary': 'r2=0.1704', 'fallback': 'none'}\n", + "[OK] Dried_Fruit: {'column': 'Dried_Fruit', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=2.92822', 'metric_secondary': 'r2=0.0881', 'fallback': 'none'}\n", + "[OK] Diet_Variation: {'column': 'Diet_Variation', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.20759', 'metric_secondary': 'r2=0.0766', 'fallback': 'none'}\n", + "[OK] Major_Road_Traffic: {'column': 'Major_Road_Traffic', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00004', 'metric_secondary': 'r2=0.8855', 'fallback': 'none'}\n", + "[OK] Nearest_Road_Distance: {'column': 'Nearest_Road_Distance', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=49187815.57922', 'metric_secondary': 'r2=0.8913', 'fallback': 'none'}\n", + "[OK] PM10_Air_2007: {'column': 'PM10_Air_2007', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00837', 'metric_secondary': 'r2=0.9996', 'fallback': 'none'}\n", + "[OK] Nearest_Road_Traffic: {'column': 'Nearest_Road_Traffic', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00144', 'metric_secondary': 'r2=0.7221', 'fallback': 'none'}\n", + "[OK] NO2_Air_Pollution_(2005): {'column': 'NO2_Air_Pollution_(2005)', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.45550', 'metric_secondary': 'r2=0.9955', 'fallback': 'none'}\n", + "[OK] NO2_Air_Pollution_(2006): {'column': 'NO2_Air_Pollution_(2006)', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.37226', 'metric_secondary': 'r2=0.9956', 'fallback': 'none'}\n", + "[OK] PM2.5_to_10_Air_2010: {'column': 'PM2.5_to_10_Air_2010', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=4921075.06406', 'metric_secondary': 'r2=0.7997', 'fallback': 'none'}\n", + "[OK] Major_Road_Distance: {'column': 'Major_Road_Distance', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=89375062275.11403', 'metric_secondary': 'r2=0.9296', 'fallback': 'none'}\n", + "[OK] NO2_Air_Pollution_(2010): {'column': 'NO2_Air_Pollution_(2010)', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.68771', 'metric_secondary': 'r2=0.9879', 'fallback': 'none'}\n", + "[OK] Road_Traffic_Load: {'column': 'Road_Traffic_Load', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=558.05541', 'metric_secondary': 'r2=0.9083', 'fallback': 'none'}\n", + "[OK] Trunk_Fat_Percentage: {'column': 'Trunk_Fat_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=11.20265', 'metric_secondary': 'r2=0.9531', 'fallback': 'none'}\n", + "[OK] Evening_Noise_Level: {'column': 'Evening_Noise_Level', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00841', 'metric_secondary': 'r2=0.9996', 'fallback': 'none'}\n", + "[OK] Nighttime_Noise_Level: {'column': 'Nighttime_Noise_Level', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00860', 'metric_secondary': 'r2=0.9995', 'fallback': 'none'}\n", + "[OK] Proximity_to_Major_Road: {'column': 'Proximity_to_Major_Road', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00491', 'metric_secondary': 'r2=0.9277', 'fallback': 'none'}\n", + "[OK] Hour-16_Noise_Level: {'column': 'Hour-16_Noise_Level', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00856', 'metric_secondary': 'r2=0.9995', 'fallback': 'none'}\n", + "[OK] Daytime_Noise_Level: {'column': 'Daytime_Noise_Level', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00831', 'metric_secondary': 'r2=0.9996', 'fallback': 'none'}\n", + "[OK] Road_Length: {'column': 'Road_Length', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.47892', 'metric_secondary': 'r2=0.9958', 'fallback': 'none'}\n", + "[OK] Cooked_Vegetables: {'column': 'Cooked_Vegetables', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=3.27094', 'metric_secondary': 'r2=0.1751', 'fallback': 'none'}\n", + "[OK] Salad_Intake: {'column': 'Salad_Intake', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=3.73412', 'metric_secondary': 'r2=0.2083', 'fallback': 'none'}\n", + "[OK] Social_Visits: {'column': 'Social_Visits', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01657', 'metric_secondary': 'r2=0.0511', 'fallback': 'none'}\n", + "[OK] Recent_Stress_Events: {'column': 'Recent_Stress_Events', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.22579', 'metric_secondary': 'r2=0.0891', 'fallback': 'none'}\n", + "[OK] Phone_Use_Duration: {'column': 'Phone_Use_Duration', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11437', 'metric_secondary': 'r2=0.1156', 'fallback': 'none'}\n", + "[OK] Skin_Color: {'column': 'Skin_Color', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.19061', 'metric_secondary': 'r2=0.1207', 'fallback': 'none'}\n", + "[OK] NO2_Air_2007: {'column': 'NO2_Air_2007', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.47331', 'metric_secondary': 'r2=0.9427', 'fallback': 'none'}\n", + "[OK] Computer_Time: {'column': 'Computer_Time', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=1.83010', 'metric_secondary': 'r2=0.1338', 'fallback': 'none'}\n", + "[OK] Bowel_Screening: {'column': 'Bowel_Screening', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.17538', 'metric_secondary': 'r2=0.1949', 'fallback': 'none'}\n", + "[OK] Weight_Change_(1_Year): {'column': 'Weight_Change_(1_Year)', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.21421', 'metric_secondary': 'r2=0.1316', 'fallback': 'none'}\n", + "[OK] Loneliness/Isolation: {'column': 'Loneliness/Isolation', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.10941', 'metric_secondary': 'r2=0.2875', 'fallback': 'none'}\n", + "[OK] Driving_Time: {'column': 'Driving_Time', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=1.24548', 'metric_secondary': 'r2=0.2583', 'fallback': 'none'}\n", + "[OK] Whole_Body_Water_Mass: {'column': 'Whole_Body_Water_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.02345', 'metric_secondary': 'r2=0.9997', 'fallback': 'none'}\n", + "[OK] Basal_Metabolic_Rate: {'column': 'Basal_Metabolic_Rate', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=469.91901', 'metric_secondary': 'r2=0.9997', 'fallback': 'none'}\n", + "[OK] Right_Leg_Impedance: {'column': 'Right_Leg_Impedance', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=21.39709', 'metric_secondary': 'r2=0.9839', 'fallback': 'none'}\n", + "[OK] Left_Leg_Impedance: {'column': 'Left_Leg_Impedance', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=18.76451', 'metric_secondary': 'r2=0.9853', 'fallback': 'none'}\n", + "[OK] Whole_Body_Fat-Free_Mass: {'column': 'Whole_Body_Fat-Free_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.02022', 'metric_secondary': 'r2=0.9998', 'fallback': 'none'}\n", + "[OK] Right_Leg_Fat_Percentage: {'column': 'Right_Leg_Fat_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.07534', 'metric_secondary': 'r2=0.9993', 'fallback': 'none'}\n", + "[OK] Left_Arm_Impedance: {'column': 'Left_Arm_Impedance', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=30.00962', 'metric_secondary': 'r2=0.9907', 'fallback': 'none'}\n", + "[OK] Right_Leg_Fat_Mass: {'column': 'Right_Leg_Fat_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00680', 'metric_secondary': 'r2=0.9981', 'fallback': 'none'}\n", + "[OK] Right_Leg_Fat_Free_Mass: {'column': 'Right_Leg_Fat_Free_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00192', 'metric_secondary': 'r2=0.9995', 'fallback': 'none'}\n", + "[OK] Right_Leg_Predicted_Mass: {'column': 'Right_Leg_Predicted_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00188', 'metric_secondary': 'r2=0.9995', 'fallback': 'none'}\n", + "[OK] Whole_Body_Impedance: {'column': 'Whole_Body_Impedance', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=157.82494', 'metric_secondary': 'r2=0.9803', 'fallback': 'none'}\n", + "[OK] Left_Leg_Fat_Percentage: {'column': 'Left_Leg_Fat_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.07565', 'metric_secondary': 'r2=0.9993', 'fallback': 'none'}\n", + "[OK] Right_Arm_Impedance: {'column': 'Right_Arm_Impedance', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=85.94955', 'metric_secondary': 'r2=0.9723', 'fallback': 'none'}\n", + "[OK] Left_Leg_Fat_Mass: {'column': 'Left_Leg_Fat_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00534', 'metric_secondary': 'r2=0.9985', 'fallback': 'none'}\n", + "[OK] Left_Leg_Fat-Free_Mass: {'column': 'Left_Leg_Fat-Free_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00176', 'metric_secondary': 'r2=0.9996', 'fallback': 'none'}\n", + "[OK] Left_Leg_Predicted_Mass: {'column': 'Left_Leg_Predicted_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00150', 'metric_secondary': 'r2=0.9996', 'fallback': 'none'}\n", + "[OK] Right_Arm_Fat_Percentage: {'column': 'Right_Arm_Fat_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.16739', 'metric_secondary': 'r2=0.9984', 'fallback': 'none'}\n", + "[OK] Right_Arm_Fat_Mass: {'column': 'Right_Arm_Fat_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00189', 'metric_secondary': 'r2=0.9954', 'fallback': 'none'}\n", + "[OK] Right_Arm_Fat-Free_Mass: {'column': 'Right_Arm_Fat-Free_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00138', 'metric_secondary': 'r2=0.9980', 'fallback': 'none'}\n", + "[OK] Right_Arm_Predicted_Mass: {'column': 'Right_Arm_Predicted_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00122', 'metric_secondary': 'r2=0.9980', 'fallback': 'none'}\n", + "[OK] Left_Arm_Fat_Percentage: {'column': 'Left_Arm_Fat_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.15265', 'metric_secondary': 'r2=0.9986', 'fallback': 'none'}\n", + "[OK] Left_Arm_Fat_Mass: {'column': 'Left_Arm_Fat_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00200', 'metric_secondary': 'r2=0.9961', 'fallback': 'none'}\n", + "[OK] Left_Arm_Fat-Free_Mass: {'column': 'Left_Arm_Fat-Free_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00142', 'metric_secondary': 'r2=0.9980', 'fallback': 'none'}\n", + "[OK] Height_At_10: {'column': 'Height_At_10', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11467', 'metric_secondary': 'r2=0.2967', 'fallback': 'none'}\n", + "[OK] Left_Arm_Predicted_Mass: {'column': 'Left_Arm_Predicted_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00128', 'metric_secondary': 'r2=0.9980', 'fallback': 'none'}\n", + "[OK] Body_Fat_Percentage: {'column': 'Body_Fat_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.04620', 'metric_secondary': 'r2=0.9994', 'fallback': 'none'}\n", + "[OK] Reticulocyte_Percentage: {'column': 'Reticulocyte_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.07625', 'metric_secondary': 'r2=0.9988', 'fallback': 'none'}\n", + "[OK] Trunk_Fat_Mass: {'column': 'Trunk_Fat_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.03267', 'metric_secondary': 'r2=0.9988', 'fallback': 'none'}\n", + "[OK] Trunk_Fat-Free_Mass: {'column': 'Trunk_Fat-Free_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01580', 'metric_secondary': 'r2=0.9996', 'fallback': 'none'}\n", + "[OK] Trunk_Predicted_Mass: {'column': 'Trunk_Predicted_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00868', 'metric_secondary': 'r2=0.9997', 'fallback': 'none'}\n", + "[OK] Miserableness: {'column': 'Miserableness', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.14343', 'metric_secondary': 'r2=0.4137', 'fallback': 'none'}\n", + "[OK] Solarium_Use: {'column': 'Solarium_Use', 'type': 'regression', 'trained': False, 'metric_primary': 'mse=18.99546', 'metric_secondary': 'r2=-0.0101', 'fallback': 'median'}\n", + "[OK] Weekly_Walking_Days: {'column': 'Weekly_Walking_Days', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00580', 'metric_secondary': 'r2=0.7195', 'fallback': 'none'}\n", + "[OK] Other_Serious_Medical_Conditions: {'column': 'Other_Serious_Medical_Conditions', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11604', 'metric_secondary': 'r2=0.2884', 'fallback': 'none'}\n", + "[OK] Bread: {'column': 'Bread', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=60.18592', 'metric_secondary': 'r2=0.2012', 'fallback': 'none'}\n", + "[OK] Whole_Body_Fat_Mass: {'column': 'Whole_Body_Fat_Mass', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.06344', 'metric_secondary': 'r2=0.9993', 'fallback': 'none'}\n", + "[OK] Body_Size_At_10: {'column': 'Body_Size_At_10', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.19814', 'metric_secondary': 'r2=0.1080', 'fallback': 'none'}\n", + "[OK] Wheezing: {'column': 'Wheezing', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11852', 'metric_secondary': 'r2=0.2935', 'fallback': 'none'}\n", + "[OK] Fed-Up_Feelings: {'column': 'Fed-Up_Feelings', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.13092', 'metric_secondary': 'r2=0.4578', 'fallback': 'none'}\n", + "[OK] Longstanding_Illness/Disability: {'column': 'Longstanding_Illness/Disability', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.12172', 'metric_secondary': 'r2=0.4460', 'fallback': 'none'}\n", + "[OK] Mood_Swings: {'column': 'Mood_Swings', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.13213', 'metric_secondary': 'r2=0.4663', 'fallback': 'none'}\n", + "[OK] Nervous_Feelings: {'column': 'Nervous_Feelings', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.10714', 'metric_secondary': 'r2=0.4019', 'fallback': 'none'}\n", + "[OK] Worrier/Anxious_Feelings: {'column': 'Worrier/Anxious_Feelings', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.15546', 'metric_secondary': 'r2=0.3665', 'fallback': 'none'}\n", + "[OK] Guilty_Feelings: {'column': 'Guilty_Feelings', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.14841', 'metric_secondary': 'r2=0.2760', 'fallback': 'none'}\n", + "[OK] Sensitivity_to_Hurt_Feelings: {'column': 'Sensitivity_to_Hurt_Feelings', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.17205', 'metric_secondary': 'r2=0.3037', 'fallback': 'none'}\n", + "[OK] Tiredness/Lethargy_Frequency: {'column': 'Tiredness/Lethargy_Frequency', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.17287', 'metric_secondary': 'r2=0.3053', 'fallback': 'none'}\n", + "[OK] Enzymatic_In_Urine: {'column': 'Enzymatic_In_Urine', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=12236521.12770', 'metric_secondary': 'r2=0.6405', 'fallback': 'none'}\n", + "[OK] Tanning_Ease: {'column': 'Tanning_Ease', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.13398', 'metric_secondary': 'r2=0.0575', 'fallback': 'none'}\n", + "[OK] Able_to_Confide: {'column': 'Able_to_Confide', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11438', 'metric_secondary': 'r2=0.0904', 'fallback': 'none'}\n", + "[OK] Sodium_Urine: {'column': 'Sodium_Urine', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=1092.01791', 'metric_secondary': 'r2=0.4494', 'fallback': 'none'}\n", + "[OK] Potassium_Urine: {'column': 'Potassium_Urine', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=462.58147', 'metric_secondary': 'r2=0.5949', 'fallback': 'none'}\n", + "[OK] Unenthusiasm/Disinterest_Frequency: {'column': 'Unenthusiasm/Disinterest_Frequency', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.09237', 'metric_secondary': 'r2=0.4486', 'fallback': 'none'}\n", + "[OK] Tense/Highly_Strung: {'column': 'Tense/Highly_Strung', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.09239', 'metric_secondary': 'r2=0.3666', 'fallback': 'none'}\n", + "[OK] Risk-Taking_Behavior: {'column': 'Risk-Taking_Behavior', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.16802', 'metric_secondary': 'r2=0.1462', 'fallback': 'none'}\n", + "[OK] Suffering_from_Nerves: {'column': 'Suffering_from_Nerves', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.10314', 'metric_secondary': 'r2=0.3780', 'fallback': 'none'}\n", + "[OK] Tenseness/Restlessness_Frequency: {'column': 'Tenseness/Restlessness_Frequency', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11827', 'metric_secondary': 'r2=0.3879', 'fallback': 'none'}\n", + "[OK] Post-Embarrassment_Worry: {'column': 'Post-Embarrassment_Worry', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.16919', 'metric_secondary': 'r2=0.3221', 'fallback': 'none'}\n", + "[OK] Depressed_Mood_Frequency: {'column': 'Depressed_Mood_Frequency', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.08407', 'metric_secondary': 'r2=0.5371', 'fallback': 'none'}\n", + "[OK] WBC_Count: {'column': 'WBC_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00073', 'metric_secondary': 'r2=0.9958', 'fallback': 'none'}\n", + "[OK] RBC_Count: {'column': 'RBC_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.03964', 'metric_secondary': 'r2=0.9969', 'fallback': 'none'}\n", + "[OK] Corpuscular_Haemoglobin_Concentration: {'column': 'Corpuscular_Haemoglobin_Concentration', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.51932', 'metric_secondary': 'r2=0.4514', 'fallback': 'none'}\n", + "[OK] Haemoglobin_Concentration: {'column': 'Haemoglobin_Concentration', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00387', 'metric_secondary': 'r2=0.9975', 'fallback': 'none'}\n", + "[OK] Mean_Corpuscular_Haemoglobin: {'column': 'Mean_Corpuscular_Haemoglobin', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.13281', 'metric_secondary': 'r2=0.9651', 'fallback': 'none'}\n", + "[OK] Haematocrit: {'column': 'Haematocrit', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.27617', 'metric_secondary': 'r2=0.9871', 'fallback': 'none'}\n", + "[OK] Mean_Corpuscular_Haemoglobin_Concentration: {'column': 'Mean_Corpuscular_Haemoglobin_Concentration', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.11281', 'metric_secondary': 'r2=0.9101', 'fallback': 'none'}\n", + "[OK] Blood_Cell_Erythrocyte_Distribution_Width: {'column': 'Blood_Cell_Erythrocyte_Distribution_Width', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=31.01486', 'metric_secondary': 'r2=0.9913', 'fallback': 'none'}\n", + "[OK] Platelet_Count: {'column': 'Platelet_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00003', 'metric_secondary': 'r2=0.9858', 'fallback': 'none'}\n", + "[OK] Platelet_Crit: {'column': 'Platelet_Crit', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01272', 'metric_secondary': 'r2=0.9890', 'fallback': 'none'}\n", + "[OK] Platelet_Thrombocyte_Volume: {'column': 'Platelet_Thrombocyte_Volume', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.19092', 'metric_secondary': 'r2=0.3061', 'fallback': 'none'}\n", + "[OK] Environment_Score: {'column': 'Environment_Score', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.34719', 'metric_secondary': 'r2=0.9291', 'fallback': 'none'}\n", + "[OK] Irritability: {'column': 'Irritability', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.14319', 'metric_secondary': 'r2=0.2874', 'fallback': 'none'}\n", + "[OK] Hearing_Difficulty: {'column': 'Hearing_Difficulty', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.17787', 'metric_secondary': 'r2=0.0649', 'fallback': 'none'}\n", + "[OK] Red_Blood_Cell_(Count): {'column': 'Red_Blood_Cell_(Count)', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.16398', 'metric_secondary': 'r2=0.9785', 'fallback': 'none'}\n", + "[OK] Eosinophill_Percentage: {'column': 'Eosinophill_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.02639', 'metric_secondary': 'r2=0.9219', 'fallback': 'none'}\n", + "[OK] Lymphocyte_Percentage: {'column': 'Lymphocyte_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.17163', 'metric_secondary': 'r2=0.9969', 'fallback': 'none'}\n", + "[OK] Neutrophill_Percentage: {'column': 'Neutrophill_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.07561', 'metric_secondary': 'r2=0.9781', 'fallback': 'none'}\n", + "[OK] Monocyte_Percentage: {'column': 'Monocyte_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.30818', 'metric_secondary': 'r2=0.9958', 'fallback': 'none'}\n", + "[OK] Eosinophill_Count: {'column': 'Eosinophill_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00057', 'metric_secondary': 'r2=0.9710', 'fallback': 'none'}\n", + "[OK] Platelet_Width: {'column': 'Platelet_Width', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.30995', 'metric_secondary': 'r2=0.7349', 'fallback': 'none'}\n", + "[OK] Neutrophill_Count: {'column': 'Neutrophill_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00027', 'metric_secondary': 'r2=0.8899', 'fallback': 'none'}\n", + "[OK] Lymphocyte_Count: {'column': 'Lymphocyte_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00223', 'metric_secondary': 'r2=0.9527', 'fallback': 'none'}\n", + "[OK] Monocyte_Count: {'column': 'Monocyte_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.04233', 'metric_secondary': 'r2=0.9799', 'fallback': 'none'}\n", + "[OK] Basophill_Count: {'column': 'Basophill_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00009', 'metric_secondary': 'r2=0.8739', 'fallback': 'none'}\n", + "[OK] Nucleated_Red_Blood_Cell_Percentage: {'column': 'Nucleated_Red_Blood_Cell_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01141', 'metric_secondary': 'r2=0.9213', 'fallback': 'none'}\n", + "[OK] Weekly_Moderate_Activity_Days: {'column': 'Weekly_Moderate_Activity_Days', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.01736', 'metric_secondary': 'r2=0.8440', 'fallback': 'none'}\n", + "[OK] Weekly_Vigorous_Activity_Days: {'column': 'Weekly_Vigorous_Activity_Days', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.04184', 'metric_secondary': 'r2=0.8211', 'fallback': 'none'}\n", + "[OK] Diastolic_BP: {'column': 'Diastolic_BP', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=38.04323', 'metric_secondary': 'r2=0.6319', 'fallback': 'none'}\n", + "[OK] Pulse_Rate: {'column': 'Pulse_Rate', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=91.16690', 'metric_secondary': 'r2=0.2794', 'fallback': 'none'}\n", + "[OK] Systolic_BP: {'column': 'Systolic_BP', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=133.03961', 'metric_secondary': 'r2=0.6182', 'fallback': 'none'}\n", + "[OK] Basophill_Percentage: {'column': 'Basophill_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.09672', 'metric_secondary': 'r2=0.9015', 'fallback': 'none'}\n", + "[OK] Reticulocyte_Count: {'column': 'Reticulocyte_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00004', 'metric_secondary': 'r2=0.9773', 'fallback': 'none'}\n", + "[OK] High_Light_Scatter_Reticulocyte_Count: {'column': 'High_Light_Scatter_Reticulocyte_Count', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00000', 'metric_secondary': 'r2=0.9821', 'fallback': 'none'}\n", + "[OK] Sphered_Cell_Volume: {'column': 'Sphered_Cell_Volume', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=7.33223', 'metric_secondary': 'r2=0.7418', 'fallback': 'none'}\n", + "[OK] Light_Scatter_Reticulocyte_Percentage: {'column': 'Light_Scatter_Reticulocyte_Percentage', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.12540', 'metric_secondary': 'r2=0.3288', 'fallback': 'none'}\n", + "[OK] Immature_Fraction: {'column': 'Immature_Fraction', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=0.00002', 'metric_secondary': 'r2=0.9941', 'fallback': 'none'}\n", + "[OK] Mean_Reticulocyte_Volume: {'column': 'Mean_Reticulocyte_Volume', 'type': 'regression', 'trained': True, 'metric_primary': 'mse=19.21475', 'metric_secondary': 'r2=0.6895', 'fallback': 'none'}\n" + ] + } + ], + "source": [ + "# =======================\n", + "# Notebook 一体化:XGBoost 逐列机器学习插补(兼容旧版 xgboost,无 early_stopping_rounds)\n", + "# =======================\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from sklearn.metrics import accuracy_score, f1_score, mean_squared_error, r2_score\n", + "\n", + "# xgboost 基本导入\n", + "try:\n", + " import xgboost as xgb\n", + " from xgboost import XGBClassifier, XGBRegressor\n", + " import lightgbm as lgb\n", + " from lightgbm import LGBMClassifier, LGBMRegressor\n", + "except Exception as e:\n", + " raise RuntimeError(\"需要已安装 xgboost。请先在该环境安装:pip install xgboost\") from e\n", + "\n", + "# ============ Config(按需修改) ============\n", + "INPUT_CSV = \"/content/drive/MyDrive/demo_200000.csv\"\n", + "OUTPUT_CSV = \"demo_200000_imputed.csv\"\n", + "REPORT_CSV = \"demo_200000_impute_report.csv\"\n", + "\n", + "# 不参与作为特征/目标的列(如ID/标签)\n", + "EXCLUDE_COLS = [\"ID\", \"DR\",\"DR_time\",\"AMD_time\",\"AMD\",\"glaucoma_time\",\"glaucoma\",\"cataract_time\",\"cataract\"]\n", + "\n", + "# 类别压帽(最多保留前N个高频类别,其余合并为 OTHER)\n", + "MAX_CATEGORIES = 50\n", + "\n", + "# 训练与评估\n", + "TEST_SIZE = 0.2\n", + "RANDOM_STATE = 42\n", + "N_ESTIMATORS = 300 # 如果耗时长,可先降到 200\n", + "LEARNING_RATE = 0.05\n", + "MAX_DEPTH = 6\n", + "SUBSAMPLE = 0.8\n", + "COLSAMPLE_BYTREE = 0.8\n", + "\n", + "# 早停轮数(老版本不支持 fit 参数,我们用回调;若回调也不可用就自动跳过)\n", + "EARLY_STOPPING_ROUNDS = 50\n", + "\n", + "# 分类任务:最低可接受准确率(低于则回退到众数)\n", + "EVAL_ACC_THRESHOLD = 0.65\n", + "# 回归任务:模型MSE需 <= baseline*MSE_RATIO 才接受(即至少优于均值/中位数约5%)\n", + "EVAL_MSE_RATIO = 0.95\n", + "\n", + "# XGBoost tree_method(可切到 \"gpu_hist\" 如果你的环境支持 GPU)\n", + "XGB_TREE_METHOD = \"hist\" # \"hist\" | \"approx\" | \"auto\" | \"gpu_hist\"\n", + "\n", + "\n", + "# ============ Helpers ============\n", + "def is_numeric_series(s: pd.Series) -> bool:\n", + " return pd.api.types.is_integer_dtype(s) or pd.api.types.is_float_dtype(s)\n", + "\n", + "def cap_categories(series: pd.Series, max_categories: int = 50):\n", + " \"\"\"保留前N高频类别,其余 -> 'OTHER'\"\"\"\n", + " vc = series.value_counts(dropna=False)\n", + " top = set(vc.head(max_categories).index.tolist())\n", + " return series.apply(lambda x: x if x in top else \"OTHER\")\n", + "\n", + "def one_hot_fit_transform(df: pd.DataFrame, categorical_cols, max_categories: int):\n", + " \"\"\"拟合并独热编码,返回:编码后DF、meta(每列类别集合)、最终列名列表\"\"\"\n", + " df = df.copy()\n", + " meta = {}\n", + " for col in categorical_cols:\n", + " s = df[col].astype(str).fillna(\"UNKNOWN\")\n", + " s = cap_categories(s, max_categories=max_categories)\n", + " df[col] = s\n", + " meta[col] = sorted(df[col].unique().tolist())\n", + " dummied = pd.get_dummies(df, columns=categorical_cols, dummy_na=False)\n", + " return dummied, meta, dummied.columns.tolist()\n", + "\n", + "def one_hot_transform_with_meta(df: pd.DataFrame, categorical_cols, meta, all_cols):\n", + " \"\"\"用拟合阶段的 meta 做独热,并对齐列\"\"\"\n", + " df = df.copy()\n", + " for col in categorical_cols:\n", + " s = df[col].astype(str).fillna(\"UNKNOWN\")\n", + " df[col] = s.apply(lambda x: x if x in meta[col] else \"OTHER\")\n", + " dummied = pd.get_dummies(df, columns=categorical_cols, dummy_na=False)\n", + " for c in all_cols:\n", + " if c not in dummied.columns:\n", + " dummied[c] = 0\n", + " dummied = dummied[all_cols]\n", + " return dummied\n", + "\n", + "def evaluate_classifier(y_true, y_pred):\n", + " acc = accuracy_score(y_true, y_pred)\n", + " f1m = f1_score(y_true, y_pred, average=\"macro\")\n", + " return {\"accuracy\": acc, \"f1_macro\": f1m}\n", + "\n", + "def evaluate_regressor(y_true, y_pred):\n", + " mse = mean_squared_error(y_true, y_pred)\n", + " r2 = r2_score(y_true, y_pred)\n", + " return {\"mse\": mse, \"r2\": r2}\n", + "\n", + "def _fit_with_optional_early_stopping(model, X_tr, y_tr, X_va, y_va):\n", + " \"\"\"\n", + " 兼容不同 xgboost 版本的早停:\n", + " - 优先使用 xgboost.callback.EarlyStopping\n", + " - 如果不可用,直接不做早停\n", + " \"\"\"\n", + " callbacks = []\n", + " eval_set = [(X_va, y_va)]\n", + "\n", + " # 优先用官方回调(老版本也支持)\n", + " try:\n", + " cb = xgb.callback.EarlyStopping(\n", + " rounds=EARLY_STOPPING_ROUNDS,\n", + " save_best=True,\n", + " maximize=False # 回归/分类默认都是最小化损失\n", + " )\n", + " callbacks.append(cb)\n", + " model.fit(X_tr, y_tr, eval_set=eval_set, callbacks=callbacks, verbose=False)\n", + " return model\n", + " except Exception:\n", + " # 无法使用回调则直接无早停训练\n", + " model.fit(X_tr, y_tr, eval_set=eval_set, verbose=False)\n", + " return model\n", + "\n", + "def xgb_impute_column(\n", + " df: pd.DataFrame,\n", + " target_col: str,\n", + " exclude_cols: list,\n", + " max_categories: int = 50,\n", + " test_size: float = 0.2,\n", + " random_state: int = 42,\n", + " n_estimators: int = 300,\n", + " learning_rate: float = 0.05,\n", + " max_depth: int = 6,\n", + " subsample: float = 0.8,\n", + " colsample_bytree: float = 0.8,\n", + " eval_acc_threshold: float = 0.65,\n", + " eval_mse_ratio: float = 0.95,\n", + " tree_method: str = \"hist\",\n", + "):\n", + " \"\"\"对单列进行 XGB 插补:返回填补后的 Series 与一条报告 dict\"\"\"\n", + " y = df[target_col]\n", + " notnull_mask = y.notna()\n", + " null_mask = ~notnull_mask\n", + " if null_mask.sum() == 0:\n", + " return y, {\"column\": target_col, \"type\": \"skip_no_missing\", \"trained\": False,\n", + " \"metric_primary\": None, \"metric_secondary\": None, \"fallback\": \"none\"}\n", + "\n", + " feature_cols = [c for c in df.columns if c != target_col and c not in exclude_cols]\n", + " X = df[feature_cols].copy()\n", + "\n", + " # 特征侧预填(不改原 df)\n", + " num_cols = [c for c in feature_cols if is_numeric_series(X[c])]\n", + " cat_cols = [c for c in feature_cols if not is_numeric_series(X[c])]\n", + " for c in num_cols:\n", + " X[c] = pd.to_numeric(X[c], errors=\"coerce\").fillna(X[c].median())\n", + " for c in cat_cols:\n", + " X[c] = X[c].astype(str).fillna(\"UNKNOWN\")\n", + "\n", + " X_train_full = X.loc[notnull_mask].copy()\n", + " y_train_full = y.loc[notnull_mask].copy()\n", + " X_null = X.loc[null_mask].copy()\n", + "\n", + " X_train_oh, meta, all_cols = one_hot_fit_transform(X_train_full, cat_cols, max_categories=max_categories)\n", + " X_null_oh = one_hot_transform_with_meta(X_null, cat_cols, meta, all_cols)\n", + "\n", + " # 回归还是分类由目标列类型决定\n", + " if is_numeric_series(y_train_full):\n", + " task = \"regression\"\n", + " y_vec = pd.to_numeric(y_train_full, errors=\"coerce\")\n", + " valid = y_vec.notna()\n", + " X_train_oh = X_train_oh.loc[valid]; y_vec = y_vec.loc[valid]\n", + "\n", + " X_tr, X_te, y_tr, y_te = train_test_split(X_train_oh, y_vec, test_size=test_size, random_state=random_state)\n", + " model = XGBRegressor(\n", + " n_estimators=n_estimators, learning_rate=learning_rate, max_depth=max_depth,\n", + " subsample=subsample, colsample_bytree=colsample_bytree, objective=\"reg:squarederror\",\n", + " tree_method=tree_method, random_state=random_state, n_jobs=-1\n", + " )\n", + " model = _fit_with_optional_early_stopping(model, X_tr, y_tr, X_te, y_te)\n", + " y_pred = model.predict(X_te)\n", + " m = evaluate_regressor(y_te, y_pred)\n", + "\n", + " # 基线:均值/中位数\n", + " mse_model = m[\"mse\"]\n", + " mse_mean = mean_squared_error(y_te, np.full_like(y_te, y_tr.mean(), dtype=float))\n", + " mse_median= mean_squared_error(y_te, np.full_like(y_te, float(np.median(y_tr)), dtype=float))\n", + " best_bl = min(mse_mean, mse_median)\n", + "\n", + " if mse_model <= eval_mse_ratio * best_bl:\n", + " y_null_pred = model.predict(X_null_oh)\n", + " filled = y.copy(); filled.loc[null_mask] = y_null_pred\n", + " rep = {\"column\": target_col, \"type\": task, \"trained\": True,\n", + " \"metric_primary\": f\"mse={m['mse']:.5f}\", \"metric_secondary\": f\"r2={m['r2']:.4f}\",\n", + " \"fallback\": \"none\"}\n", + " return filled, rep\n", + " else:\n", + " filled = y.fillna(y.median())\n", + " rep = {\"column\": target_col, \"type\": task, \"trained\": False,\n", + " \"metric_primary\": f\"mse={m['mse']:.5f}\", \"metric_secondary\": f\"r2={m['r2']:.4f}\",\n", + " \"fallback\": \"median\"}\n", + " return filled, rep\n", + "\n", + " else:\n", + " task = \"classification\"\n", + " y_str = y_train_full.astype(str)\n", + " enc = LabelEncoder(); y_enc = enc.fit_transform(y_str)\n", + "\n", + " X_tr, X_te, y_tr, y_te = train_test_split(\n", + " X_train_oh, y_enc, test_size=test_size, random_state=random_state, stratify=y_enc\n", + " )\n", + " clf = XGBClassifier(\n", + " n_estimators=n_estimators, learning_rate=learning_rate, max_depth=max_depth,\n", + " subsample=subsample, colsample_bytree=colsample_bytree,\n", + " objective=\"multi:softprob\" if len(np.unique(y_enc))>2 else \"binary:logistic\",\n", + " num_class=len(np.unique(y_enc)) if len(np.unique(y_enc))>2 else None,\n", + " tree_method=tree_method, random_state=random_state, n_jobs=-1, use_label_encoder=False\n", + " )\n", + " clf = _fit_with_optional_early_stopping(clf, X_tr, y_tr, X_te, y_te)\n", + " y_pred = clf.predict(X_te)\n", + " m = evaluate_classifier(y_te, y_pred)\n", + "\n", + " if m[\"accuracy\"] >= eval_acc_threshold:\n", + " y_null_pred_enc = clf.predict(X_null_oh)\n", + " y_null_pred = enc.inverse_transform(y_null_pred_enc)\n", + " filled = y.copy(); filled.loc[null_mask] = y_null_pred\n", + " rep = {\"column\": target_col, \"type\": task, \"trained\": True,\n", + " \"metric_primary\": f\"acc={m['accuracy']:.4f}\", \"metric_secondary\": f\"f1_macro={m['f1_macro']:.4f}\",\n", + " \"fallback\": \"none\"}\n", + " return filled, rep\n", + " else:\n", + " mode_val = y_str.mode().iloc[0] if y_str.mode().shape[0] else \"UNKNOWN\"\n", + " filled = y.fillna(mode_val)\n", + " rep = {\"column\": target_col, \"type\": task, \"trained\": False,\n", + " \"metric_primary\": f\"acc={m['accuracy']:.4f}\", \"metric_secondary\": f\"f1_macro={m['f1_macro']:.4f}\",\n", + " \"fallback\": f\"mode({mode_val})\"}\n", + " return filled, rep\n", + "\n", + "\n", + "def impute_dataframe(df: pd.DataFrame, exclude_cols=None, max_categories=50):\n", + " dfw = df.copy()\n", + " exclude_cols = exclude_cols or []\n", + "\n", + " miss_counts = dfw.isna().sum()\n", + " miss_cols = miss_counts[miss_counts > 0].sort_values(ascending=True).index.tolist()\n", + "\n", + " reports = []\n", + " for col in miss_cols:\n", + " if col in exclude_cols:\n", + " reports.append({\"column\": col, \"type\": \"skipped_excluded\", \"trained\": False,\n", + " \"metric_primary\": None, \"metric_secondary\": None, \"fallback\": \"none\"})\n", + " continue\n", + "\n", + " filled_col, rep = xgb_impute_column(\n", + " df=dfw, target_col=col, exclude_cols=exclude_cols,\n", + " max_categories=max_categories, test_size=TEST_SIZE, random_state=RANDOM_STATE,\n", + " n_estimators=N_ESTIMATORS, learning_rate=LEARNING_RATE, max_depth=MAX_DEPTH,\n", + " subsample=SUBSAMPLE, colsample_bytree=COLSAMPLE_BYTREE,\n", + " eval_acc_threshold=EVAL_ACC_THRESHOLD, eval_mse_ratio=EVAL_MSE_RATIO,\n", + " tree_method=XGB_TREE_METHOD\n", + " )\n", + " dfw[col] = filled_col\n", + " reports.append(rep)\n", + " print(f\"[OK] {col}: {rep}\")\n", + "\n", + " report_df = pd.DataFrame(reports, columns=[\"column\",\"type\",\"trained\",\"metric_primary\",\"metric_secondary\",\"fallback\"])\n", + " return dfw, report_df\n", + "\n", + "\n", + "# ============ RUN ============\n", + "df_in = pd.read_csv(INPUT_CSV)\n", + "imputed_df, report_df = impute_dataframe(df_in, exclude_cols=EXCLUDE_COLS, max_categories=MAX_CATEGORIES)\n", + "\n", + "imputed_df.to_csv(OUTPUT_CSV, index=False)\n", + "report_df.to_csv(REPORT_CSV, index=False)\n", + "\n", + "print(\"插补完成。\")\n", + "print(\"Imputed CSV ->\", OUTPUT_CSV)\n", + "print(\"Report CSV ->\", REPORT_CSV)\n", + "\n", + "# 预览\n", + "imputed_df.head(), report_df.head(20)\n" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/jointContribution/AI_Climate_disease/paddle_model_samples.ipynb b/jointContribution/AI_Climate_disease/paddle_model_samples.ipynb new file mode 100644 index 000000000..bb972acf4 --- /dev/null +++ b/jointContribution/AI_Climate_disease/paddle_model_samples.ipynb @@ -0,0 +1,6012 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "gpuType": "A100" + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "### paddlepaddle普通版安装" + ], + "metadata": { + "id": "H5v3zT_N1MGr" + } + }, + { + "cell_type": "code", + "source": [ + "!pip -q install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple\n", + "\n", + "# 验证\n", + "import paddle\n", + "paddle.utils.run_check()\n", + "print(\"Paddle version:\", paddle.__version__)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "awQrZ0Q-NF7S", + "outputId": "c8c84f16-eccb-4a9d-af47-60a1188792ad" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m189.0/189.0 MB\u001b[0m \u001b[31m9.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m65.5/65.5 kB\u001b[0m \u001b[31m6.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/paddle/utils/cpp_extension/extension_utils.py:718: UserWarning: No ccache found. Please be aware that recompiling all source files may be required. You can download and install ccache from: https://github.com/ccache/ccache/blob/master/doc/INSTALL.md\n", + " warnings.warn(warning_message)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running verify PaddlePaddle program ... \n", + "PaddlePaddle works well on 1 CPU.\n", + "PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.\n", + "Paddle version: 3.2.0\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/paddle/pir/math_op_patch.py:219: UserWarning: Value do not have 'place' interface for pir graph mode, try not to use it. None will be returned.\n", + " warnings.warn(\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# TabM基础复现" + ], + "metadata": { + "id": "winGUy1x1SL2" + } + }, + { + "cell_type": "code", + "source": [ + "import math\n", + "from typing import Literal, Optional\n", + "\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "\n", + "# ---------- 通用初始化 ------------------------------------------------------\n", + "def init_rsqrt_uniform_(w: paddle.Tensor) -> paddle.Tensor:\n", + " bound = 1.0 / math.sqrt(w.shape[-1])\n", + " noise = paddle.uniform(w.shape, min=-bound, max=bound, dtype=w.dtype)\n", + " w.set_value(noise)\n", + " return w\n", + "\n", + "def init_random_signs_(w: paddle.Tensor) -> paddle.Tensor:\n", + " # 0/1 伯努利 -> *2 -1 => {-1, +1}\n", + " with paddle.no_grad():\n", + " p = paddle.full(w.shape, 0.5, dtype='float32')\n", + " s = paddle.bernoulli(p) * 2.0 - 1.0\n", + " s = paddle.cast(s, w.dtype)\n", + " w.set_value(s)\n", + " return w\n", + "\n", + "# ---------- 基础层 ----------------------------------------------------------\n", + "class NLinear(nn.Layer):\n", + " \"\"\"PackedEnsemble: K 份 Linear 打包 → 输入 (B,K,D), 权重布局 (K, I, O)\"\"\"\n", + " def __init__(self, k: int, in_f: int, out_f: int, bias: bool = True):\n", + " super().__init__()\n", + " self.k = k\n", + " self.in_f = in_f\n", + " self.out_f = out_f\n", + " # 按 Paddle 线性层布局 [I, O]\n", + " self.weight = self.create_parameter(shape=[k, in_f, out_f])\n", + " self.bias_e = self.create_parameter(shape=[k, out_f]) if bias else None\n", + " self.reset_parameters()\n", + "\n", + " def reset_parameters(self):\n", + " init_rsqrt_uniform_(self.weight)\n", + " if self.bias_e is not None:\n", + " init_rsqrt_uniform_(self.bias_e)\n", + "\n", + " def forward(self, x): # x: (B,K,D=I)\n", + " # 转成 (K,B,D) 与 batched matmul 对齐\n", + " xk = paddle.transpose(x, [1, 0, 2]) # (K,B,I)\n", + " # (K,B,I) @ (K,I,O) = (K,B,O)\n", + " yk = paddle.bmm(xk, self.weight) # (K,B,O)\n", + " y = paddle.transpose(yk, [1, 0, 2]) # (B,K,O)\n", + " if self.bias_e is not None:\n", + " y = y + self.bias_e # 广播到 (B,K,O)\n", + " return y\n", + "\n", + "class ScaleEnsemble(nn.Layer):\n", + " \"\"\"Mini-Ensemble:每层一个 rank-1 缩放向量\"\"\"\n", + " def __init__(self, k: int, d: int, init='ones'):\n", + " super().__init__()\n", + " self.k = k\n", + " self.d = d\n", + " self.init = init\n", + " self.weight = self.create_parameter(shape=[k, d])\n", + " self.reset_parameters()\n", + "\n", + " def reset_parameters(self):\n", + " if self.init == 'ones':\n", + " self.weight.set_value(paddle.ones_like(self.weight))\n", + " else:\n", + " init_random_signs_(self.weight)\n", + "\n", + " def forward(self, x): # (B,K,D)\n", + " return x * self.weight # 广播到 (B,K,D)\n", + "\n", + "class LinearBE(nn.Layer):\n", + " \"\"\"\n", + " BatchEnsemble Linear(Paddle 布局):\n", + " 权重 W: [I, O];前向 y_e = ((x * r_e) @ W) * s_e + b_e\n", + " 输入: x (B,K,I)\n", + " 输出: y (B,K,O)\n", + " \"\"\"\n", + " def __init__(self, in_f: int, out_f: int, k: int,\n", + " scale_init='ones', bias: bool = True):\n", + " super().__init__()\n", + " self.k = k\n", + " self.in_f = in_f\n", + " self.out_f = out_f\n", + " # 显式属性名,避免冲突;按 Paddle 线性层布局 [I, O]\n", + " self.weight = self.create_parameter(shape=[in_f, out_f])\n", + " self.r = self.create_parameter(shape=[k, in_f])\n", + " self.s = self.create_parameter(shape=[k, out_f])\n", + " self.use_bias = bias\n", + " self.bias_e = self.create_parameter(shape=[k, out_f]) if bias else None\n", + " self.scale_init = scale_init\n", + " self.reset_parameters()\n", + "\n", + " def reset_parameters(self):\n", + " init_rsqrt_uniform_(self.weight)\n", + " if self.scale_init == 'ones':\n", + " self.r.set_value(paddle.ones_like(self.r))\n", + " self.s.set_value(paddle.ones_like(self.s))\n", + " else:\n", + " init_random_signs_(self.r)\n", + " init_random_signs_(self.s)\n", + " if self.use_bias:\n", + " init_rsqrt_uniform_(self.bias_e)\n", + "\n", + " def forward(self, x): # (B,K,I)\n", + " xr = x * self.r # (B,K,I)\n", + " # (B,K,I) @ (I,O) = (B,K,O)\n", + " y = paddle.matmul(xr, self.weight) # (B,K,O)\n", + " y = y * self.s # (B,K,O)\n", + " if self.use_bias:\n", + " y = y + self.bias_e\n", + " return y\n", + "\n", + "# ---------- Backbone MLP -----------------------------------------------------\n", + "class MLPBlock(nn.Layer):\n", + " def __init__(self, d_in, d_hid, dropout, act='ReLU'):\n", + " super().__init__()\n", + " Act = getattr(nn, act)\n", + " self.net = nn.Sequential(\n", + " nn.Linear(d_in, d_hid), # Paddle: weight [d_in, d_hid]\n", + " Act(),\n", + " nn.Dropout(dropout),\n", + " )\n", + "\n", + " def forward(self, x):\n", + " # 允许 (B,K,D) 或 (B,D);Linear 会在最后一维上工作\n", + " return self.net(x)\n", + "\n", + "class BackboneMLP(nn.Layer):\n", + " def __init__(self, n_blocks: int, d_in: int, d_hidden: int, dropout: float):\n", + " super().__init__()\n", + " blocks = []\n", + " for i in range(n_blocks):\n", + " blocks.append(\n", + " MLPBlock(d_in if i == 0 else d_hidden, d_hidden, dropout)\n", + " )\n", + " self.blocks = nn.LayerList(blocks)\n", + "\n", + " def forward(self, x):\n", + " for blk in self.blocks:\n", + " x = blk(x)\n", + " return x\n", + "\n", + "# ---------- 工具:递归替换 Linear 为 BE / Packed ---------------------------\n", + "def _get_parent_by_path(root: nn.Layer, path_list):\n", + " \"\"\"根据命名路径拿到父层(最后一个名是子层名)\"\"\"\n", + " cur = root\n", + " for p in path_list:\n", + " if hasattr(cur, p):\n", + " cur = getattr(cur, p)\n", + " else:\n", + " sub_layers = getattr(cur, \"_sub_layers\", None)\n", + " if sub_layers is None or p not in sub_layers:\n", + " raise AttributeError(f\"Cannot locate sublayer '{p}' under '{type(cur).__name__}'\")\n", + " cur = sub_layers[p]\n", + " return cur\n", + "\n", + "def _replace_linear(module: nn.Layer, k: int, mode: Literal['be', 'packed']):\n", + " \"\"\"\n", + " 遍历 module 的子层,把 nn.Linear 替换为 LinearBE 或 NLinear\n", + " 注意:Paddle Linear 的 weight 形状为 [in_features, out_features]\n", + " \"\"\"\n", + " to_replace = []\n", + "\n", + " for full_name, layer in module.named_sublayers(include_self=False):\n", + " if isinstance(layer, nn.Linear):\n", + " parts = full_name.split('.')\n", + " parent_path, child_name = parts[:-1], parts[-1]\n", + " parent = _get_parent_by_path(module, parent_path) if parent_path else module\n", + "\n", + " in_f = layer.weight.shape[0] # I\n", + " out_f = layer.weight.shape[1] # O\n", + "\n", + " if mode == 'be':\n", + " new_layer = LinearBE(in_f, out_f, k)\n", + " with paddle.no_grad():\n", + " # 拷贝共享主权重([I,O])与偏置([O])\n", + " assert list(new_layer.weight.shape) == list(layer.weight.shape), \\\n", + " f\"weight shape mismatch: {new_layer.weight.shape} vs {layer.weight.shape}\"\n", + " new_layer.weight.set_value(layer.weight.clone())\n", + " if layer.bias is not None and new_layer.bias_e is not None:\n", + " b = layer.bias.reshape([1, -1]).tile([k, 1]) # (K, O)\n", + " assert list(new_layer.bias_e.shape) == list(b.shape), \\\n", + " f\"bias shape mismatch: {new_layer.bias_e.shape} vs {b.shape}\"\n", + " new_layer.bias_e.set_value(b)\n", + " else: # 'packed'\n", + " new_layer = NLinear(k, in_f, out_f, bias=layer.bias is not None)\n", + " with paddle.no_grad():\n", + " # 每个 pack 共享同一权重初值: 原 (I,O) -> (K,I,O)\n", + " w = layer.weight.unsqueeze(0).tile([k, 1, 1]) # (K,I,O)\n", + " assert list(new_layer.weight.shape) == list(w.shape), \\\n", + " f\"packed weight shape mismatch: {new_layer.weight.shape} vs {w.shape}\"\n", + " new_layer.weight.set_value(w)\n", + " if layer.bias is not None and new_layer.bias_e is not None:\n", + " b = layer.bias.unsqueeze(0).tile([k, 1]) # (K,O)\n", + " assert list(new_layer.bias_e.shape) == list(b.shape), \\\n", + " f\"packed bias shape mismatch: {new_layer.bias_e.shape} vs {b.shape}\"\n", + " new_layer.bias_e.set_value(b)\n", + "\n", + " to_replace.append((parent, child_name, new_layer))\n", + "\n", + " # 正式替换\n", + " for parent, child_name, new_layer in to_replace:\n", + " if hasattr(parent, child_name):\n", + " setattr(parent, child_name, new_layer)\n", + " else:\n", + " sub_layers = getattr(parent, \"_sub_layers\", None)\n", + " if sub_layers is None or child_name not in sub_layers:\n", + " raise AttributeError(f\"Cannot set sublayer '{child_name}' under '{type(parent).__name__}'\")\n", + " parent._sub_layers[child_name] = new_layer\n", + "\n", + "# ---------- TabM 特征提取器 --------------------------------------------------\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " \"\"\"\n", + " arch_type: 'plain' | 'tabm' | 'tabm-mini' | 'tabm-packed'\n", + " 返回:\n", + " - reduce=True → (B,H)\n", + " - reduce=False → (B,K,H)\n", + " \"\"\"\n", + " def __init__(self,\n", + " num_features: int,\n", + " arch_type: Literal['plain', 'tabm', 'tabm-mini', 'tabm-packed']='tabm',\n", + " k: int = 32,\n", + " backbone_cfg: Optional[dict] = None,\n", + " reduce: bool = True):\n", + " super().__init__()\n", + " if arch_type == 'plain':\n", + " k = 1\n", + " self.k = k\n", + " self.reduce = reduce\n", + " cfg = backbone_cfg or dict(n_blocks=3, d_hidden=512, dropout=0.1)\n", + " self.backbone = BackboneMLP(**cfg, d_in=num_features)\n", + "\n", + " # --- 插入 Ensemble 逻辑 ---\n", + " if arch_type == 'tabm':\n", + " _replace_linear(self.backbone, k, mode='be')\n", + " self.min_adapter = None\n", + " elif arch_type == 'tabm-mini':\n", + " self.min_adapter = ScaleEnsemble(k, num_features, init='random-signs')\n", + " elif arch_type == 'tabm-packed':\n", + " _replace_linear(self.backbone, k, mode='packed')\n", + " self.min_adapter = None\n", + " else: # plain\n", + " self.min_adapter = None\n", + "\n", + " def forward(self, x_num: paddle.Tensor):\n", + " \"\"\"\n", + " x_num : (B, num_features) – 已完成数值化/标准化\n", + " \"\"\"\n", + " if self.k > 1:\n", + " x = x_num.unsqueeze(1).tile([1, self.k, 1]) # (B,K,D)\n", + " else:\n", + " x = x_num.unsqueeze(1) # (B,1,D)\n", + "\n", + " if self.min_adapter is not None:\n", + " x = self.min_adapter(x) # (B,K,D)\n", + "\n", + " features = self.backbone(x) # (B,K,H)\n", + " if self.reduce:\n", + " return features.mean(axis=1) # (B,H)\n", + " return features # (B,K,H)\n", + "\n", + "# ---------------- Quick check ----------------\n", + "if __name__ == '__main__':\n", + " paddle.seed(123)\n", + " B, D = 8, 30\n", + " x = paddle.randn([B, D])\n", + " # 1) 标准 TabM(BatchEnsemble 替换)\n", + " fe1 = TabMFeatureExtractor(D, arch_type='tabm', k=16, reduce=True)\n", + " out1 = fe1(x)\n", + " print('TabM-BE features:', list(out1.shape)) # (B, H)\n", + "\n", + " # 2) tabm-mini(只做 rank-1 缩放)\n", + " fe2 = TabMFeatureExtractor(D, arch_type='tabm-mini', k=16, reduce=False)\n", + " out2 = fe2(x)\n", + " print('TabM-mini features:', list(out2.shape)) # (B, K, H)\n", + "\n", + " # 3) tabm-packed(Packed NLinear)\n", + " fe3 = TabMFeatureExtractor(D, arch_type='tabm-packed', k=8, reduce=True)\n", + " out3 = fe3(x)\n", + " print('TabM-packed features:', list(out3.shape)) # (B, H)\n", + "\n", + " # 4) plain(无集成基线)\n", + " fe4 = TabMFeatureExtractor(D, arch_type='plain', k=1, reduce=True)\n", + " out4 = fe4(x)\n", + " print('Plain features:', list(out4.shape)) # (B, H)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TCF5hoiWF-N4", + "outputId": "df4ea66c-1716-4357-fa58-fb5f8f57d183" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "TabM-BE features: [8, 512]\n", + "TabM-mini features: [8, 16, 512]\n", + "TabM-packed features: [8, 512]\n", + "Plain features: [8, 512]\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math\n", + "from typing import Optional, Literal, Tuple\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "\n", + "\n", + "# ====== 数据集(示例:合成数据)========================================\n", + "class ToyMultiLabelDataset(Dataset):\n", + " \"\"\"\n", + " 返回:\n", + " x_num: float32, 形状 (D,)\n", + " y: float32, 形状 (4,) —— 多标签 0/1\n", + " \"\"\"\n", + " def __init__(self, n: int, d: int, seed: int = 123):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.X = rng.normal(size=(n, d)).astype('float32')\n", + " # 随机生成 4 个线性规则 + 噪声,得到多标签\n", + " W = rng.normal(size=(d, 4))\n", + " logits = self.X @ W + rng.normal(scale=0.5, size=(n, 4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.Y = (probs > 0.5).astype('float32')\n", + "\n", + " def __getitem__(self, idx: int):\n", + " return self.X[idx], self.Y[idx]\n", + "\n", + " def __len__(self) -> int:\n", + " return len(self.X)\n", + "\n", + "# ====== 模型:特征抽取 + 多标签头 ======================================\n", + "class MultiLabelClassifier(nn.Layer):\n", + " def __init__(self, num_features: int, num_labels: int = 4,\n", + " arch_type: str = 'tabm', k: int = 16,\n", + " backbone_cfg: Optional[dict] = None):\n", + " super().__init__()\n", + " self.fe = TabMFeatureExtractor(\n", + " num_features=num_features,\n", + " arch_type=arch_type,\n", + " k=k,\n", + " backbone_cfg=backbone_cfg,\n", + " reduce=True\n", + " )\n", + " # 推断隐藏维度(若你的 TabM 有属性可读,直接使用;否则手动传入)\n", + " d_hidden = getattr(self.fe, \"d_hidden\", (backbone_cfg or dict(d_hidden=512))[\"d_hidden\"])\n", + " self.head = nn.Linear(d_hidden, num_labels)\n", + "\n", + " def forward(self, x_num: paddle.Tensor) -> paddle.Tensor:\n", + " # x_num: (B, D)\n", + " h = self.fe(x_num) # (B, H)\n", + " logits = self.head(h) # (B, 4)\n", + " return logits\n", + "\n", + "# ====== 评价指标:F1、AP 等 ==============================================\n", + "def f1_per_class(y_true: np.ndarray, y_pred: np.ndarray, eps: float = 1e-9) -> Tuple[np.ndarray, float, float]:\n", + " \"\"\"\n", + " y_true: (N, C) 0/1\n", + " y_pred: (N, C) 0/1\n", + " 返回: per_class F1, macro-F1, micro-F1\n", + " \"\"\"\n", + " assert y_true.shape == y_pred.shape\n", + " N, C = y_true.shape\n", + " f1_c = np.zeros(C, dtype=np.float32)\n", + "\n", + " # per-class\n", + " for c in range(C):\n", + " yt = y_true[:, c]\n", + " yp = y_pred[:, c]\n", + " tp = np.sum((yt == 1) & (yp == 1))\n", + " fp = np.sum((yt == 0) & (yp == 1))\n", + " fn = np.sum((yt == 1) & (yp == 0))\n", + " prec = tp / (tp + fp + eps)\n", + " rec = tp / (tp + fn + eps)\n", + " f1_c[c] = 2 * prec * rec / (prec + rec + eps)\n", + "\n", + " macro_f1 = float(np.mean(f1_c))\n", + "\n", + " # micro\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " prec = tp / (tp + fp + 1e-9)\n", + " rec = tp / (tp + fn + 1e-9)\n", + " micro_f1 = 2 * prec * rec / (prec + rec + 1e-9)\n", + " return f1_c, macro_f1, float(micro_f1)\n", + "\n", + "def average_precision_micro(y_true: np.ndarray, y_prob: np.ndarray, num_thresholds: int = 101) -> float:\n", + " \"\"\"\n", + " 简易版 micro-AP(AUCPR):在 0~1 阈值上扫一遍,近似计算 PR 曲线下面积\n", + " \"\"\"\n", + " thresholds = np.linspace(0.0, 1.0, num_thresholds)\n", + " precision, recall = [], []\n", + " for t in thresholds:\n", + " y_pred = (y_prob >= t).astype(np.float32)\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " p = tp / (tp + fp + 1e-9)\n", + " r = tp / (tp + fn + 1e-9)\n", + " precision.append(p); recall.append(r)\n", + " # 按 recall 升序进行梯形积分\n", + " order = np.argsort(recall)\n", + " recall = np.array(recall)[order]\n", + " precision = np.array(precision)[order]\n", + " auc_pr = np.trapz(precision, recall)\n", + " return float(auc_pr)\n", + "\n", + "# ====== 训练/验证循环 =====================================================\n", + "def train_one_epoch(model, loader, optimizer,\n", + " pos_weight: Optional[paddle.Tensor] = None,\n", + " clip_grad_norm: Optional[float] = None,\n", + " device: str = 'gpu' if paddle.is_compiled_with_cuda() else 'cpu'):\n", + " model.train()\n", + " total_loss = 0.0\n", + " total_batches = 0\n", + " for x, y in loader:\n", + " x = x.astype('float32')\n", + " y = y.astype('float32')\n", + " logits = model(x)\n", + " # BCE with logits(支持 pos_weight)\n", + " if pos_weight is not None:\n", + " loss = F.binary_cross_entropy_with_logits(logits, y, pos_weight=pos_weight)\n", + " else:\n", + " loss = F.binary_cross_entropy_with_logits(logits, y)\n", + " loss.backward()\n", + " if clip_grad_norm is not None:\n", + " nn.utils.clip_grad_norm_(model.parameters(), max_norm=clip_grad_norm)\n", + " optimizer.step()\n", + " optimizer.clear_grad()\n", + " total_loss += float(loss)\n", + " total_batches += 1\n", + " return total_loss / max(1, total_batches)\n", + "\n", + "@paddle.no_grad()\n", + "def evaluate(model, loader, threshold: float = 0.5):\n", + " model.eval()\n", + " ys, ps = [], []\n", + " total_loss, total_batches = 0.0, 0\n", + " for x, y in loader:\n", + " x = x.astype('float32'); y = y.astype('float32')\n", + " logits = model(x) # (B,4)\n", + " loss = F.binary_cross_entropy_with_logits(logits, y)\n", + " prob = F.sigmoid(logits).numpy() # (B,4)\n", + " ys.append(y.numpy())\n", + " ps.append(prob)\n", + " total_loss += float(loss)\n", + " total_batches += 1\n", + " y_true = np.concatenate(ys, axis=0)\n", + " y_prob = np.concatenate(ps, axis=0)\n", + " y_pred = (y_prob >= threshold).astype(np.float32)\n", + "\n", + " per_f1, macro_f1, micro_f1 = f1_per_class(y_true, y_pred)\n", + " ap_micro = average_precision_micro(y_true, y_prob)\n", + " avg_loss = total_loss / max(1, total_batches)\n", + " metrics = {\n", + " \"loss\": avg_loss,\n", + " \"macro_f1\": macro_f1,\n", + " \"micro_f1\": micro_f1,\n", + " \"per_class_f1\": per_f1.tolist(),\n", + " \"micro_AP\": ap_micro\n", + " }\n", + " return metrics\n", + "\n", + "# ====== 主函数:跑通一个最小示例 ===========================================\n", + "if __name__ == \"__main__\":\n", + " paddle.seed(2025)\n", + " # 配置\n", + " D = 30 # 数值特征维度\n", + " C = 4 # 多标签数\n", + " N_train, N_val = 5000, 1000\n", + " batch_size = 128\n", + " epochs = 5\n", + " lr = 3e-4\n", + "\n", + " # 数据\n", + " train_ds = ToyMultiLabelDataset(N_train, D, seed=42)\n", + " val_ds = ToyMultiLabelDataset(N_val, D, seed=233)\n", + " train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True, drop_last=False)\n", + " val_loader = DataLoader(val_ds, batch_size=batch_size, shuffle=False, drop_last=False)\n", + "\n", + " # 类别不平衡(可选):按训练集估计每个标签的正例比例,构造 pos_weight\n", + " y_train = np.vstack([y for _, y in train_ds])\n", + " pos_ratio = np.clip(y_train.mean(axis=0), 1e-3, 1-1e-3) # (4,)\n", + " # 经典做法:pos_weight = (N_neg / N_pos) = (1-p)/p\n", + " pos_weight_np = (1.0 - pos_ratio) / pos_ratio\n", + " pos_weight = paddle.to_tensor(pos_weight_np.astype('float32')) # (4,)\n", + "\n", + " # 模型\n", + " backbone_cfg = dict(n_blocks=3, d_hidden=512, dropout=0.1)\n", + " model = MultiLabelClassifier(num_features=D, num_labels=C,\n", + " arch_type='tabm', k=16,\n", + " backbone_cfg=backbone_cfg)\n", + "\n", + " optimizer = paddle.optimizer.Adam(learning_rate=lr, parameters=model.parameters())\n", + "\n", + " # 训练\n", + " best_macro_f1, best_state = -1.0, None\n", + " for ep in range(1, epochs + 1):\n", + " train_loss = train_one_epoch(model, train_loader, optimizer,\n", + " pos_weight=pos_weight, clip_grad_norm=1.0)\n", + " val_metrics = evaluate(model, val_loader, threshold=0.5)\n", + " print(f\"[Epoch {ep:02d}] train_loss={train_loss:.4f} | \"\n", + " f\"val_loss={val_metrics['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics['micro_AP']:.4f}\")\n", + " # 记录最佳\n", + " if val_metrics[\"macro_f1\"] > best_macro_f1:\n", + " best_macro_f1 = val_metrics[\"macro_f1\"]\n", + " best_state = {k: v.clone() for k, v in model.state_dict().items()}\n", + "\n", + " if best_state is not None:\n", + " model.set_state_dict(best_state)\n", + " print(f\"Loaded best state with macro_f1={best_macro_f1:.4f}\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qOJBZjSyGpSA", + "outputId": "c23c05d7-0f63-406f-fbcc-66ea0c3065fc" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/tmp/ipython-input-1539235308.py:108: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", + " auc_pr = np.trapz(precision, recall)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[Epoch 01] train_loss=0.4427 | val_loss=1.5854 | macro_f1=0.4728 | micro_f1=0.4734 | per_class_f1=[0.5263158082962036, 0.5373737215995789, 0.4471057951450348, 0.38046795129776] | micro_AP=0.4584\n", + "[Epoch 02] train_loss=0.1538 | val_loss=2.9504 | macro_f1=0.4818 | micro_f1=0.4837 | per_class_f1=[0.553903341293335, 0.5406504273414612, 0.44742268323898315, 0.38532111048698425] | micro_AP=0.4769\n", + "[Epoch 03] train_loss=0.1057 | val_loss=3.7486 | macro_f1=0.4919 | micro_f1=0.4941 | per_class_f1=[0.5516605377197266, 0.568965494632721, 0.4606299102306366, 0.38624873757362366] | micro_AP=0.4722\n", + "[Epoch 04] train_loss=0.0917 | val_loss=4.2100 | macro_f1=0.4762 | micro_f1=0.4774 | per_class_f1=[0.5183752179145813, 0.557729959487915, 0.43551796674728394, 0.3932472765445709] | micro_AP=0.4652\n", + "[Epoch 05] train_loss=0.0732 | val_loss=4.7243 | macro_f1=0.4810 | micro_f1=0.4820 | per_class_f1=[0.5422138571739197, 0.5443425178527832, 0.4589178264141083, 0.3785425126552582] | micro_AP=0.4507\n", + "Loaded best state with macro_f1=0.4919\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# 2D Resnet+单路Transformer" + ], + "metadata": { + "id": "v9JGCidO2tmH" + } + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math\n", + "from typing import Optional, Literal, Tuple\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "from paddle.vision.models import resnet18\n", + "\n", + "# ====================== 工具:正弦位置编码 ======================\n", + "class SinusoidalPositionalEncoding(nn.Layer):\n", + " def __init__(self, d_model: int, max_len: int = 2048):\n", + " super().__init__()\n", + " pe = np.zeros((max_len, d_model), dtype=\"float32\")\n", + " position = np.arange(0, max_len, dtype=\"float32\")[:, None]\n", + " div_term = np.exp(np.arange(0, d_model, 2, dtype=\"float32\") * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = np.sin(position * div_term)\n", + " pe[:, 1::2] = np.cos(position * div_term)\n", + " self.register_buffer(\"pe\", paddle.to_tensor(pe), persistable=False)\n", + "\n", + " def forward(self, x): # x: (B, T, D)\n", + " T = x.shape[1]\n", + " return x + self.pe[:T, :]\n", + "\n", + "# ====================== 简化版 TabM ======================\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " \"\"\"占位实现:MLP → (B, H)。可直接替换为你修好的 TabM。\"\"\"\n", + " def __init__(self, num_features: int, d_hidden: int = 512, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(num_features, d_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_hidden, d_hidden),\n", + " nn.ReLU(),\n", + " )\n", + " self.d_hidden = d_hidden\n", + "\n", + " def forward(self, x_num: paddle.Tensor): # (B, 424)\n", + " return self.net(x_num) # (B, H)\n", + "\n", + "# ====================== ResNet18 特征抽取(逐帧) ======================\n", + "class ResNet18FrameEncoder(nn.Layer):\n", + " \"\"\"将 ResNet18 改为 20 通道输入;输出每帧 512 维特征。\"\"\"\n", + " def __init__(self, in_channels: int = 20):\n", + " super().__init__()\n", + " self.backbone = resnet18(pretrained=False)\n", + " # 改首层卷积为 20 通道\n", + " self.backbone.conv1 = nn.Conv2D(in_channels, 64, kernel_size=7, stride=2, padding=3, bias_attr=False)\n", + " # 去掉分类头 fc,保留到 avgpool\n", + " self.avgpool = self.backbone.avgpool # AdaptiveAvgPool2D(1)\n", + " # 记录下游维度\n", + " self.out_dim = 512\n", + "\n", + " def forward(self, x): # x: (B*T, C=20, H=20, W=20)\n", + " m = self.backbone\n", + " x = m.conv1(x); x = m.bn1(x); x = F.relu(x); x = m.maxpool(x)\n", + " x = m.layer1(x); x = m.layer2(x); x = m.layer3(x); x = m.layer4(x)\n", + " x = self.avgpool(x) # (B*T, 512, 1, 1)\n", + " x = paddle.flatten(x, 1) # (B*T, 512)\n", + " return x\n", + "\n", + "# ====================== 时序 Transformer 编码器 ======================\n", + "class TemporalTransformer(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, num_layers=4, dim_feedforward=1024, dropout=0.1, max_len=1024):\n", + " super().__init__()\n", + " enc_layer = nn.TransformerEncoderLayer(d_model=d_model, nhead=nhead,\n", + " dim_feedforward=dim_feedforward,\n", + " dropout=dropout, activation='relu')\n", + " self.encoder = nn.TransformerEncoder(enc_layer, num_layers=num_layers)\n", + " self.pos = SinusoidalPositionalEncoding(d_model, max_len=max_len)\n", + "\n", + " def forward(self, x): # x: (B, T, D)\n", + " x = self.pos(x)\n", + " # Paddle 的 Transformer 期望 (T, B, D)\n", + " x = paddle.transpose(x, [1, 0, 2]) # (T,B,D)\n", + " z = self.encoder(x) # (T,B,D)\n", + " z = paddle.transpose(z, [1, 0, 2]) # (B,T,D)\n", + " return z\n", + "\n", + "# ====================== 多头注意力(支持 q from A, kv from B) ======================\n", + "class MultiHeadCrossAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_model = d_model\n", + " self.nhead = nhead\n", + " self.d_head = d_model // nhead\n", + " self.Wq = nn.Linear(d_model, d_model)\n", + " self.Wk = nn.Linear(d_model, d_model)\n", + " self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.ln = nn.LayerNorm(d_model)\n", + "\n", + " def forward(self, q, kv):\n", + " \"\"\"\n", + " q: (B, Nq, D)\n", + " kv: (B, Nk, D)\n", + " return: (B, Nq, D) # 残差 + LN\n", + " \"\"\"\n", + " B, Nq, D = q.shape\n", + " Nk = kv.shape[1]\n", + "\n", + " q_lin = self.Wq(q) # (B,Nq,D)\n", + " k_lin = self.Wk(kv) # (B,Nk,D)\n", + " v_lin = self.Wv(kv) # (B,Nk,D)\n", + "\n", + " def split_heads(t): # (B,N,Heads,dh)\n", + " return t.reshape([B, -1, self.nhead, self.d_head]).transpose([0, 2, 1, 3])\n", + "\n", + " qh = split_heads(q_lin) # (B,H,Nq,dh)\n", + " kh = split_heads(k_lin) # (B,H,Nk,dh)\n", + " vh = split_heads(v_lin) # (B,H,Nk,dh)\n", + "\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head) # (B,H,Nq,Nk)\n", + " attn = F.softmax(scores, axis=-1)\n", + " ctx = paddle.matmul(attn, vh) # (B,H,Nq,dh)\n", + "\n", + " ctx = ctx.transpose([0, 2, 1, 3]).reshape([B, Nq, D]) # (B,Nq,D)\n", + " out = self.proj(ctx)\n", + " out = self.drop(out)\n", + " # 残差 + LN\n", + " return self.ln(out + q)\n", + "\n", + "# ====================== 融合头(双向 Cross-Attn) ======================\n", + "class BiModalCrossFusion(nn.Layer):\n", + " \"\"\"\n", + " 输入:\n", + " video_seq: (B, T, D) —— Transformer 后的视频序列\n", + " tabm_tok: (B, D) —— TabM token\n", + " 过程:\n", + " v_token = mean(video_seq)\n", + " v' = CrossAttn(q=v_token[1], kv=tabm_token[1])\n", + " t' = CrossAttn(q=tabm_token[1], kv=video_seq[T])\n", + " fuse = concat([v', t']) → MLP\n", + " \"\"\"\n", + " def __init__(self, d_model=512, nhead=8, dropout=0.1, fuse_hidden=512):\n", + " super().__init__()\n", + " self.ca_v_from_t = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.ca_t_from_v = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.fuse = nn.Sequential(\n", + " nn.Linear(2 * d_model, fuse_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " )\n", + " self.out_dim = fuse_hidden\n", + "\n", + " def forward(self, video_seq, tabm_tok):\n", + " B, T, D = video_seq.shape\n", + " # 池化出视频 token\n", + " v_tok = video_seq.mean(axis=1, keepdim=True) # (B,1,D)\n", + " t_tok = tabm_tok.unsqueeze(1) # (B,1,D)\n", + "\n", + " v_upd = self.ca_v_from_t(v_tok, t_tok) # (B,1,D)\n", + " t_upd = self.ca_t_from_v(t_tok, video_seq) # (B,1,D)\n", + "\n", + " fused = paddle.concat([v_upd, t_upd], axis=-1) # (B,1,2D)\n", + " fused = fused.squeeze(1) # (B,2D)\n", + " return self.fuse(fused) # (B, F)\n", + "\n", + "# ====================== 总模型 ======================\n", + "class TwoModalMultiLabelModel(nn.Layer):\n", + " def __init__(self,\n", + " # 视频模态\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=36,\n", + " # 结构化模态\n", + " vec_dim=424,\n", + " # 维度与结构\n", + " d_model=512, nhead=8, n_trans_layers=4, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1, num_labels=4):\n", + " super().__init__()\n", + " # A: 逐帧 ResNet18\n", + " self.frame_encoder = ResNet18FrameEncoder(in_channels=vid_channels) # (B*T,512)\n", + " # A: 时序 Transformer\n", + " self.temporal = TemporalTransformer(d_model=d_model,\n", + " nhead=nhead,\n", + " num_layers=n_trans_layers,\n", + " dim_feedforward=trans_ff,\n", + " dropout=dropout,\n", + " max_len=vid_frames)\n", + " # B: TabM(或替换为你的 TabM)\n", + " self.tabm = TabMFeatureExtractor(vec_dim, d_hidden=tabm_hidden, dropout=dropout)\n", + " self.tabm_proj = nn.Linear(tabm_hidden, d_model) # 对齐到 d_model\n", + " # 融合:双向 Cross-Attention\n", + " self.fusion = BiModalCrossFusion(d_model=d_model, nhead=nhead, dropout=dropout, fuse_hidden=d_model)\n", + " # 分类头\n", + " self.head = nn.Linear(self.fusion.out_dim, num_labels)\n", + "\n", + " def forward(self, x_video, x_vec):\n", + " \"\"\"\n", + " x_video: (B, T, C=20, H=20, W=20)\n", + " x_vec: (B, 424)\n", + " \"\"\"\n", + " B, T, C, H, W = x_video.shape\n", + " # ---- A: 逐帧 ResNet ----\n", + " xvt = x_video.reshape([B * T, C, H, W]) # (B*T, C, H, W)\n", + " f_frame = self.frame_encoder(xvt) # (B*T, 512)\n", + " f_seq = f_frame.reshape([B, T, -1]) # (B, T, 512)\n", + " # ---- A: 时序 Transformer ----\n", + " z_vid = self.temporal(f_seq) # (B, T, 512)\n", + " # ---- B: TabM 特征 ----\n", + " z_tabm = self.tabm(x_vec) # (B, H_tabm)\n", + " z_tabm = self.tabm_proj(z_tabm) # (B, 512)\n", + " # ---- Cross-Attention 融合 ----\n", + " fused = self.fusion(z_vid, z_tabm) # (B, 512)\n", + " # ---- 分类 ----\n", + " logits = self.head(fused) # (B, 4)\n", + " return logits\n", + "\n", + "# ====================== 指标与训练循环(与前一致) ======================\n", + "def f1_per_class(y_true: np.ndarray, y_pred: np.ndarray, eps: float = 1e-9) -> Tuple[np.ndarray, float, float]:\n", + " assert y_true.shape == y_pred.shape\n", + " N, C = y_true.shape\n", + " f1_c = np.zeros(C, dtype=np.float32)\n", + " for c in range(C):\n", + " yt, yp = y_true[:, c], y_pred[:, c]\n", + " tp = np.sum((yt == 1) & (yp == 1))\n", + " fp = np.sum((yt == 0) & (yp == 1))\n", + " fn = np.sum((yt == 1) & (yp == 0))\n", + " prec = tp / (tp + fp + eps)\n", + " rec = tp / (tp + fn + eps)\n", + " f1_c[c] = 2 * prec * rec / (prec + rec + eps)\n", + " macro_f1 = float(np.mean(f1_c))\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " prec = tp / (tp + fp + 1e-9)\n", + " rec = tp / (tp + fn + 1e-9)\n", + " micro_f1 = 2 * prec * rec / (prec + rec + 1e-9)\n", + " return f1_c, macro_f1, float(micro_f1)\n", + "\n", + "def average_precision_micro(y_true: np.ndarray, y_prob: np.ndarray, num_thresholds: int = 101) -> float:\n", + " thresholds = np.linspace(0.0, 1.0, num_thresholds)\n", + " precision, recall = [], []\n", + " for t in thresholds:\n", + " y_pred = (y_prob >= t).astype(np.float32)\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " p = tp / (tp + fp + 1e-9)\n", + " r = tp / (tp + fn + 1e-9)\n", + " precision.append(p); recall.append(r)\n", + " order = np.argsort(recall)\n", + " recall = np.array(recall)[order]\n", + " precision = np.array(precision)[order]\n", + " return float(np.trapz(precision, recall))\n", + "\n", + "def train_one_epoch(model, loader, optimizer,\n", + " pos_weight: Optional[paddle.Tensor] = None,\n", + " clip_grad_norm: Optional[float] = None):\n", + " model.train()\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " if pos_weight is not None:\n", + " loss = F.binary_cross_entropy_with_logits(logits, y.astype('float32'), pos_weight=pos_weight)\n", + " else:\n", + " loss = F.binary_cross_entropy_with_logits(logits, y.astype('float32'))\n", + " loss.backward()\n", + " if clip_grad_norm is not None:\n", + " nn.utils.clip_grad_norm_(model.parameters(), max_norm=clip_grad_norm)\n", + " optimizer.step()\n", + " optimizer.clear_grad()\n", + " total_loss += float(loss); total_batches += 1\n", + " return total_loss / max(1, total_batches)\n", + "\n", + "@paddle.no_grad()\n", + "def evaluate(model, loader, threshold: float = 0.5):\n", + " model.eval()\n", + " ys, ps = [], []\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " loss = F.binary_cross_entropy_with_logits(logits, y.astype('float32'))\n", + " prob = F.sigmoid(logits).numpy()\n", + " ys.append(y.numpy()); ps.append(prob)\n", + " total_loss += float(loss); total_batches += 1\n", + " y_true = np.concatenate(ys, axis=0)\n", + " y_prob = np.concatenate(ps, axis=0)\n", + " y_pred = (y_prob >= threshold).astype(np.float32)\n", + " per_f1, macro_f1, micro_f1 = f1_per_class(y_true, y_pred)\n", + " ap_micro = average_precision_micro(y_true, y_prob)\n", + " return {\n", + " \"loss\": total_loss / max(1, total_batches),\n", + " \"macro_f1\": macro_f1,\n", + " \"micro_f1\": micro_f1,\n", + " \"per_class_f1\": per_f1.tolist(),\n", + " \"micro_AP\": ap_micro\n", + " }\n", + "\n", + "# ====================== 合成数据集(可替换为真实数据) ======================\n", + "class ToyTwoModalDataset(Dataset):\n", + " \"\"\"\n", + " 返回:\n", + " x_video: (T=365, C=20, H=20, W=20)\n", + " x_vec: (424,)\n", + " y: (4,) 0/1\n", + " \"\"\"\n", + " def __init__(self, n: int, seed: int = 0):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.n = n\n", + " # 按 (n, T, C, H, W)\n", + " self.video = rng.normal(size=(n, 36, 20, 20, 20)).astype('float32')\n", + " self.vec = rng.normal(size=(n, 424)).astype('float32')\n", + "\n", + " # 造标签:对视频先在 H/W 上均值,再在 T 上均值 → (n, C=20)\n", + " vid_hw = self.video.mean(axis=(3, 4)) # (n, T, C)\n", + " vid_avg = vid_hw.mean(axis=1) # (n, C)\n", + "\n", + " # 线性映射到 4 个标签\n", + " Wv = rng.normal(size=(20, 4)) # C→4\n", + " Wt = rng.normal(size=(424, 4)) # 424→4\n", + " logits = vid_avg @ Wv + self.vec @ Wt + rng.normal(scale=0.5, size=(n, 4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.y = (probs > 0.5).astype('float32')\n", + "\n", + " def __getitem__(self, idx: int):\n", + " x_vid = self.video[idx] # (T,C,H,W)\n", + " x_vec = self.vec[idx] # (424,)\n", + " y = self.y[idx] # (4,)\n", + " return x_vid, x_vec, y\n", + "\n", + " def __len__(self):\n", + " return self.n\n", + "\n", + "# ====================== 训练入口(可直接运行) ======================\n", + "if __name__ == \"__main__\":\n", + " paddle.seed(2025)\n", + " # 数据\n", + " train_ds = ToyTwoModalDataset(n=64, seed=42) # 注意:真实训练建议更大数据与多卡\n", + " val_ds = ToyTwoModalDataset(n=32, seed=233)\n", + " # 自定义 collate:让视频变成 (B,T,C,H,W)\n", + " def collate_fn(batch):\n", + " vids, vecs, ys = zip(*batch)\n", + " return (paddle.to_tensor(np.stack(vids, 0)), # (B,T,C,H,W)\n", + " paddle.to_tensor(np.stack(vecs, 0)), # (B,424)\n", + " paddle.to_tensor(np.stack(ys, 0))) # (B,4)\n", + " train_loader = DataLoader(train_ds, batch_size=2, shuffle=True, drop_last=False, collate_fn=collate_fn)\n", + " val_loader = DataLoader(val_ds, batch_size=2, shuffle=False, drop_last=False, collate_fn=collate_fn)\n", + "\n", + " # 类别不平衡权重(可选)\n", + " y_train = np.stack([y for _, _, y in train_ds], 0)\n", + " pos_ratio = np.clip(y_train.mean(axis=0), 1e-3, 1-1e-3)\n", + " pos_weight = paddle.to_tensor(((1-pos_ratio)/pos_ratio).astype('float32')) # (4,)\n", + "\n", + " # 模型\n", + " model = TwoModalMultiLabelModel(\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=36,\n", + " vec_dim=424,\n", + " d_model=512, nhead=2, n_trans_layers=2, trans_ff=1024, # 可调\n", + " tabm_hidden=512, dropout=0.1,\n", + " num_labels=4\n", + " )\n", + " optimizer = paddle.optimizer.Adam(learning_rate=3e-4, parameters=model.parameters())\n", + "\n", + " # 训练(演示用:小 epoch)\n", + " best_macro_f1, best = -1.0, None\n", + " for ep in range(1, 3+1):\n", + " train_loss = train_one_epoch(model, train_loader, optimizer,\n", + " pos_weight=pos_weight, clip_grad_norm=1.0)\n", + " val_metrics = evaluate(model, val_loader, threshold=0.5)\n", + " print(f\"[Epoch {ep:02d}] train_loss={train_loss:.4f} | \"\n", + " f\"val_loss={val_metrics['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics['micro_AP']:.4f}\")\n", + " if val_metrics[\"macro_f1\"] > best_macro_f1:\n", + " best_macro_f1 = val_metrics[\"macro_f1\"]\n", + " best = {k: v.clone() for k, v in model.state_dict().items()}\n", + "\n", + " if best is not None:\n", + " model.set_state_dict(best)\n", + " print(f\"Loaded best state with macro_f1={best_macro_f1:.4f}\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "X7-O1-LZLHB2", + "outputId": "124d09eb-3e79-4622-f0b3-b2bf7eb11d60" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/tmp/ipython-input-3157620546.py:248: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", + " return float(np.trapz(precision, recall))\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[Epoch 01] train_loss=1.1304 | val_loss=1.0465 | macro_f1=0.3765 | micro_f1=0.5079 | per_class_f1=[0.5, 0.7450980544090271, 0.260869562625885, 0.0] | micro_AP=0.5393\n", + "[Epoch 02] train_loss=0.7661 | val_loss=0.9369 | macro_f1=0.5812 | micro_f1=0.6173 | per_class_f1=[0.5454545617103577, 0.7599999904632568, 0.6382978558540344, 0.380952388048172] | micro_AP=0.4165\n", + "[Epoch 03] train_loss=0.4050 | val_loss=1.9395 | macro_f1=0.6107 | micro_f1=0.6303 | per_class_f1=[0.5454545617103577, 0.7234042286872864, 0.6938775777816772, 0.47999998927116394] | micro_AP=0.3836\n", + "Loaded best state with macro_f1=0.6107\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# 2D Resnet+单路Transformer+MoE" + ], + "metadata": { + "id": "xk9lS9M-3AUc" + } + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math\n", + "from typing import Optional, Tuple\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "from paddle.vision.models import resnet18\n", + "\n", + "# ====================== 工具:正弦位置编码 ======================\n", + "class SinusoidalPositionalEncoding(nn.Layer):\n", + " def __init__(self, d_model: int, max_len: int = 2048):\n", + " super().__init__()\n", + " pe = np.zeros((max_len, d_model), dtype=\"float32\")\n", + " position = np.arange(0, max_len, dtype=\"float32\")[:, None]\n", + " div_term = np.exp(np.arange(0, d_model, 2, dtype=\"float32\") * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = np.sin(position * div_term)\n", + " pe[:, 1::2] = np.cos(position * div_term)\n", + " self.register_buffer(\"pe\", paddle.to_tensor(pe), persistable=False)\n", + "\n", + " def forward(self, x): # x: (B, T, D)\n", + " T = x.shape[1]\n", + " return x + self.pe[:T, :]\n", + "\n", + "# ====================== 简化版 TabM ======================\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " \"\"\"占位实现:MLP → (B, H)。可直接替换为你修好的 TabM。\"\"\"\n", + " def __init__(self, num_features: int, d_hidden: int = 512, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(num_features, d_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_hidden, d_hidden),\n", + " nn.ReLU(),\n", + " )\n", + " self.d_hidden = d_hidden\n", + "\n", + " def forward(self, x_num: paddle.Tensor): # (B, 424)\n", + " return self.net(x_num) # (B, H)\n", + "\n", + "# ====================== ResNet18 特征抽取(逐帧) ======================\n", + "class ResNet18FrameEncoder(nn.Layer):\n", + " \"\"\"将 ResNet18 改为 20 通道输入;输出每帧 512 维特征。\"\"\"\n", + " def __init__(self, in_channels: int = 20):\n", + " super().__init__()\n", + " self.backbone = resnet18(pretrained=False)\n", + " # 改首层卷积为 20 通道\n", + " self.backbone.conv1 = nn.Conv2D(in_channels, 64, kernel_size=7, stride=2, padding=3, bias_attr=False)\n", + " # 去掉分类头 fc,保留到 avgpool\n", + " self.avgpool = self.backbone.avgpool # AdaptiveAvgPool2D(1)\n", + " self.out_dim = 512\n", + "\n", + " def forward(self, x): # x: (B*T, C=20, H=20, W=20)\n", + " m = self.backbone\n", + " x = m.conv1(x); x = m.bn1(x); x = F.relu(x); x = m.maxpool(x)\n", + " x = m.layer1(x); x = m.layer2(x); x = m.layer3(x); x = m.layer4(x)\n", + " x = self.avgpool(x) # (B*T, 512, 1, 1)\n", + " x = paddle.flatten(x, 1) # (B*T, 512)\n", + " return x\n", + "\n", + "# ====================== MoE 基础实现(Top-k,可开关;使用 gather_nd 修复) ======================\n", + "class ExpertFFN(nn.Layer):\n", + " def __init__(self, d_model, d_ff, dropout=0.1, act='relu'):\n", + " super().__init__()\n", + " Act = getattr(F, act) if isinstance(act, str) else act\n", + " self.fc1 = nn.Linear(d_model, d_ff)\n", + " self.fc2 = nn.Linear(d_ff, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.act = Act\n", + " def forward(self, x):\n", + " return self.fc2(self.drop(self.act(self.fc1(x))))\n", + "\n", + "class MoEConfig:\n", + " def __init__(self,\n", + " n_experts=8,\n", + " top_k=1,\n", + " d_ff=2048,\n", + " dropout=0.1,\n", + " router_temp=0.5,\n", + " balance_loss_w=0.005,\n", + " entropy_reg_w=-0.005, # 负值→更尖锐\n", + " diversity_w=1e-3,\n", + " sticky_w=0.0,\n", + " sup_router_w=0.0,\n", + " use_gumbel=True):\n", + " self.n_experts = n_experts\n", + " self.top_k = top_k\n", + " self.d_ff = d_ff\n", + " self.dropout = dropout\n", + " self.router_temp = router_temp\n", + " self.balance_loss_w = balance_loss_w\n", + " self.entropy_reg_w = entropy_reg_w\n", + " self.diversity_w = diversity_w\n", + " self.sticky_w = sticky_w\n", + " self.sup_router_w = sup_router_w\n", + " self.use_gumbel = use_gumbel\n", + "\n", + "class MoE(nn.Layer):\n", + " \"\"\"forward(x, domain_id=None) → (y, aux_loss),支持 (B,T,D) 或 (N,D)\"\"\"\n", + " def __init__(self, d_model: int, cfg: MoEConfig):\n", + " super().__init__()\n", + " self.cfg = cfg\n", + " self.router = nn.Linear(d_model, cfg.n_experts)\n", + " self.experts = nn.LayerList([ExpertFFN(d_model, cfg.d_ff, cfg.dropout) for _ in range(cfg.n_experts)])\n", + " self.ln = nn.LayerNorm(d_model)\n", + " self.drop = nn.Dropout(cfg.dropout)\n", + "\n", + " def _router_probs(self, logits):\n", + " if self.cfg.use_gumbel and self.training:\n", + " u = paddle.uniform(logits.shape, min=1e-6, max=1-1e-6, dtype=logits.dtype)\n", + " g = -paddle.log(-paddle.log(u))\n", + " logits = logits + g\n", + " return F.softmax(logits / self.cfg.router_temp, axis=-1)\n", + "\n", + " def forward(self, x, domain_id=None):\n", + " orig_shape = x.shape\n", + " if len(orig_shape) == 3:\n", + " B, T, D = orig_shape\n", + " X = x.reshape([B*T, D])\n", + " else:\n", + " X = x\n", + " N, D = X.shape\n", + "\n", + " logits = self.router(X) # (N,E)\n", + " probs = self._router_probs(logits) # (N,E)\n", + " topk_val, topk_idx = paddle.topk(probs, k=self.cfg.top_k, axis=-1) # (N,k)\n", + "\n", + " # 专家并行输出\n", + " all_out = paddle.stack([e(X) for e in self.experts], axis=1) # (N,E,D)\n", + "\n", + " # === 使用 gather_nd 逐样本选择 top-k 专家 ===\n", + " arangeN = paddle.arange(N, dtype='int64')\n", + " picked_list = []\n", + " for i in range(self.cfg.top_k):\n", + " idx_i = topk_idx[:, i].astype('int64') # (N,)\n", + " idx_nd = paddle.stack([arangeN, idx_i], axis=1) # (N,2) [sample, expert]\n", + " picked_i = paddle.gather_nd(all_out, idx_nd) # (N,D)\n", + " picked_list.append(picked_i)\n", + " picked = paddle.stack(picked_list, axis=1) # (N,k,D)\n", + "\n", + " # 归一化权重并加权\n", + " w = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9) # (N,k)\n", + " Y = paddle.sum(picked * w.unsqueeze(-1), axis=1) # (N,D)\n", + "\n", + " Y = self.drop(Y)\n", + " Y = self.ln(Y + X)\n", + "\n", + " # aux loss\n", + " aux = 0.0\n", + " if self.cfg.balance_loss_w > 0:\n", + " mean_prob = probs.mean(axis=0)\n", + " target = paddle.full_like(mean_prob, 1.0 / self.cfg.n_experts)\n", + " aux = aux + self.cfg.balance_loss_w * F.mse_loss(mean_prob, target)\n", + " if self.cfg.entropy_reg_w != 0.0:\n", + " ent = -paddle.sum(probs * (paddle.log(probs + 1e-9)), axis=1).mean()\n", + " aux = aux + self.cfg.entropy_reg_w * ent\n", + " if (domain_id is not None) and (self.cfg.sup_router_w > 0):\n", + " dom = domain_id.reshape([-1])[:N] % self.cfg.n_experts\n", + " aux = aux + self.cfg.sup_router_w * F.cross_entropy(logits, dom)\n", + " if self.cfg.diversity_w > 0 and self.cfg.n_experts > 1:\n", + " # 用 top-1 硬选择近似每个专家接收的样本\n", + " chosen = F.one_hot(topk_idx[:, 0], num_classes=self.cfg.n_experts).astype('float32') # (N,E)\n", + " denom = chosen.sum(axis=0).clip(min=1.0).unsqueeze(-1)\n", + " means = (all_out * chosen.unsqueeze(-1)).sum(axis=0) / denom # (E,D)\n", + " sims = []\n", + " for i in range(self.cfg.n_experts):\n", + " for j in range(i+1, self.cfg.n_experts):\n", + " si = F.normalize(means[i:i+1], axis=-1)\n", + " sj = F.normalize(means[j:j+1], axis=-1)\n", + " sims.append((si*sj).sum())\n", + " if sims:\n", + " aux = aux + self.cfg.diversity_w * paddle.stack(sims).mean()\n", + "\n", + " if len(orig_shape) == 3:\n", + " Y = Y.reshape([B, T, D])\n", + " return Y, aux\n", + "\n", + "class MoEHead(nn.Layer):\n", + " \"\"\"单 token MoE 头,用于 fused/tabm 投影后的 (B, D)\"\"\"\n", + " def __init__(self, d_model=512, cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.moe = MoE(d_model, cfg or MoEConfig())\n", + " def forward(self, tok, domain_id=None):\n", + " y, aux = self.moe(tok.unsqueeze(1), domain_id=domain_id) # (B,1,D)\n", + " return y.squeeze(1), aux\n", + "\n", + "# ====================== 自定义 Transformer Encoder(FFN 可替换为 MoE) ======================\n", + "class TransformerEncoderLayerMoE(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, d_ff=1024, dropout=0.1,\n", + " use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.use_moe = use_moe\n", + " self.self_attn = nn.MultiHeadAttention(embed_dim=d_model, num_heads=nhead, dropout=dropout)\n", + " self.ln1 = nn.LayerNorm(d_model)\n", + " self.do1 = nn.Dropout(dropout)\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(\n", + " nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model),\n", + " )\n", + " self.do2 = nn.Dropout(dropout)\n", + "\n", + " def forward(self, x, domain_id=None): # x: (B,T,D)\n", + " # Self-Attention (pre-norm) —— Paddle MHA 期望 (T,B,D)\n", + " h = self.ln1(x)\n", + " h = paddle.transpose(h, [1, 0, 2]) # (T,B,D)\n", + " sa = self.self_attn(h, h, h) # (T,B,D)\n", + " sa = paddle.transpose(sa, [1, 0, 2]) # (B,T,D)\n", + " x = x + self.do1(sa)\n", + " aux = 0.0\n", + " if self.use_moe:\n", + " x, aux = self.moe(x, domain_id=domain_id) # 残差+LN 在 MoE 内部\n", + " else:\n", + " x = x + self.do2(self.ffn(x)) # 残差在这里\n", + " return x, aux\n", + "\n", + "class TemporalTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, num_layers=2, d_ff=1024, dropout=0.1,\n", + " max_len=1024, use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.pos = SinusoidalPositionalEncoding(d_model, max_len=max_len)\n", + " self.layers = nn.LayerList([\n", + " TransformerEncoderLayerMoE(d_model, nhead, d_ff, dropout,\n", + " use_moe=use_moe, moe_cfg=moe_cfg)\n", + " for _ in range(num_layers)\n", + " ])\n", + " def forward(self, x, domain_id=None): # x: (B,T,D)\n", + " x = self.pos(x)\n", + " aux_total = 0.0\n", + " for layer in self.layers:\n", + " x, aux = layer(x, domain_id=domain_id)\n", + " aux_total = aux_total + aux\n", + " return x, aux_total\n", + "\n", + "# ====================== 多头注意力(支持 q from A, kv from B) ======================\n", + "class MultiHeadCrossAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_model = d_model\n", + " self.nhead = nhead\n", + " self.d_head = d_model // nhead\n", + " self.Wq = nn.Linear(d_model, d_model)\n", + " self.Wk = nn.Linear(d_model, d_model)\n", + " self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.ln = nn.LayerNorm(d_model)\n", + "\n", + " def forward(self, q, kv):\n", + " B, Nq, D = q.shape\n", + " Nk = kv.shape[1]\n", + " q_lin = self.Wq(q); k_lin = self.Wk(kv); v_lin = self.Wv(kv)\n", + " def split_heads(t):\n", + " return t.reshape([B, -1, self.nhead, self.d_head]).transpose([0, 2, 1, 3])\n", + " qh = split_heads(q_lin); kh = split_heads(k_lin); vh = split_heads(v_lin)\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head)\n", + " attn = F.softmax(scores, axis=-1)\n", + " ctx = paddle.matmul(attn, vh)\n", + " ctx = ctx.transpose([0, 2, 1, 3]).reshape([B, Nq, D])\n", + " out = self.proj(ctx)\n", + " out = self.drop(out)\n", + " return self.ln(out + q)\n", + "\n", + "# ====================== 融合头(双向 Cross-Attn) ======================\n", + "class BiModalCrossFusion(nn.Layer):\n", + " \"\"\"\n", + " 输入:\n", + " video_seq: (B, T, D) —— Transformer 后的视频序列\n", + " tabm_tok: (B, D) —— TabM token\n", + " \"\"\"\n", + " def __init__(self, d_model=512, nhead=8, dropout=0.1, fuse_hidden=512):\n", + " super().__init__()\n", + " self.ca_v_from_t = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.ca_t_from_v = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.fuse = nn.Sequential(\n", + " nn.Linear(2 * d_model, fuse_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " )\n", + " self.out_dim = fuse_hidden\n", + "\n", + " def forward(self, video_seq, tabm_tok):\n", + " B, T, D = video_seq.shape\n", + " # 池化视频时间维得到 token\n", + " v_tok = video_seq.mean(axis=1, keepdim=True) # (B,1,D)\n", + " t_tok = tabm_tok.unsqueeze(1) # (B,1,D)\n", + " v_upd = self.ca_v_from_t(v_tok, t_tok) # (B,1,D)\n", + " t_upd = self.ca_t_from_v(t_tok, video_seq) # (B,1,D)\n", + " fused = paddle.concat([v_upd, t_upd], axis=-1) # (B,1,2D)\n", + " fused = fused.squeeze(1) # (B,2D)\n", + " return self.fuse(fused) # (B, F)\n", + "\n", + "# ====================== 总模型(带三个 MoE 开关) ======================\n", + "class TwoModalMultiLabelModel(nn.Layer):\n", + " def __init__(self,\n", + " # 视频模态\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=36,\n", + " # 结构化模态\n", + " vec_dim=424,\n", + " # 维度与结构\n", + " d_model=512, nhead=2, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1, num_labels=4,\n", + " # ===== MoE 开关 =====\n", + " moe_temporal: bool = True, # 时序 Transformer 的 FFN 位置\n", + " moe_fused: bool = False, # 融合 token 上的小型 MoE 头\n", + " moe_tabm: bool = False, # TabM 投影后\n", + " # ===== MoE 超参(可传入自定义) =====\n", + " moe_cfg_temporal: MoEConfig = None,\n", + " moe_cfg_fused: MoEConfig = None,\n", + " moe_cfg_tabm: MoEConfig = None):\n", + " super().__init__()\n", + " # A: 逐帧 ResNet18\n", + " self.frame_encoder = ResNet18FrameEncoder(in_channels=vid_channels)\n", + " # A: 时序 Transformer(可开/关 MoE)\n", + " self.temporal = TemporalTransformerFlexible(\n", + " d_model=d_model, nhead=nhead, num_layers=n_trans_layers,\n", + " d_ff=trans_ff, dropout=dropout, max_len=vid_frames,\n", + " use_moe=moe_temporal,\n", + " moe_cfg=moe_cfg_temporal or MoEConfig(\n", + " n_experts=8, top_k=1, d_ff=max(trans_ff, 2048), router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " )\n", + " )\n", + " # B: TabM(或你的 TabM)\n", + " self.tabm = TabMFeatureExtractor(vec_dim, d_hidden=tabm_hidden, dropout=dropout)\n", + " self.tabm_proj = nn.Linear(tabm_hidden, d_model)\n", + "\n", + " # 可选:TabM 分支 MoE 头\n", + " self.moe_tabm = moe_tabm\n", + " if moe_tabm:\n", + " self.tabm_moe = MoEHead(d_model=d_model, cfg=moe_cfg_tabm or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 融合:双向 Cross-Attention\n", + " self.fusion = BiModalCrossFusion(d_model=d_model, nhead=nhead, dropout=dropout, fuse_hidden=d_model)\n", + "\n", + " # 可选:融合 token MoE 头\n", + " self.moe_fused = moe_fused\n", + " if moe_fused:\n", + " self.fused_moe = MoEHead(d_model=d_model, cfg=moe_cfg_fused or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 分类头\n", + " self.head = nn.Linear(self.fusion.out_dim, num_labels)\n", + "\n", + " def forward(self, x_video, x_vec, domain_id=None):\n", + " \"\"\"\n", + " x_video: (B, T, C=20, H=20, W=20)\n", + " x_vec: (B, 424)\n", + " domain_id: (B,) 或 None —— 若有域/季节/站点标签,可传入以做监督路由(可选)\n", + " \"\"\"\n", + " B, T, C, H, W = x_video.shape\n", + " # ---- A: 逐帧 ResNet ----\n", + " xvt = x_video.reshape([B * T, C, H, W]) # (B*T, C, H, W)\n", + " f_frame = self.frame_encoder(xvt) # (B*T, 512)\n", + " f_seq = f_frame.reshape([B, T, -1]) # (B, T, 512)\n", + " # ---- A: 时序 Transformer (可含 MoE) ----\n", + " z_vid, aux_total = self.temporal(f_seq, domain_id=domain_id) # (B,T,512), aux\n", + "\n", + " # ---- B: TabM 特征 ----\n", + " z_tabm = self.tabm(x_vec) # (B, H_tabm)\n", + " z_tabm = self.tabm_proj(z_tabm) # (B, 512)\n", + " if self.moe_tabm:\n", + " z_tabm, aux_t = self.tabm_moe(z_tabm, domain_id=domain_id) # (B,512)\n", + " aux_total = aux_total + aux_t\n", + "\n", + " # ---- Cross-Attention 融合 ----\n", + " fused = self.fusion(z_vid, z_tabm) # (B, 512)\n", + "\n", + " # ---- 融合 MoE 头(可选) ----\n", + " if self.moe_fused:\n", + " fused, aux_f = self.fused_moe(fused, domain_id=domain_id) # (B,512)\n", + " aux_total = aux_total + aux_f\n", + "\n", + " # ---- 分类 ----\n", + " logits = self.head(fused) # (B, 4)\n", + " return logits, aux_total\n", + "\n", + "# ====================== 指标与训练循环(兼容 aux_loss) ======================\n", + "def f1_per_class(y_true: np.ndarray, y_pred: np.ndarray, eps: float = 1e-9) -> Tuple[np.ndarray, float, float]:\n", + " assert y_true.shape == y_pred.shape\n", + " N, C = y_true.shape\n", + " f1_c = np.zeros(C, dtype=np.float32)\n", + " for c in range(C):\n", + " yt, yp = y_true[:, c], y_pred[:, c]\n", + " tp = np.sum((yt == 1) & (yp == 1))\n", + " fp = np.sum((yt == 0) & (yp == 1))\n", + " fn = np.sum((yt == 1) & (yp == 0))\n", + " prec = tp / (tp + fp + eps)\n", + " rec = tp / (tp + fn + eps)\n", + " f1_c[c] = 2 * prec * rec / (prec + rec + eps)\n", + " macro_f1 = float(np.mean(f1_c))\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " prec = tp / (tp + fp + 1e-9)\n", + " rec = tp / (tp + fn + 1e-9)\n", + " micro_f1 = 2 * prec * rec / (prec + rec + 1e-9)\n", + " return f1_c, macro_f1, float(micro_f1)\n", + "\n", + "def average_precision_micro(y_true: np.ndarray, y_prob: np.ndarray, num_thresholds: int = 101) -> float:\n", + " thresholds = np.linspace(0.0, 1.0, num_thresholds)\n", + " precision, recall = [], []\n", + " for t in thresholds:\n", + " y_pred = (y_prob >= t).astype(np.float32)\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " p = tp / (tp + fp + 1e-9)\n", + " r = tp / (tp + fn + 1e-9)\n", + " precision.append(p); recall.append(r)\n", + " order = np.argsort(recall)\n", + " recall = np.array(recall)[order]\n", + " precision = np.array(precision)[order]\n", + " return float(np.trapz(precision, recall))\n", + "\n", + "LAMBDA_MOE = 0.01 # MoE 辅助损失系数\n", + "\n", + "def train_one_epoch(model, loader, optimizer,\n", + " pos_weight: Optional[paddle.Tensor] = None,\n", + " clip_grad_norm: Optional[float] = None):\n", + " model.train()\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, aux = model(x_vid.astype('float32'), x_vec.astype('float32')) # ← 接收 aux\n", + " if pos_weight is not None:\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'), pos_weight=pos_weight)\n", + " else:\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'))\n", + " loss = cls + LAMBDA_MOE * aux\n", + " loss.backward()\n", + " if clip_grad_norm is not None:\n", + " nn.utils.clip_grad_norm_(model.parameters(), max_norm=clip_grad_norm)\n", + " optimizer.step()\n", + " optimizer.clear_grad()\n", + " total_loss += float(loss); total_batches += 1\n", + " return total_loss / max(1, total_batches)\n", + "\n", + "@paddle.no_grad()\n", + "def evaluate(model, loader, threshold: float = 0.5):\n", + " model.eval()\n", + " ys, ps = [], []\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, aux = model(x_vid.astype('float32'), x_vec.astype('float32')) # ← 接收 aux\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'))\n", + " loss = cls + LAMBDA_MOE * aux\n", + " prob = F.sigmoid(logits).numpy()\n", + " ys.append(y.numpy()); ps.append(prob)\n", + " total_loss += float(loss); total_batches += 1\n", + " y_true = np.concatenate(ys, axis=0)\n", + " y_prob = np.concatenate(ps, axis=0)\n", + " y_pred = (y_prob >= threshold).astype(np.float32)\n", + " per_f1, macro_f1, micro_f1 = f1_per_class(y_true, y_pred)\n", + " ap_micro = average_precision_micro(y_true, y_prob)\n", + " return {\n", + " \"loss\": total_loss / max(1, total_batches),\n", + " \"macro_f1\": macro_f1,\n", + " \"micro_f1\": micro_f1,\n", + " \"per_class_f1\": per_f1.tolist(),\n", + " \"micro_AP\": ap_micro\n", + " }\n", + "\n", + "# ====================== 合成数据集(可替换为真实数据) ======================\n", + "class ToyTwoModalDataset(Dataset):\n", + " \"\"\"\n", + " 返回:\n", + " x_video: (T=36, C=20, H=20, W=20)\n", + " x_vec: (424,)\n", + " y: (4,) 0/1\n", + " \"\"\"\n", + " def __init__(self, n: int, seed: int = 0):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.n = n\n", + " # 按 (n, T, C, H, W)\n", + " self.video = rng.normal(size=(n, 36, 20, 20, 20)).astype('float32')\n", + " self.vec = rng.normal(size=(n, 424)).astype('float32')\n", + "\n", + " # 造标签:对视频先在 H/W 上均值,再在 T 上均值 → (n, C=20)\n", + " vid_hw = self.video.mean(axis=(3, 4)) # (n, T, C)\n", + " vid_avg = vid_hw.mean(axis=1) # (n, C)\n", + "\n", + " # 线性映射到 4 个标签\n", + " Wv = rng.normal(size=(20, 4)) # C→4\n", + " Wt = rng.normal(size=(424, 4)) # 424→4\n", + " logits = vid_avg @ Wv + self.vec @ Wt + rng.normal(scale=0.5, size=(n, 4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.y = (probs > 0.5).astype('float32')\n", + "\n", + " def __getitem__(self, idx: int):\n", + " x_vid = self.video[idx] # (T,C,H,W)\n", + " x_vec = self.vec[idx] # (424,)\n", + " y = self.y[idx] # (4,)\n", + " return x_vid, x_vec, y\n", + "\n", + " def __len__(self):\n", + " return self.n\n", + "\n", + "# ====================== 训练入口(可直接运行) ======================\n", + "if __name__ == \"__main__\":\n", + " paddle.seed(2025)\n", + " # 数据\n", + " train_ds = ToyTwoModalDataset(n=64, seed=42)\n", + " val_ds = ToyTwoModalDataset(n=32, seed=233)\n", + " def collate_fn(batch):\n", + " vids, vecs, ys = zip(*batch)\n", + " return (paddle.to_tensor(np.stack(vids, 0)), # (B,T,C,H,W)\n", + " paddle.to_tensor(np.stack(vecs, 0)), # (B,424)\n", + " paddle.to_tensor(np.stack(ys, 0))) # (B,4)\n", + " train_loader = DataLoader(train_ds, batch_size=2, shuffle=True, drop_last=False, collate_fn=collate_fn)\n", + " val_loader = DataLoader(val_ds, batch_size=2, shuffle=False, drop_last=False, collate_fn=collate_fn)\n", + "\n", + " # 类别不平衡权重(可选)\n", + " y_train = np.stack([y for _, _, y in train_ds], 0)\n", + " pos_ratio = np.clip(y_train.mean(axis=0), 1e-3, 1-1e-3)\n", + " pos_weight = paddle.to_tensor(((1-pos_ratio)/pos_ratio).astype('float32')) # (4,)\n", + "\n", + " # === 构建模型:三处 MoE 开关(默认只开时序 MoE) ===\n", + " model = TwoModalMultiLabelModel(\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=36,\n", + " vec_dim=424,\n", + " d_model=512, nhead=2, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1,\n", + " num_labels=4,\n", + " moe_temporal=True, # 开:时序 Transformer 的 FFN 位置\n", + " moe_fused=False, # 关:融合 token MoE 头\n", + " moe_tabm=False # 关:TabM 投影后 MoE\n", + " )\n", + " optimizer = paddle.optimizer.Adam(learning_rate=3e-4, parameters=model.parameters())\n", + "\n", + " # 训练(演示用:小 epoch)\n", + " best_macro_f1, best = -1.0, None\n", + " for ep in range(1, 3+1):\n", + " train_loss = train_one_epoch(model, train_loader, optimizer,\n", + " pos_weight=pos_weight, clip_grad_norm=1.0)\n", + " val_metrics = evaluate(model, val_loader, threshold=0.5)\n", + " print(f\"[Epoch {ep:02d}] train_loss={train_loss:.4f} | \"\n", + " f\"val_loss={val_metrics['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics['micro_AP']:.4f}\")\n", + " if val_metrics[\"macro_f1\"] > best_macro_f1:\n", + " best_macro_f1 = val_metrics[\"macro_f1\"]\n", + " best = {k: v.clone() for k, v in model.state_dict().items()}\n", + "\n", + " if best is not None:\n", + " model.set_state_dict(best)\n", + " print(f\"Loaded best state with macro_f1={best_macro_f1:.4f}\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K5On1aO5QtFw", + "outputId": "aeecef88-dd57-4133-8156-f3dd9b6e0c90" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/tmp/ipython-input-3896222078.py:427: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", + " return float(np.trapz(precision, recall))\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[Epoch 01] train_loss=1.0045 | val_loss=0.8427 | macro_f1=0.1364 | micro_f1=0.2609 | per_class_f1=[0.0, 0.0, 0.0, 0.5454545617103577] | micro_AP=0.4593\n", + "[Epoch 02] train_loss=0.6558 | val_loss=1.0130 | macro_f1=0.4563 | micro_f1=0.5342 | per_class_f1=[0.5945945978164673, 0.0, 0.6938775777816772, 0.5365853905677795] | micro_AP=0.5376\n", + "[Epoch 03] train_loss=0.2265 | val_loss=1.3452 | macro_f1=0.4934 | micro_f1=0.5625 | per_class_f1=[0.4000000059604645, 0.7234042286872864, 0.6000000238418579, 0.25] | micro_AP=0.5076\n", + "Loaded best state with macro_f1=0.4934\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# 2D Resnet+单路Transformer+MoE+KNN-Based Retrieve" + ], + "metadata": { + "id": "UgIFXDdL3sDB" + } + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math\n", + "from typing import Optional, Tuple\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "from paddle.vision.models import resnet18\n", + "\n", + "# ====================== 工具:正弦位置编码 ======================\n", + "class SinusoidalPositionalEncoding(nn.Layer):\n", + " def __init__(self, d_model: int, max_len: int = 2048):\n", + " super().__init__()\n", + " pe = np.zeros((max_len, d_model), dtype=\"float32\")\n", + " position = np.arange(0, max_len, dtype=\"float32\")[:, None]\n", + " div_term = np.exp(np.arange(0, d_model, 2, dtype=\"float32\") * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = np.sin(position * div_term)\n", + " pe[:, 1::2] = np.cos(position * div_term)\n", + " self.register_buffer(\"pe\", paddle.to_tensor(pe), persistable=False)\n", + "\n", + " def forward(self, x): # x: (B, T, D)\n", + " T = x.shape[1]\n", + " return x + self.pe[:T, :]\n", + "\n", + "# ====================== 简化版 TabM ======================\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " \"\"\"占位实现:MLP → (B, H)。可直接替换为你修好的 TabM。\"\"\"\n", + " def __init__(self, num_features: int, d_hidden: int = 512, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(num_features, d_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_hidden, d_hidden),\n", + " nn.ReLU(),\n", + " )\n", + " self.d_hidden = d_hidden\n", + "\n", + " def forward(self, x_num: paddle.Tensor): # (B, 424)\n", + " return self.net(x_num) # (B, H)\n", + "\n", + "# ====================== ResNet18 特征抽取(逐帧) ======================\n", + "class ResNet18FrameEncoder(nn.Layer):\n", + " \"\"\"将 ResNet18 改为 20 通道输入;输出每帧 512 维特征。\"\"\"\n", + " def __init__(self, in_channels: int = 20):\n", + " super().__init__()\n", + " self.backbone = resnet18(pretrained=False)\n", + " # 改首层卷积为 20 通道\n", + " self.backbone.conv1 = nn.Conv2D(in_channels, 64, kernel_size=7, stride=2, padding=3, bias_attr=False)\n", + " # 去掉分类头 fc,保留到 avgpool\n", + " self.avgpool = self.backbone.avgpool # AdaptiveAvgPool2D(1)\n", + " self.out_dim = 512\n", + "\n", + " def forward(self, x): # x: (B*T, C=20, H=20, W=20)\n", + " m = self.backbone\n", + " x = m.conv1(x); x = m.bn1(x); x = F.relu(x); x = m.maxpool(x)\n", + " x = m.layer1(x); x = m.layer2(x); x = m.layer3(x); x = m.layer4(x)\n", + " x = self.avgpool(x) # (B*T, 512, 1, 1)\n", + " x = paddle.flatten(x, 1) # (B*T, 512)\n", + " return x\n", + "\n", + "# ====================== MoE 基础实现(Top-k,可开关;使用 gather_nd 修复) ======================\n", + "class ExpertFFN(nn.Layer):\n", + " def __init__(self, d_model, d_ff, dropout=0.1, act='relu'):\n", + " super().__init__()\n", + " Act = getattr(F, act) if isinstance(act, str) else act\n", + " self.fc1 = nn.Linear(d_model, d_ff)\n", + " self.fc2 = nn.Linear(d_ff, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.act = Act\n", + " def forward(self, x):\n", + " return self.fc2(self.drop(self.act(self.fc1(x))))\n", + "\n", + "class MoEConfig:\n", + " def __init__(self,\n", + " n_experts=8,\n", + " top_k=1,\n", + " d_ff=2048,\n", + " dropout=0.1,\n", + " router_temp=0.5,\n", + " balance_loss_w=0.005,\n", + " entropy_reg_w=-0.005, # 负值→更尖锐\n", + " diversity_w=1e-3,\n", + " sticky_w=0.0,\n", + " sup_router_w=0.0,\n", + " use_gumbel=True):\n", + " self.n_experts = n_experts\n", + " self.top_k = top_k\n", + " self.d_ff = d_ff\n", + " self.dropout = dropout\n", + " self.router_temp = router_temp\n", + " self.balance_loss_w = balance_loss_w\n", + " self.entropy_reg_w = entropy_reg_w\n", + " self.diversity_w = diversity_w\n", + " self.sticky_w = sticky_w\n", + " self.sup_router_w = sup_router_w\n", + " self.use_gumbel = use_gumbel\n", + "\n", + "class MoE(nn.Layer):\n", + " \"\"\"forward(x, domain_id=None) → (y, aux_loss),支持 (B,T,D) 或 (N,D)\"\"\"\n", + " def __init__(self, d_model: int, cfg: MoEConfig):\n", + " super().__init__()\n", + " self.cfg = cfg\n", + " self.router = nn.Linear(d_model, cfg.n_experts)\n", + " self.experts = nn.LayerList([ExpertFFN(d_model, cfg.d_ff, cfg.dropout) for _ in range(cfg.n_experts)])\n", + " self.ln = nn.LayerNorm(d_model)\n", + " self.drop = nn.Dropout(cfg.dropout)\n", + "\n", + " def _router_probs(self, logits):\n", + " if self.cfg.use_gumbel and self.training:\n", + " u = paddle.uniform(logits.shape, min=1e-6, max=1-1e-6, dtype=logits.dtype)\n", + " g = -paddle.log(-paddle.log(u))\n", + " logits = logits + g\n", + " return F.softmax(logits / self.cfg.router_temp, axis=-1)\n", + "\n", + " def forward(self, x, domain_id=None):\n", + " orig_shape = x.shape\n", + " if len(orig_shape) == 3:\n", + " B, T, D = orig_shape\n", + " X = x.reshape([B*T, D])\n", + " else:\n", + " X = x\n", + " N, D = X.shape\n", + "\n", + " logits = self.router(X) # (N,E)\n", + " probs = self._router_probs(logits) # (N,E)\n", + " topk_val, topk_idx = paddle.topk(probs, k=self.cfg.top_k, axis=-1) # (N,k)\n", + "\n", + " # 专家并行输出\n", + " all_out = paddle.stack([e(X) for e in self.experts], axis=1) # (N,E,D)\n", + "\n", + " # === 使用 gather_nd 逐样本选择 top-k 专家 ===\n", + " arangeN = paddle.arange(N, dtype='int64')\n", + " picked_list = []\n", + " for i in range(self.cfg.top_k):\n", + " idx_i = topk_idx[:, i].astype('int64') # (N,)\n", + " idx_nd = paddle.stack([arangeN, idx_i], axis=1) # (N,2) [sample, expert]\n", + " picked_i = paddle.gather_nd(all_out, idx_nd) # (N,D)\n", + " picked_list.append(picked_i)\n", + " picked = paddle.stack(picked_list, axis=1) # (N,k,D)\n", + "\n", + " # 归一化权重并加权\n", + " w = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9) # (N,k)\n", + " Y = paddle.sum(picked * w.unsqueeze(-1), axis=1) # (N,D)\n", + "\n", + " Y = self.drop(Y)\n", + " Y = self.ln(Y + X)\n", + "\n", + " # aux loss\n", + " aux = 0.0\n", + " if self.cfg.balance_loss_w > 0:\n", + " mean_prob = probs.mean(axis=0)\n", + " target = paddle.full_like(mean_prob, 1.0 / self.cfg.n_experts)\n", + " aux = aux + self.cfg.balance_loss_w * F.mse_loss(mean_prob, target)\n", + " if self.cfg.entropy_reg_w != 0.0:\n", + " ent = -paddle.sum(probs * (paddle.log(probs + 1e-9)), axis=1).mean()\n", + " aux = aux + self.cfg.entropy_reg_w * ent\n", + " if (domain_id is not None) and (self.cfg.sup_router_w > 0):\n", + " dom = domain_id.reshape([-1])[:N] % self.cfg.n_experts\n", + " aux = aux + self.cfg.sup_router_w * F.cross_entropy(logits, dom)\n", + " if self.cfg.diversity_w > 0 and self.cfg.n_experts > 1:\n", + " # 用 top-1 硬选择近似每个专家接收的样本\n", + " chosen = F.one_hot(topk_idx[:, 0], num_classes=self.cfg.n_experts).astype('float32') # (N,E)\n", + " denom = chosen.sum(axis=0).clip(min=1.0).unsqueeze(-1)\n", + " means = (all_out * chosen.unsqueeze(-1)).sum(axis=0) / denom # (E,D)\n", + " sims = []\n", + " for i in range(self.cfg.n_experts):\n", + " for j in range(i+1, self.cfg.n_experts):\n", + " si = F.normalize(means[i:i+1], axis=-1)\n", + " sj = F.normalize(means[j:j+1], axis=-1)\n", + " sims.append((si*sj).sum())\n", + " if sims:\n", + " aux = aux + self.cfg.diversity_w * paddle.stack(sims).mean()\n", + "\n", + " if len(orig_shape) == 3:\n", + " Y = Y.reshape([B, T, D])\n", + " return Y, aux\n", + "\n", + "class MoEHead(nn.Layer):\n", + " \"\"\"单 token MoE 头,用于 fused/tabm 投影后的 (B, D)\"\"\"\n", + " def __init__(self, d_model=512, cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.moe = MoE(d_model, cfg or MoEConfig())\n", + " def forward(self, tok, domain_id=None):\n", + " y, aux = self.moe(tok.unsqueeze(1), domain_id=domain_id) # (B,1,D)\n", + " return y.squeeze(1), aux\n", + "\n", + "# ====================== 自定义 Transformer Encoder(FFN 可替换为 MoE) ======================\n", + "class TransformerEncoderLayerMoE(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, d_ff=1024, dropout=0.1,\n", + " use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.use_moe = use_moe\n", + " self.self_attn = nn.MultiHeadAttention(embed_dim=d_model, num_heads=nhead, dropout=dropout)\n", + " self.ln1 = nn.LayerNorm(d_model)\n", + " self.do1 = nn.Dropout(dropout)\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(\n", + " nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model),\n", + " )\n", + " self.do2 = nn.Dropout(dropout)\n", + "\n", + " def forward(self, x, domain_id=None): # x: (B,T,D)\n", + " # Self-Attention (pre-norm) —— Paddle MHA 期望 (T,B,D)\n", + " h = self.ln1(x)\n", + " h = paddle.transpose(h, [1, 0, 2]) # (T,B,D)\n", + " sa = self.self_attn(h, h, h) # (T,B,D)\n", + " sa = paddle.transpose(sa, [1, 0, 2]) # (B,T,D)\n", + " x = x + self.do1(sa)\n", + " aux = 0.0\n", + " if self.use_moe:\n", + " x, aux = self.moe(x, domain_id=domain_id) # 残差+LN 在 MoE 内部\n", + " else:\n", + " x = x + self.do2(self.ffn(x)) # 残差在这里\n", + " return x, aux\n", + "\n", + "class TemporalTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, num_layers=2, d_ff=1024, dropout=0.1,\n", + " max_len=1024, use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.pos = SinusoidalPositionalEncoding(d_model, max_len=max_len)\n", + " self.layers = nn.LayerList([\n", + " TransformerEncoderLayerMoE(d_model, nhead, d_ff, dropout,\n", + " use_moe=use_moe, moe_cfg=moe_cfg)\n", + " for _ in range(num_layers)\n", + " ])\n", + " def forward(self, x, domain_id=None): # x: (B,T,D)\n", + " x = self.pos(x)\n", + " aux_total = 0.0\n", + " for layer in self.layers:\n", + " x, aux = layer(x, domain_id=domain_id)\n", + " aux_total = aux_total + aux\n", + " return x, aux_total\n", + "\n", + "# ====================== 多头注意力(支持 q from A, kv from B) ======================\n", + "class MultiHeadCrossAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_model = d_model\n", + " self.nhead = nhead\n", + " self.d_head = d_model // nhead\n", + " self.Wq = nn.Linear(d_model, d_model)\n", + " self.Wk = nn.Linear(d_model, d_model)\n", + " self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.ln = nn.LayerNorm(d_model)\n", + "\n", + " def forward(self, q, kv):\n", + " B, Nq, D = q.shape\n", + " Nk = kv.shape[1]\n", + " q_lin = self.Wq(q); k_lin = self.Wk(kv); v_lin = self.Wv(kv)\n", + " def split_heads(t):\n", + " return t.reshape([B, -1, self.nhead, self.d_head]).transpose([0, 2, 1, 3])\n", + " qh = split_heads(q_lin); kh = split_heads(k_lin); vh = split_heads(v_lin)\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head)\n", + " attn = F.softmax(scores, axis=-1)\n", + " ctx = paddle.matmul(attn, vh)\n", + " ctx = ctx.transpose([0, 2, 1, 3]).reshape([B, Nq, D])\n", + " out = self.proj(ctx)\n", + " out = self.drop(out)\n", + " return self.ln(out + q)\n", + "\n", + "# ====================== 融合头(双向 Cross-Attn) ======================\n", + "class BiModalCrossFusion(nn.Layer):\n", + " \"\"\"\n", + " 输入:\n", + " video_seq: (B, T, D) —— Transformer 后的视频序列\n", + " tabm_tok: (B, D) —— TabM token\n", + " \"\"\"\n", + " def __init__(self, d_model=512, nhead=8, dropout=0.1, fuse_hidden=512):\n", + " super().__init__()\n", + " self.ca_v_from_t = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.ca_t_from_v = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.fuse = nn.Sequential(\n", + " nn.Linear(2 * d_model, fuse_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " )\n", + " self.out_dim = fuse_hidden\n", + "\n", + " def forward(self, video_seq, tabm_tok):\n", + " B, T, D = video_seq.shape\n", + " # 池化视频时间维得到 token\n", + " v_tok = video_seq.mean(axis=1, keepdim=True) # (B,1,D)\n", + " t_tok = tabm_tok.unsqueeze(1) # (B,1,D)\n", + " v_upd = self.ca_v_from_t(v_tok, t_tok) # (B,1,D)\n", + " t_upd = self.ca_t_from_v(t_tok, video_seq) # (B,1,D)\n", + " fused = paddle.concat([v_upd, t_upd], axis=-1) # (B,1,2D)\n", + " fused = fused.squeeze(1) # (B,2D)\n", + " return self.fuse(fused) # (B, F)\n", + "\n", + "# ====================== 总模型(带三个 MoE 开关) ======================\n", + "class TwoModalMultiLabelModel(nn.Layer):\n", + " def __init__(self,\n", + " # 视频模态\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=36,\n", + " # 结构化模态\n", + " vec_dim=424,\n", + " # 维度与结构\n", + " d_model=512, nhead=2, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1, num_labels=4,\n", + " # ===== MoE 开关 =====\n", + " moe_temporal: bool = True, # 时序 Transformer 的 FFN 位置\n", + " moe_fused: bool = False, # 融合 token 上的小型 MoE 头\n", + " moe_tabm: bool = False, # TabM 投影后\n", + " # ===== MoE 超参(可传入自定义) =====\n", + " moe_cfg_temporal: MoEConfig = None,\n", + " moe_cfg_fused: MoEConfig = None,\n", + " moe_cfg_tabm: MoEConfig = None):\n", + " super().__init__()\n", + " # A: 逐帧 ResNet18\n", + " self.frame_encoder = ResNet18FrameEncoder(in_channels=vid_channels)\n", + " # A: 时序 Transformer(可开/关 MoE)\n", + " self.temporal = TemporalTransformerFlexible(\n", + " d_model=d_model, nhead=nhead, num_layers=n_trans_layers,\n", + " d_ff=trans_ff, dropout=dropout, max_len=vid_frames,\n", + " use_moe=moe_temporal,\n", + " moe_cfg=moe_cfg_temporal or MoEConfig(\n", + " n_experts=8, top_k=1, d_ff=max(trans_ff, 2048), router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " )\n", + " )\n", + " # B: TabM(或你的 TabM)\n", + " self.tabm = TabMFeatureExtractor(vec_dim, d_hidden=tabm_hidden, dropout=dropout)\n", + " self.tabm_proj = nn.Linear(tabm_hidden, d_model)\n", + "\n", + " # 可选:TabM 分支 MoE 头\n", + " self.moe_tabm = moe_tabm\n", + " if moe_tabm:\n", + " self.tabm_moe = MoEHead(d_model=d_model, cfg=moe_cfg_tabm or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 融合:双向 Cross-Attention\n", + " self.fusion = BiModalCrossFusion(d_model=d_model, nhead=nhead, dropout=dropout, fuse_hidden=d_model)\n", + "\n", + " # 可选:融合 token MoE 头\n", + " self.moe_fused = moe_fused\n", + " if moe_fused:\n", + " self.fused_moe = MoEHead(d_model=d_model, cfg=moe_cfg_fused or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 分类头\n", + " self.head = nn.Linear(self.fusion.out_dim, num_labels)\n", + "\n", + " # --- 新增:编码函数,导出融合前的 512 维特征(用于检索库) ---\n", + " def encode(self, x_video, x_vec, domain_id=None):\n", + " \"\"\"返回融合后的 512 维 token(分类头之前的表示),不经过最终 Linear。\"\"\"\n", + " B, T, C, H, W = x_video.shape\n", + " xvt = x_video.reshape([B * T, C, H, W])\n", + " f_frame = self.frame_encoder(xvt) # (B*T, 512)\n", + " f_seq = f_frame.reshape([B, T, -1]) # (B, T, 512)\n", + " z_vid, _ = self.temporal(f_seq, domain_id=domain_id) # (B,T,512)\n", + " z_tabm = self.tabm(x_vec)\n", + " z_tabm = self.tabm_proj(z_tabm) # (B,512)\n", + " if self.moe_tabm:\n", + " z_tabm, _ = self.tabm_moe(z_tabm, domain_id=domain_id)\n", + " fused = self.fusion(z_vid, z_tabm) # (B,512)\n", + " if self.moe_fused:\n", + " fused, _ = self.fused_moe(fused, domain_id=domain_id)\n", + " return fused # (B,512)\n", + "\n", + " def forward(self, x_video, x_vec, domain_id=None):\n", + " fused = self.encode(x_video, x_vec, domain_id=domain_id) # (B,512)\n", + " logits = self.head(fused) # (B,4)\n", + " # 为了兼容旧接口,这里返回的 aux 为 0(MoE 的 aux 已在 temporal/tabm_moe/fused_moe 内部求和并丢弃)\n", + " # 如果你想把 MoE 的 aux 在训练里也加入,可把 encode 拆回 forward 的各步并返回累积 aux。\n", + " aux_placeholder = paddle.to_tensor(0.0, dtype='float32')\n", + " return logits, aux_placeholder\n", + "\n", + "# ====================== 指标与训练循环(兼容 aux_loss) ======================\n", + "def f1_per_class(y_true: np.ndarray, y_pred: np.ndarray, eps: float = 1e-9) -> Tuple[np.ndarray, float, float]:\n", + " assert y_true.shape == y_pred.shape\n", + " N, C = y_true.shape\n", + " f1_c = np.zeros(C, dtype=np.float32)\n", + " for c in range(C):\n", + " yt, yp = y_true[:, c], y_pred[:, c]\n", + " tp = np.sum((yt == 1) & (yp == 1))\n", + " fp = np.sum((yt == 0) & (yp == 1))\n", + " fn = np.sum((yt == 1) & (yp == 0))\n", + " prec = tp / (tp + fp + eps)\n", + " rec = tp / (tp + fn + eps)\n", + " f1_c[c] = 2 * prec * rec / (prec + rec + eps)\n", + " macro_f1 = float(np.mean(f1_c))\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " prec = tp / (tp + fp + 1e-9)\n", + " rec = tp / (tp + fn + 1e-9)\n", + " micro_f1 = 2 * prec * rec / (prec + rec + 1e-9)\n", + " return f1_c, macro_f1, float(micro_f1)\n", + "\n", + "def average_precision_micro(y_true: np.ndarray, y_prob: np.ndarray, num_thresholds: int = 101) -> float:\n", + " thresholds = np.linspace(0.0, 1.0, num_thresholds)\n", + " precision, recall = [], []\n", + " for t in thresholds:\n", + " y_pred = (y_prob >= t).astype(np.float32)\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " p = tp / (tp + fp + 1e-9)\n", + " r = tp / (tp + fn + 1e-9)\n", + " precision.append(p); recall.append(r)\n", + " order = np.argsort(recall)\n", + " recall = np.array(recall)[order]\n", + " precision = np.array(precision)[order]\n", + " return float(np.trapz(precision, recall))\n", + "\n", + "LAMBDA_MOE = 0.0 # 这里的 forward 返回 aux=0(如需把 MoE aux 算进去,可按上一版做法)\n", + "\n", + "def train_one_epoch(model, loader, optimizer,\n", + " pos_weight: Optional[paddle.Tensor] = None,\n", + " clip_grad_norm: Optional[float] = None):\n", + " model.train()\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " if pos_weight is not None:\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'), pos_weight=pos_weight)\n", + " else:\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'))\n", + " loss = cls # + LAMBDA_MOE * aux # 此版本不叠加 MoE aux\n", + " loss.backward()\n", + " if clip_grad_norm is not None:\n", + " nn.utils.clip_grad_norm_(model.parameters(), max_norm=clip_grad_norm)\n", + " optimizer.step()\n", + " optimizer.clear_grad()\n", + " total_loss += float(loss); total_batches += 1\n", + " return total_loss / max(1, total_batches)\n", + "\n", + "# ====================== 检索增强:构建训练库 & 测试时融合 ======================\n", + "class Retriever:\n", + " \"\"\"\n", + " 检索库:\n", + " - keys: 训练集的特征 (N,D) —— 取模型 encode() 的融合特征\n", + " - labels: 训练集的标签 (N,C)\n", + " 推理:\n", + " - 给定测试特征 (B,D),计算与 keys 的相似度,取 top-k\n", + " - 得到邻居标签的加权均值 p_knn,按 alpha 融合到模型概率\n", + " \"\"\"\n", + " def __init__(self, sim_metric: str = 'cos', k: int = 8, alpha: float = 0.3, tau: float = 1.0):\n", + " \"\"\"\n", + " sim_metric: 'cos' or 'l2'\n", + " k: 近邻数\n", + " alpha: 融合系数,p_final = (1-alpha)*p_model + alpha*p_knn\n", + " tau: 温度(用于 l2 的 softmax(-d/tau) 或 cos 的 softmax(sim/tau))\n", + " \"\"\"\n", + " assert sim_metric in ['cos', 'l2']\n", + " self.sim_metric = sim_metric\n", + " self.k = k\n", + " self.alpha = alpha\n", + " self.tau = tau\n", + " self.keys = None # (N,D)\n", + " self.labels = None # (N,C)\n", + "\n", + " @paddle.no_grad()\n", + " def build(self, model: nn.Layer, loader: DataLoader):\n", + " model.eval()\n", + " feats, labs = [], []\n", + " for x_vid, x_vec, y in loader:\n", + " f = model.encode(x_vid.astype('float32'), x_vec.astype('float32')) # (B,512)\n", + " feats.append(f.numpy())\n", + " labs.append(y.numpy())\n", + " self.keys = paddle.to_tensor(np.concatenate(feats, axis=0)).astype('float32') # (N,D)\n", + " self.labels = paddle.to_tensor(np.concatenate(labs, axis=0)).astype('float32') # (N,C)\n", + " # 预归一化(cos 相似度更快;l2 也可复用)\n", + " self.keys_norm = F.normalize(self.keys, axis=-1)\n", + "\n", + " @paddle.no_grad()\n", + " def query_and_fuse(self, model_probs: paddle.Tensor, test_feat: paddle.Tensor) -> paddle.Tensor:\n", + " \"\"\"\n", + " model_probs: (B,C) —— 模型自身概率(sigmoid后的)\n", + " test_feat: (B,D) —— 模型 encode 导出的融合特征\n", + " return: (B,C) —— 融合后的概率\n", + " \"\"\"\n", + " assert self.keys is not None, \"Call build() before query.\"\n", + " B, D = test_feat.shape\n", + " # 相似度\n", + " if self.sim_metric == 'cos':\n", + " q = F.normalize(test_feat, axis=-1) # (B,D)\n", + " sim = paddle.matmul(q, self.keys_norm, transpose_y=True) # (B,N)\n", + " w = F.softmax(sim / self.tau, axis=-1) # (B,N)\n", + " else: # 'l2'\n", + " # ||q-k||^2 = q^2 + k^2 - 2 q·k\n", + " q2 = paddle.sum(test_feat * test_feat, axis=-1, keepdim=True) # (B,1)\n", + " k2 = paddle.sum(self.keys * self.keys, axis=-1, keepdim=True).transpose([1,0]) # (1,N)\n", + " dot = paddle.matmul(test_feat, self.keys, transpose_y=True) # (B,N)\n", + " dist2 = q2 + k2 - 2.0 * dot # (B,N)\n", + " w = F.softmax(-dist2 / self.tau, axis=-1) # (B,N)\n", + "\n", + " # 取 top-k(可选:先 topk 再归一化,避免长尾干扰)\n", + " topk_val, topk_idx = paddle.topk(w, k=min(self.k, w.shape[1]), axis=-1) # (B,k)\n", + " # gather labels\n", + " N, C = self.labels.shape\n", + " b_idx = paddle.arange(B, dtype='int64').unsqueeze(-1).tile([1, topk_val.shape[1]]) # (B,k)\n", + " # 先 gather 权重对应的 labels\n", + " picked_labels = paddle.gather(self.labels, topk_idx.reshape([-1]), axis=0) # (B*k, C)\n", + " picked_labels = picked_labels.reshape([B, -1, C]) # (B,k,C)\n", + " w_norm = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9) # (B,k)\n", + " p_knn = paddle.sum(picked_labels * w_norm.unsqueeze(-1), axis=1) # (B,C)\n", + "\n", + " # 概率融合\n", + " p_final = (1.0 - self.alpha) * model_probs + self.alpha * p_knn\n", + " return p_final.clip(1e-6, 1-1e-6)\n", + "\n", + "@paddle.no_grad()\n", + "def evaluate(model, loader, threshold: float = 0.5,\n", + " retriever: Optional[Retriever] = None):\n", + " \"\"\"\n", + " 若 retriever 不为 None:在测试时做 kNN 检索并与模型概率融合。\n", + " \"\"\"\n", + " model.eval()\n", + " ys, ps = [], []\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " prob = F.sigmoid(logits) # (B,C)\n", + "\n", + " if retriever is not None:\n", + " feat = model.encode(x_vid.astype('float32'), x_vec.astype('float32')) # (B,D)\n", + " prob = retriever.query_and_fuse(prob, feat) # (B,C)\n", + "\n", + " loss = F.binary_cross_entropy(prob, y.astype('float32')) # 用概率计算 eval loss\n", + " ys.append(y.numpy()); ps.append(prob.numpy())\n", + " total_loss += float(loss); total_batches += 1\n", + "\n", + " y_true = np.concatenate(ys, axis=0)\n", + " y_prob = np.concatenate(ps, axis=0)\n", + " y_pred = (y_prob >= threshold).astype(np.float32)\n", + " per_f1, macro_f1, micro_f1 = f1_per_class(y_true, y_pred)\n", + " ap_micro = average_precision_micro(y_true, y_prob)\n", + " return {\n", + " \"loss\": total_loss / max(1, total_batches),\n", + " \"macro_f1\": macro_f1,\n", + " \"micro_f1\": micro_f1,\n", + " \"per_class_f1\": per_f1.tolist(),\n", + " \"micro_AP\": ap_micro\n", + " }\n", + "\n", + "# ====================== 合成数据集(可替换为真实数据) ======================\n", + "class ToyTwoModalDataset(Dataset):\n", + " \"\"\"\n", + " 返回:\n", + " x_video: (T=36, C=20, H=20, W=20)\n", + " x_vec: (424,)\n", + " y: (4,) 0/1\n", + " \"\"\"\n", + " def __init__(self, n: int, seed: int = 0):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.n = n\n", + " self.video = rng.normal(size=(n, 36, 20, 20, 20)).astype('float32')\n", + " self.vec = rng.normal(size=(n, 424)).astype('float32')\n", + "\n", + " # 造标签:对视频先在 H/W 上均值,再在 T 上均值 → (n, C=20)\n", + " vid_hw = self.video.mean(axis=(3, 4)) # (n, T, C)\n", + " vid_avg = vid_hw.mean(axis=1) # (n, C)\n", + " Wv = rng.normal(size=(20, 4)) # C→4\n", + " Wt = rng.normal(size=(424, 4)) # 424→4\n", + " logits = vid_avg @ Wv + self.vec @ Wt + rng.normal(scale=0.5, size=(n, 4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.y = (probs > 0.5).astype('float32')\n", + "\n", + " def __getitem__(self, idx: int):\n", + " return self.video[idx], self.vec[idx], self.y[idx]\n", + "\n", + " def __len__(self):\n", + " return self.n\n", + "\n", + "# ====================== 训练入口(可直接运行) ======================\n", + "if __name__ == \"__main__\":\n", + " paddle.seed(2025)\n", + " # 数据\n", + " train_ds = ToyTwoModalDataset(n=128, seed=42)\n", + " val_ds = ToyTwoModalDataset(n=32, seed=233)\n", + "\n", + " def collate_fn(batch):\n", + " vids, vecs, ys = zip(*batch)\n", + " return (paddle.to_tensor(np.stack(vids, 0)), # (B,T,C,H,W)\n", + " paddle.to_tensor(np.stack(vecs, 0)), # (B,424)\n", + " paddle.to_tensor(np.stack(ys, 0))) # (B,4)\n", + "\n", + " train_loader = DataLoader(train_ds, batch_size=4, shuffle=True, drop_last=False, collate_fn=collate_fn)\n", + " val_loader = DataLoader(val_ds, batch_size=4, shuffle=False, drop_last=False, collate_fn=collate_fn)\n", + "\n", + " # 类别不平衡权重(可选)\n", + " y_train = np.stack([y for _, _, y in train_ds], 0)\n", + " pos_ratio = np.clip(y_train.mean(axis=0), 1e-3, 1-1e-3)\n", + " pos_weight = paddle.to_tensor(((1-pos_ratio)/pos_ratio).astype('float32')) # (4,)\n", + "\n", + " # === 模型(MoE 开关按需) ===\n", + " model = TwoModalMultiLabelModel(\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=36,\n", + " vec_dim=424,\n", + " d_model=512, nhead=2, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1,\n", + " num_labels=4,\n", + " moe_temporal=True, # FFN 位置 MoE\n", + " moe_fused=False, # 融合处 MoE\n", + " moe_tabm=False # TabM 处 MoE\n", + " )\n", + " optimizer = paddle.optimizer.Adam(learning_rate=3e-4, parameters=model.parameters())\n", + "\n", + " # 训练(演示用)\n", + " best_macro_f1, best = -1.0, None\n", + " for ep in range(1, 3+1):\n", + " train_loss = train_one_epoch(model, train_loader, optimizer,\n", + " pos_weight=pos_weight, clip_grad_norm=1.0)\n", + " val_metrics = evaluate(model, val_loader, threshold=0.5, retriever=None)\n", + " print(f\"[Epoch {ep:02d}] train_loss={train_loss:.4f} | \"\n", + " f\"val_loss={val_metrics['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics['micro_AP']:.4f}\")\n", + " if val_metrics[\"macro_f1\"] > best_macro_f1:\n", + " best_macro_f1 = val_metrics[\"macro_f1\"]\n", + " best = {k: v.clone() for k, v in model.state_dict().items()}\n", + "\n", + " if best is not None:\n", + " model.set_state_dict(best)\n", + " print(f\"Loaded best state with macro_f1={best_macro_f1:.4f}\")\n", + "\n", + " # === 构建检索库(使用训练集) ===\n", + " retr = Retriever(sim_metric='cos', k=8, alpha=0.3, tau=0.5) # 可改 'l2'\n", + " retr.build(model, DataLoader(train_ds, batch_size=8, shuffle=False, collate_fn=collate_fn))\n", + "\n", + " # === 测试时启用检索增强 ===\n", + " val_metrics_knn = evaluate(model, val_loader, threshold=0.5, retriever=retr)\n", + " print(f\"[RkNN] val_loss={val_metrics_knn['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics_knn['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics_knn['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics_knn['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics_knn['micro_AP']:.4f}\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "u6m8tTnwSSYC", + "outputId": "b7bfaa2f-71fa-4945-c8b4-b4f586fd0fdf" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/paddle/nn/layer/norm.py:818: UserWarning: When training, we now always track global mean and variance.\n", + " warnings.warn(\n", + "/tmp/ipython-input-2448755935.py:419: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", + " return float(np.trapz(precision, recall))\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[Epoch 01] train_loss=0.8949 | val_loss=0.7680 | macro_f1=0.4306 | micro_f1=0.5255 | per_class_f1=[0.5454545617103577, 0.5405405163764954, 0.6363636255264282, 0.0] | micro_AP=0.4448\n", + "[Epoch 02] train_loss=0.5957 | val_loss=0.9367 | macro_f1=0.4620 | micro_f1=0.5414 | per_class_f1=[0.4444444477558136, 0.7450980544090271, 0.5333333611488342, 0.125] | micro_AP=0.5133\n", + "[Epoch 03] train_loss=0.3141 | val_loss=1.1780 | macro_f1=0.3715 | micro_f1=0.4158 | per_class_f1=[0.125, 0.5, 0.6000000238418579, 0.260869562625885] | micro_AP=0.5041\n", + "Loaded best state with macro_f1=0.4620\n", + "[RkNN] val_loss=0.8189 | macro_f1=0.4900 | micro_f1=0.5390 | per_class_f1=[0.4000000059604645, 0.7599999904632568, 0.5142857432365417, 0.2857142984867096] | micro_AP=0.4978\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# 3D Resnet+单路Transformer+MoE+KNN-Based Retrieve" + ], + "metadata": { + "id": "3H4WbI0l3_7Y" + } + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math\n", + "from typing import Optional, Tuple\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "\n", + "# ====================== 工具:正弦位置编码 ======================\n", + "class SinusoidalPositionalEncoding(nn.Layer):\n", + " def __init__(self, d_model: int, max_len: int = 4096):\n", + " super().__init__()\n", + " pe = np.zeros((max_len, d_model), dtype=\"float32\")\n", + " position = np.arange(0, max_len, dtype=\"float32\")[:, None]\n", + " div_term = np.exp(np.arange(0, d_model, 2, dtype=\"float32\") * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = np.sin(position * div_term)\n", + " pe[:, 1::2] = np.cos(position * div_term)\n", + " self.register_buffer(\"pe\", paddle.to_tensor(pe), persistable=False)\n", + "\n", + " def forward(self, x): # x: (B, T, D)\n", + " T = x.shape[1]\n", + " return x + self.pe[:T, :]\n", + "\n", + "# ====================== 简化版 TabM ======================\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " def __init__(self, num_features: int, d_hidden: int = 512, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(num_features, d_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_hidden, d_hidden),\n", + " nn.ReLU(),\n", + " )\n", + " self.d_hidden = d_hidden\n", + " def forward(self, x_num: paddle.Tensor): # (B, 424)\n", + " return self.net(x_num) # (B, H)\n", + "\n", + "# ====================== 3D ResNet-18 体数据特征抽取 ======================\n", + "class BasicBlock3D(nn.Layer):\n", + " expansion = 1\n", + " def __init__(self, in_planes, planes, stride=(1,1,1), downsample=None):\n", + " super().__init__()\n", + " self.conv1 = nn.Conv3D(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(planes)\n", + " self.relu = nn.ReLU()\n", + " self.conv2 = nn.Conv3D(planes, planes, kernel_size=3, stride=1, padding=1, bias_attr=False)\n", + " self.bn2 = nn.BatchNorm3D(planes)\n", + " self.downsample = downsample\n", + " def forward(self, x):\n", + " identity = x\n", + " out = self.relu(self.bn1(self.conv1(x)))\n", + " out = self.bn2(self.conv2(out))\n", + " if self.downsample is not None:\n", + " identity = self.downsample(x)\n", + " out = self.relu(out + identity)\n", + " return out\n", + "\n", + "class ResNet3D(nn.Layer):\n", + " def __init__(self, block, layers, in_channels=20, base_width=64):\n", + " super().__init__()\n", + " self.in_planes = base_width\n", + " # 只空间下采样,保留较细 D 维\n", + " self.conv1 = nn.Conv3D(in_channels, self.in_planes,\n", + " kernel_size=(3,7,7), stride=(1,2,2),\n", + " padding=(1,3,3), bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(self.in_planes)\n", + " self.relu = nn.ReLU()\n", + " self.maxpool = nn.MaxPool3D(kernel_size=(1,3,3), stride=(1,2,2), padding=(0,1,1))\n", + " self.layer1 = self._make_layer(block, base_width, layers[0], stride=(1,1,1))\n", + " self.layer2 = self._make_layer(block, base_width*2, layers[1], stride=(2,2,2)) # D/H/W /2\n", + " self.layer3 = self._make_layer(block, base_width*4, layers[2], stride=(2,2,2))\n", + " self.layer4 = self._make_layer(block, base_width*8, layers[3], stride=(2,2,2))\n", + " self.out_dim = base_width*8 # 512\n", + " self.pool = nn.AdaptiveAvgPool3D(output_size=1)\n", + "\n", + " def _make_layer(self, block, planes, blocks, stride=(1,1,1)):\n", + " downsample = None\n", + " if stride != (1,1,1) or self.in_planes != planes * block.expansion:\n", + " downsample = nn.Sequential(\n", + " nn.Conv3D(self.in_planes, planes * block.expansion, kernel_size=1, stride=stride, bias_attr=False),\n", + " nn.BatchNorm3D(planes * block.expansion),\n", + " )\n", + " layers = [block(self.in_planes, planes, stride=stride, downsample=downsample)]\n", + " self.in_planes = planes * block.expansion\n", + " for _ in range(1, blocks):\n", + " layers.append(block(self.in_planes, planes))\n", + " return nn.Sequential(*layers)\n", + "\n", + " def forward(self, x): # x: (B, C, D, H, W)\n", + " x = self.relu(self.bn1(self.conv1(x)))\n", + " x = self.maxpool(x)\n", + " x = self.layer1(x) # (B, 64, D, H/4, W/4)\n", + " x = self.layer2(x) # (B, 128, D/2, H/8, W/8)\n", + " x = self.layer3(x) # (B, 256, D/4, H/16, W/16)\n", + " x = self.layer4(x) # (B, 512, D/8, H/32, W/32)\n", + " x = self.pool(x) # (B, 512, 1,1,1)\n", + " x = paddle.flatten(x, 1) # (B, 512)\n", + " return x\n", + "\n", + "class Volume3DEncoder(nn.Layer):\n", + " \"\"\"\n", + " 3D ResNet-18 over (D,H,W) for each time step.\n", + " 输入单帧体数据: (B, C=20, D=24, H=20, W=20) → 输出 (B, 512)\n", + " \"\"\"\n", + " def __init__(self, in_channels: int = 20, base: int = 64, dropout: float = 0.0):\n", + " super().__init__()\n", + " self.backbone = ResNet3D(BasicBlock3D, layers=[2,2,2,2], in_channels=in_channels, base_width=base)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.out_dim = self.backbone.out_dim # 512\n", + " def forward(self, x): # x: (B, C, D, H, W)\n", + " x = self.backbone(x) # (B,512)\n", + " x = self.drop(x)\n", + " return x\n", + "\n", + "# ====================== MoE(Top-k;gather_nd 选择专家) ======================\n", + "class ExpertFFN(nn.Layer):\n", + " def __init__(self, d_model, d_ff, dropout=0.1, act='relu'):\n", + " super().__init__()\n", + " Act = getattr(F, act) if isinstance(act, str) else act\n", + " self.fc1 = nn.Linear(d_model, d_ff)\n", + " self.fc2 = nn.Linear(d_ff, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.act = Act\n", + " def forward(self, x):\n", + " return self.fc2(self.drop(self.act(self.fc1(x))))\n", + "\n", + "class MoEConfig:\n", + " def __init__(self,\n", + " n_experts=8,\n", + " top_k=1,\n", + " d_ff=2048,\n", + " dropout=0.1,\n", + " router_temp=0.5,\n", + " balance_loss_w=0.005,\n", + " entropy_reg_w=-0.005,\n", + " diversity_w=1e-3,\n", + " sticky_w=0.0,\n", + " sup_router_w=0.0,\n", + " use_gumbel=True):\n", + " self.n_experts = n_experts\n", + " self.top_k = top_k\n", + " self.d_ff = d_ff\n", + " self.dropout = dropout\n", + " self.router_temp = router_temp\n", + " self.balance_loss_w = balance_loss_w\n", + " self.entropy_reg_w = entropy_reg_w\n", + " self.diversity_w = diversity_w\n", + " self.sticky_w = sticky_w\n", + " self.sup_router_w = sup_router_w\n", + " self.use_gumbel = use_gumbel\n", + "\n", + "class MoE(nn.Layer):\n", + " \"\"\"forward(x, domain_id=None) → (y, aux_loss),支持 (B,T,D) 或 (N,D)\"\"\"\n", + " def __init__(self, d_model: int, cfg: MoEConfig):\n", + " super().__init__()\n", + " self.cfg = cfg\n", + " self.router = nn.Linear(d_model, cfg.n_experts)\n", + " self.experts = nn.LayerList([ExpertFFN(d_model, cfg.d_ff, cfg.dropout) for _ in range(cfg.n_experts)])\n", + " self.ln = nn.LayerNorm(d_model)\n", + " self.drop = nn.Dropout(cfg.dropout)\n", + "\n", + " def _router_probs(self, logits):\n", + " if self.cfg.use_gumbel and self.training:\n", + " u = paddle.uniform(logits.shape, min=1e-6, max=1-1e-6, dtype=logits.dtype)\n", + " g = -paddle.log(-paddle.log(u))\n", + " logits = logits + g\n", + " return F.softmax(logits / self.cfg.router_temp, axis=-1)\n", + "\n", + " def forward(self, x, domain_id=None):\n", + " orig_shape = x.shape\n", + " if len(orig_shape) == 3:\n", + " B, T, D = orig_shape\n", + " X = x.reshape([B*T, D])\n", + " else:\n", + " X = x\n", + " N, D = X.shape\n", + "\n", + " logits = self.router(X) # (N,E)\n", + " probs = self._router_probs(logits) # (N,E)\n", + " topk_val, topk_idx = paddle.topk(probs, k=self.cfg.top_k, axis=-1) # (N,k)\n", + "\n", + " # 并行专家\n", + " all_out = paddle.stack([e(X) for e in self.experts], axis=1) # (N,E,D)\n", + "\n", + " # gather_nd 逐样本取 top-k\n", + " arangeN = paddle.arange(N, dtype='int64')\n", + " picked_list = []\n", + " for i in range(self.cfg.top_k):\n", + " idx_i = topk_idx[:, i].astype('int64') # (N,)\n", + " idx_nd = paddle.stack([arangeN, idx_i], axis=1) # (N,2)\n", + " picked_i = paddle.gather_nd(all_out, idx_nd) # (N,D)\n", + " picked_list.append(picked_i)\n", + " picked = paddle.stack(picked_list, axis=1) # (N,k,D)\n", + "\n", + " # 加权\n", + " w = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9) # (N,k)\n", + " Y = paddle.sum(picked * w.unsqueeze(-1), axis=1) # (N,D)\n", + "\n", + " # 残差+归一\n", + " Y = self.drop(Y)\n", + " Y = self.ln(Y + X)\n", + "\n", + " # 辅助损失\n", + " aux = 0.0\n", + " if self.cfg.balance_loss_w > 0:\n", + " mean_prob = probs.mean(axis=0)\n", + " target = paddle.full_like(mean_prob, 1.0 / self.cfg.n_experts)\n", + " aux = aux + self.cfg.balance_loss_w * F.mse_loss(mean_prob, target)\n", + " if self.cfg.entropy_reg_w != 0.0:\n", + " ent = -paddle.sum(probs * (paddle.log(probs + 1e-9)), axis=1).mean()\n", + " aux = aux + self.cfg.entropy_reg_w * ent\n", + " if (domain_id is not None) and (self.cfg.sup_router_w > 0):\n", + " dom = domain_id.reshape([-1])[:N] % self.cfg.n_experts\n", + " aux = aux + self.cfg.sup_router_w * F.cross_entropy(logits, dom)\n", + " if self.cfg.diversity_w > 0 and self.cfg.n_experts > 1:\n", + " chosen = F.one_hot(topk_idx[:, 0], num_classes=self.cfg.n_experts).astype('float32') # (N,E)\n", + " denom = chosen.sum(axis=0).clip(min=1.0).unsqueeze(-1)\n", + " means = (all_out * chosen.unsqueeze(-1)).sum(axis=0) / denom # (E,D)\n", + " sims = []\n", + " for i in range(self.cfg.n_experts):\n", + " for j in range(i+1, self.cfg.n_experts):\n", + " si = F.normalize(means[i:i+1], axis=-1)\n", + " sj = F.normalize(means[j:j+1], axis=-1)\n", + " sims.append((si*sj).sum())\n", + " if sims:\n", + " aux = aux + self.cfg.diversity_w * paddle.stack(sims).mean()\n", + "\n", + " if len(orig_shape) == 3:\n", + " Y = Y.reshape([B, T, D])\n", + " return Y, aux\n", + "\n", + "class MoEHead(nn.Layer):\n", + " def __init__(self, d_model=512, cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.moe = MoE(d_model, cfg or MoEConfig())\n", + " def forward(self, tok, domain_id=None):\n", + " y, aux = self.moe(tok.unsqueeze(1), domain_id=domain_id) # (B,1,D)\n", + " return y.squeeze(1), aux\n", + "\n", + "# ====================== 自定义 Transformer Encoder(FFN 可替换 MoE) ======================\n", + "class TransformerEncoderLayerMoE(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, d_ff=1024, dropout=0.1,\n", + " use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.use_moe = use_moe\n", + " self.self_attn = nn.MultiHeadAttention(embed_dim=d_model, num_heads=nhead, dropout=dropout)\n", + " self.ln1 = nn.LayerNorm(d_model)\n", + " self.do1 = nn.Dropout(dropout)\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(\n", + " nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model),\n", + " )\n", + " self.do2 = nn.Dropout(dropout)\n", + "\n", + " def forward(self, x, domain_id=None): # (B,T,D)\n", + " h = self.ln1(x)\n", + " h = paddle.transpose(h, [1, 0, 2]) # (T,B,D)\n", + " sa = self.self_attn(h, h, h) # (T,B,D)\n", + " sa = paddle.transpose(sa, [1, 0, 2]) # (B,T,D)\n", + " x = x + self.do1(sa)\n", + " aux = 0.0\n", + " if self.use_moe:\n", + " x, aux = self.moe(x, domain_id=domain_id)\n", + " else:\n", + " x = x + self.do2(self.ffn(x))\n", + " return x, aux\n", + "\n", + "class TemporalTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, num_layers=2, d_ff=1024, dropout=0.1,\n", + " max_len=4096, use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.pos = SinusoidalPositionalEncoding(d_model, max_len=max_len)\n", + " self.layers = nn.LayerList([\n", + " TransformerEncoderLayerMoE(d_model, nhead, d_ff, dropout,\n", + " use_moe=use_moe, moe_cfg=moe_cfg)\n", + " for _ in range(num_layers)\n", + " ])\n", + " def forward(self, x, domain_id=None): # x: (B,T,D)\n", + " x = self.pos(x)\n", + " aux_total = 0.0\n", + " for layer in self.layers:\n", + " x, aux = layer(x, domain_id=domain_id)\n", + " aux_total = aux_total + aux\n", + " return x, aux_total\n", + "\n", + "# ====================== Cross-Attention 融合 ======================\n", + "class MultiHeadCrossAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_model = d_model\n", + " self.nhead = nhead\n", + " self.d_head = d_model // nhead\n", + " self.Wq = nn.Linear(d_model, d_model)\n", + " self.Wk = nn.Linear(d_model, d_model)\n", + " self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.ln = nn.LayerNorm(d_model)\n", + "\n", + " def forward(self, q, kv):\n", + " B, Nq, D = q.shape\n", + " q_lin = self.Wq(q); k_lin = self.Wk(kv); v_lin = self.Wv(kv)\n", + " def split_heads(t):\n", + " return t.reshape([B, -1, self.nhead, self.d_head]).transpose([0, 2, 1, 3])\n", + " qh = split_heads(q_lin); kh = split_heads(k_lin); vh = split_heads(v_lin)\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head)\n", + " attn = F.softmax(scores, axis=-1)\n", + " ctx = paddle.matmul(attn, vh)\n", + " ctx = ctx.transpose([0, 2, 1, 3]).reshape([B, Nq, D])\n", + " out = self.proj(ctx)\n", + " out = self.drop(out)\n", + " return self.ln(out + q)\n", + "\n", + "class BiModalCrossFusion(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, dropout=0.1, fuse_hidden=512):\n", + " super().__init__()\n", + " self.ca_v_from_t = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.ca_t_from_v = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.fuse = nn.Sequential(\n", + " nn.Linear(2 * d_model, fuse_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " )\n", + " self.out_dim = fuse_hidden\n", + "\n", + " def forward(self, video_seq, tabm_tok):\n", + " v_tok = video_seq.mean(axis=1, keepdim=True) # (B,1,D)\n", + " t_tok = tabm_tok.unsqueeze(1) # (B,1,D)\n", + " v_upd = self.ca_v_from_t(v_tok, t_tok) # (B,1,D)\n", + " t_upd = self.ca_t_from_v(t_tok, video_seq) # (B,1,D)\n", + " fused = paddle.concat([v_upd, t_upd], axis=-1) # (B,1,2D)\n", + " fused = fused.squeeze(1) # (B,2D)\n", + " return self.fuse(fused) # (B, F)\n", + "\n", + "# ====================== 总模型 ======================\n", + "class TwoModalMultiLabelModel(nn.Layer):\n", + " def __init__(self,\n", + " # 视频模态\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=365, depth_n=24,\n", + " # 结构化模态\n", + " vec_dim=424,\n", + " # 维度与结构\n", + " d_model=512, nhead=4, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1, num_labels=4,\n", + " # MoE 开关\n", + " moe_temporal: bool = True,\n", + " moe_fused: bool = False,\n", + " moe_tabm: bool = False,\n", + " # MoE 超参\n", + " moe_cfg_temporal: MoEConfig = None,\n", + " moe_cfg_fused: MoEConfig = None,\n", + " moe_cfg_tabm: MoEConfig = None):\n", + " super().__init__()\n", + " # A: 逐帧 3D ResNet18\n", + " self.vol_encoder = Volume3DEncoder(in_channels=vid_channels, dropout=dropout) # (B*T,512)\n", + " # A: 时序 Transformer(可 MoE)\n", + " self.temporal = TemporalTransformerFlexible(\n", + " d_model=d_model, nhead=nhead, num_layers=n_trans_layers,\n", + " d_ff=trans_ff, dropout=dropout, max_len=vid_frames,\n", + " use_moe=moe_temporal,\n", + " moe_cfg=moe_cfg_temporal or MoEConfig(\n", + " n_experts=8, top_k=1, d_ff=max(2048, trans_ff), router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " )\n", + " )\n", + " # B: TabM\n", + " self.tabm = TabMFeatureExtractor(vec_dim, d_hidden=tabm_hidden, dropout=dropout)\n", + " self.tabm_proj = nn.Linear(tabm_hidden, d_model)\n", + "\n", + " # 可选:TabM 分支 MoE 头\n", + " self.moe_tabm = moe_tabm\n", + " if moe_tabm:\n", + " self.tabm_moe = MoEHead(d_model=d_model, cfg=moe_cfg_tabm or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 融合\n", + " self.fusion = BiModalCrossFusion(d_model=d_model, nhead=nhead, dropout=dropout, fuse_hidden=d_model)\n", + "\n", + " # 可选:融合 token MoE 头\n", + " self.moe_fused = moe_fused\n", + " if moe_fused:\n", + " self.fused_moe = MoEHead(d_model=d_model, cfg=moe_cfg_fused or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 分类头\n", + " self.head = nn.Linear(self.fusion.out_dim, num_labels)\n", + "\n", + " self.vid_frames = vid_frames\n", + " self.depth_n = depth_n\n", + "\n", + " # 导出融合前 512 表示(用于检索库)\n", + " def encode(self, x_video, x_vec, domain_id=None):\n", + " \"\"\"\n", + " x_video: (B, T, C=20, H=20, W=20, N=24)\n", + " x_vec: (B, 424)\n", + " \"\"\"\n", + " B, T, C, H, W, N = x_video.shape\n", + " assert N == self.depth_n, f\"N mismatch: got {N}, expect {self.depth_n}\"\n", + " # 逐帧 3D 编码: (B*T, C, D=N, H, W)\n", + " xvt = x_video.transpose([0,1,2,5,3,4]).reshape([B*T, C, N, H, W])\n", + " f_frame = self.vol_encoder(xvt) # (B*T, 512)\n", + " f_seq = f_frame.reshape([B, T, -1]) # (B, T, 512)\n", + " z_vid, _ = self.temporal(f_seq, domain_id=domain_id) # (B,T,512)\n", + " z_tabm = self.tabm(x_vec)\n", + " z_tabm = self.tabm_proj(z_tabm) # (B,512)\n", + " if self.moe_tabm:\n", + " z_tabm, _ = self.tabm_moe(z_tabm, domain_id=domain_id)\n", + " fused = self.fusion(z_vid, z_tabm) # (B,512)\n", + " if self.moe_fused:\n", + " fused, _ = self.fused_moe(fused, domain_id=domain_id)\n", + " return fused\n", + "\n", + " def forward(self, x_video, x_vec, domain_id=None):\n", + " fused = self.encode(x_video, x_vec, domain_id=domain_id) # (B,512)\n", + " logits = self.head(fused) # (B,4)\n", + " aux_placeholder = paddle.to_tensor(0.0, dtype='float32')\n", + " return logits, aux_placeholder\n", + "\n", + "# ====================== 指标与训练循环 ======================\n", + "def f1_per_class(y_true: np.ndarray, y_pred: np.ndarray, eps: float = 1e-9) -> Tuple[np.ndarray, float, float]:\n", + " assert y_true.shape == y_pred.shape\n", + " N, C = y_true.shape\n", + " f1_c = np.zeros(C, dtype=np.float32)\n", + " for c in range(C):\n", + " yt, yp = y_true[:, c], y_pred[:, c]\n", + " tp = np.sum((yt == 1) & (yp == 1))\n", + " fp = np.sum((yt == 0) & (yp == 1))\n", + " fn = np.sum((yt == 1) & (yp == 0))\n", + " prec = tp / (tp + fp + eps)\n", + " rec = tp / (tp + fn + eps)\n", + " f1_c[c] = 2 * prec * rec / (prec + rec + eps)\n", + " macro_f1 = float(np.mean(f1_c))\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " prec = tp / (tp + fp + 1e-9)\n", + " rec = tp / (tp + fn + 1e-9)\n", + " micro_f1 = 2 * prec * rec / (prec + rec + 1e-9)\n", + " return f1_c, macro_f1, float(micro_f1)\n", + "\n", + "def average_precision_micro(y_true: np.ndarray, y_prob: np.ndarray, num_thresholds: int = 101) -> float:\n", + " thresholds = np.linspace(0.0, 1.0, num_thresholds)\n", + " precision, recall = [], []\n", + " for t in thresholds:\n", + " y_pred = (y_prob >= t).astype(np.float32)\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " p = tp / (tp + fp + 1e-9)\n", + " r = tp / (tp + fn + 1e-9)\n", + " precision.append(p); recall.append(r)\n", + " order = np.argsort(recall)\n", + " recall = np.array(recall)[order]\n", + " precision = np.array(precision)[order]\n", + " return float(np.trapz(precision, recall))\n", + "\n", + "def train_one_epoch(model, loader, optimizer,\n", + " pos_weight: Optional[paddle.Tensor] = None,\n", + " clip_grad_norm: Optional[float] = None):\n", + " model.train()\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " if pos_weight is not None:\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'), pos_weight=pos_weight)\n", + " else:\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'))\n", + " loss = cls\n", + " loss.backward()\n", + " if clip_grad_norm is not None:\n", + " nn.utils.clip_grad_norm_(model.parameters(), max_norm=clip_grad_norm)\n", + " optimizer.step()\n", + " optimizer.clear_grad()\n", + " total_loss += float(loss); total_batches += 1\n", + " return total_loss / max(1, total_batches)\n", + "\n", + "# ====================== 检索增强(cos / l2;k 邻居软加权;概率融合) ======================\n", + "class Retriever:\n", + " def __init__(self, sim_metric: str = 'cos', k: int = 8, alpha: float = 0.3, tau: float = 0.5):\n", + " assert sim_metric in ['cos', 'l2']\n", + " self.sim_metric = sim_metric\n", + " self.k = k\n", + " self.alpha = alpha\n", + " self.tau = tau\n", + " self.keys = None # (N,D)\n", + " self.labels = None # (N,C)\n", + "\n", + " @paddle.no_grad()\n", + " def build(self, model: nn.Layer, loader: DataLoader):\n", + " model.eval()\n", + " feats, labs = [], []\n", + " for x_vid, x_vec, y in loader:\n", + " f = model.encode(x_vid.astype('float32'), x_vec.astype('float32')) # (B,512)\n", + " feats.append(f.numpy())\n", + " labs.append(y.numpy())\n", + " self.keys = paddle.to_tensor(np.concatenate(feats, axis=0)).astype('float32') # (N,D)\n", + " self.labels = paddle.to_tensor(np.concatenate(labs, axis=0)).astype('float32') # (N,C)\n", + " self.keys_norm = F.normalize(self.keys, axis=-1)\n", + "\n", + " @paddle.no_grad()\n", + " def query_and_fuse(self, model_probs: paddle.Tensor, test_feat: paddle.Tensor) -> paddle.Tensor:\n", + " assert self.keys is not None, \"build() must be called first.\"\n", + " B, D = test_feat.shape\n", + " if self.sim_metric == 'cos':\n", + " q = F.normalize(test_feat, axis=-1)\n", + " sim = paddle.matmul(q, self.keys_norm, transpose_y=True) # (B,N)\n", + " w = F.softmax(sim / self.tau, axis=-1)\n", + " else:\n", + " q2 = paddle.sum(test_feat * test_feat, axis=-1, keepdim=True) # (B,1)\n", + " k2 = paddle.sum(self.keys * self.keys, axis=-1, keepdim=True).transpose([1,0]) # (1,N)\n", + " dot = paddle.matmul(test_feat, self.keys, transpose_y=True) # (B,N)\n", + " dist2 = q2 + k2 - 2.0 * dot # (B,N)\n", + " w = F.softmax(-dist2 / self.tau, axis=-1)\n", + "\n", + " topk_val, topk_idx = paddle.topk(w, k=min(self.k, w.shape[1]), axis=-1) # (B,k)\n", + " picked_labels = paddle.gather(self.labels, topk_idx.reshape([-1]), axis=0) # (B*k, C)\n", + " C = self.labels.shape[1]\n", + " picked_labels = picked_labels.reshape([B, -1, C]) # (B,k,C)\n", + " w_norm = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9) # (B,k)\n", + " p_knn = paddle.sum(picked_labels * w_norm.unsqueeze(-1), axis=1) # (B,C)\n", + "\n", + " p_final = (1.0 - self.alpha) * model_probs + self.alpha * p_knn\n", + " return p_final.clip(1e-6, 1-1e-6)\n", + "\n", + "@paddle.no_grad()\n", + "def evaluate(model, loader, threshold: float = 0.5,\n", + " retriever: Optional[Retriever] = None):\n", + " model.eval()\n", + " ys, ps = [], []\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " prob = F.sigmoid(logits) # (B,C)\n", + " if retriever is not None:\n", + " feat = model.encode(x_vid.astype('float32'), x_vec.astype('float32')) # (B,512)\n", + " prob = retriever.query_and_fuse(prob, feat)\n", + " loss = F.binary_cross_entropy(prob, y.astype('float32'))\n", + " ys.append(y.numpy()); ps.append(prob.numpy())\n", + " total_loss += float(loss); total_batches += 1\n", + "\n", + " y_true = np.concatenate(ys, axis=0)\n", + " y_prob = np.concatenate(ps, axis=0)\n", + " y_pred = (y_prob >= threshold).astype(np.float32)\n", + " per_f1, macro_f1, micro_f1 = f1_per_class(y_true, y_pred)\n", + " ap_micro = average_precision_micro(y_true, y_prob)\n", + " return {\n", + " \"loss\": total_loss / max(1, total_batches),\n", + " \"macro_f1\": macro_f1,\n", + " \"micro_f1\": micro_f1,\n", + " \"per_class_f1\": per_f1.tolist(),\n", + " \"micro_AP\": ap_micro\n", + " }\n", + "\n", + "# ====================== ToyDataset(T=365, N=24) ======================\n", + "class ToyTwoModalDataset(Dataset):\n", + " \"\"\"\n", + " 返回:\n", + " x_video: (T=365, C=20, H=20, W=20, N=24)\n", + " x_vec: (424,)\n", + " y: (4,) 0/1\n", + " \"\"\"\n", + " def __init__(self, n: int, seed: int = 0, T: int = 365, C: int = 20, H: int = 20, W: int = 20, N: int = 24):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.n = n\n", + " self.T, self.C, self.H, self.W, self.N = T, C, H, W, N\n", + " # (n, T, C, H, W, N)\n", + " self.video = rng.normal(size=(n, T, C, H, W, N)).astype('float32')\n", + " self.vec = rng.normal(size=(n, 424)).astype('float32')\n", + "\n", + " # 造标签:对视频先在 H/W/N 上均值,再在 T 上均值 → (n, C)\n", + " vid_hwn = self.video.mean(axis=(3, 4, 5)) # (n, T, C)\n", + " vid_avg = vid_hwn.mean(axis=1) # (n, C)\n", + "\n", + " Wv = rng.normal(size=(C, 4))\n", + " Wt = rng.normal(size=(424, 4))\n", + " logits = vid_avg @ Wv + self.vec @ Wt + rng.normal(scale=0.5, size=(n, 4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.y = (probs > 0.5).astype('float32')\n", + "\n", + " def __getitem__(self, idx: int):\n", + " return self.video[idx], self.vec[idx], self.y[idx]\n", + " def __len__(self):\n", + " return self.n\n", + "\n", + "# ====================== 训练入口 ======================\n", + "if __name__ == \"__main__\":\n", + " paddle.seed(2025)\n", + "\n", + " # 数据\n", + " T, C, H, W, N = 365, 20, 20, 20, 24\n", + " train_ds = ToyTwoModalDataset(n=32, seed=42, T=T, C=C, H=H, W=W, N=N)\n", + " val_ds = ToyTwoModalDataset(n=16, seed=233, T=T, C=C, H=H, W=W, N=N)\n", + "\n", + " def collate_fn(batch):\n", + " vids, vecs, ys = zip(*batch)\n", + " return (paddle.to_tensor(np.stack(vids, 0)), # (B,T,C,H,W,N)\n", + " paddle.to_tensor(np.stack(vecs, 0)), # (B,424)\n", + " paddle.to_tensor(np.stack(ys, 0))) # (B,4)\n", + "\n", + " # T=365 + 3D 卷积较吃内存,示例用小 batch\n", + " train_loader = DataLoader(train_ds, batch_size=1, shuffle=True, drop_last=False, collate_fn=collate_fn)\n", + " val_loader = DataLoader(val_ds, batch_size=1, shuffle=False, drop_last=False, collate_fn=collate_fn)\n", + "\n", + " # 类别不平衡权重(可选)\n", + " y_train = np.stack([y for _, _, y in train_ds], 0)\n", + " pos_ratio = np.clip(y_train.mean(axis=0), 1e-3, 1-1e-3)\n", + " pos_weight = paddle.to_tensor(((1-pos_ratio)/pos_ratio).astype('float32')) # (4,)\n", + "\n", + " # 模型\n", + " model = TwoModalMultiLabelModel(\n", + " vid_channels=C, vid_h=H, vid_w=W, vid_frames=T, depth_n=N,\n", + " vec_dim=424,\n", + " d_model=512, nhead=4, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1,\n", + " num_labels=4,\n", + " moe_temporal=True, # 推荐开启(FFN 位置 MoE)\n", + " moe_fused=False,\n", + " moe_tabm=False\n", + " )\n", + " optimizer = paddle.optimizer.Adam(learning_rate=3e-4, parameters=model.parameters())\n", + "\n", + " # 训练(演示用)\n", + " best_macro_f1, best = -1.0, None\n", + " for ep in range(1, 2+1):\n", + " train_loss = train_one_epoch(model, train_loader, optimizer,\n", + " pos_weight=pos_weight, clip_grad_norm=1.0)\n", + " val_metrics = evaluate(model, val_loader, threshold=0.5, retriever=None)\n", + " print(f\"[Epoch {ep:02d}] train_loss={train_loss:.4f} | \"\n", + " f\"val_loss={val_metrics['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics['micro_AP']:.4f}\")\n", + " if val_metrics[\"macro_f1\"] > best_macro_f1:\n", + " best_macro_f1 = val_metrics[\"macro_f1\"]\n", + " best = {k: v.clone() for k, v in model.state_dict().items()}\n", + "\n", + " if best is not None:\n", + " model.set_state_dict(best)\n", + " print(f\"Loaded best state with macro_f1={best_macro_f1:.4f}\")\n", + "\n", + " # === 构建检索库(用训练集) ===\n", + " retr = Retriever(sim_metric='cos', k=8, alpha=0.3, tau=0.5) # 可改 'l2'\n", + " retr.build(model, DataLoader(train_ds, batch_size=1, shuffle=False, collate_fn=collate_fn))\n", + "\n", + " # === 测试时启用检索增强 ===\n", + " val_metrics_knn = evaluate(model, val_loader, threshold=0.5, retriever=retr)\n", + " print(f\"[RkNN] val_loss={val_metrics_knn['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics_knn['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics_knn['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics_knn['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics_knn['micro_AP']:.4f}\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "a85yLOn8jaJU", + "outputId": "acabc284-ffc9-4f25-ca2b-46e7971e2234" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/paddle/utils/cpp_extension/extension_utils.py:718: UserWarning: No ccache found. Please be aware that recompiling all source files may be required. You can download and install ccache from: https://github.com/ccache/ccache/blob/master/doc/INSTALL.md\n", + " warnings.warn(warning_message)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## 3D Resnet+单路Transformer+MoE+KNN-Based Retrieve (eval)" + ], + "metadata": { + "id": "ytjhF8Iy5OAI" + } + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math\n", + "from typing import Optional, Tuple\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "\n", + "# ====================== 工具:正弦位置编码 ======================\n", + "class SinusoidalPositionalEncoding(nn.Layer):\n", + " def __init__(self, d_model: int, max_len: int = 4096):\n", + " super().__init__()\n", + " pe = np.zeros((max_len, d_model), dtype=\"float32\")\n", + " position = np.arange(0, max_len, dtype=\"float32\")[:, None]\n", + " div_term = np.exp(np.arange(0, d_model, 2, dtype=\"float32\") * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = np.sin(position * div_term)\n", + " pe[:, 1::2] = np.cos(position * div_term)\n", + " self.register_buffer(\"pe\", paddle.to_tensor(pe), persistable=False)\n", + "\n", + " def forward(self, x): # x: (B, T, D)\n", + " T = x.shape[1]\n", + " return x + self.pe[:T, :]\n", + "\n", + "# ====================== 简化版 TabM(占位,可换你的实现) ======================\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " def __init__(self, num_features: int, d_hidden: int = 512, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(num_features, d_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_hidden, d_hidden),\n", + " nn.ReLU(),\n", + " )\n", + " self.d_hidden = d_hidden\n", + " def forward(self, x_num: paddle.Tensor): # (B, 424)\n", + " return self.net(x_num) # (B, H)\n", + "\n", + "# ====================== 3D ResNet-18 体数据特征抽取 ======================\n", + "class BasicBlock3D(nn.Layer):\n", + " expansion = 1\n", + " def __init__(self, in_planes, planes, stride=(1,1,1), downsample=None):\n", + " super().__init__()\n", + " self.conv1 = nn.Conv3D(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(planes)\n", + " self.relu = nn.ReLU()\n", + " self.conv2 = nn.Conv3D(planes, planes, kernel_size=3, stride=1, padding=1, bias_attr=False)\n", + " self.bn2 = nn.BatchNorm3D(planes)\n", + " self.downsample = downsample\n", + " def forward(self, x):\n", + " identity = x\n", + " out = self.relu(self.bn1(self.conv1(x)))\n", + " out = self.bn2(self.conv2(out))\n", + " if self.downsample is not None:\n", + " identity = self.downsample(x)\n", + " out = self.relu(out + identity)\n", + " return out\n", + "\n", + "class ResNet3D(nn.Layer):\n", + " def __init__(self, block, layers, in_channels=20, base_width=64):\n", + " super().__init__()\n", + " self.in_planes = base_width\n", + " # 只空间下采样,保留较细 D 维\n", + " self.conv1 = nn.Conv3D(in_channels, self.in_planes,\n", + " kernel_size=(3,7,7), stride=(1,2,2),\n", + " padding=(1,3,3), bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(self.in_planes)\n", + " self.relu = nn.ReLU()\n", + " self.maxpool = nn.MaxPool3D(kernel_size=(1,3,3), stride=(1,2,2), padding=(0,1,1))\n", + " self.layer1 = self._make_layer(block, base_width, layers[0], stride=(1,1,1))\n", + " self.layer2 = self._make_layer(block, base_width*2, layers[1], stride=(2,2,2)) # D/H/W /2\n", + " self.layer3 = self._make_layer(block, base_width*4, layers[2], stride=(2,2,2))\n", + " self.layer4 = self._make_layer(block, base_width*8, layers[3], stride=(2,2,2))\n", + " self.out_dim = base_width*8 # 512\n", + " self.pool = nn.AdaptiveAvgPool3D(output_size=1)\n", + "\n", + " def _make_layer(self, block, planes, blocks, stride=(1,1,1)):\n", + " downsample = None\n", + " if stride != (1,1,1) or self.in_planes != planes * block.expansion:\n", + " downsample = nn.Sequential(\n", + " nn.Conv3D(self.in_planes, planes * block.expansion, kernel_size=1, stride=stride, bias_attr=False),\n", + " nn.BatchNorm3D(planes * block.expansion),\n", + " )\n", + " layers = [block(self.in_planes, planes, stride=stride, downsample=downsample)]\n", + " self.in_planes = planes * block.expansion\n", + " for _ in range(1, blocks):\n", + " layers.append(block(self.in_planes, planes))\n", + " return nn.Sequential(*layers)\n", + "\n", + " def forward(self, x): # x: (B, C, D, H, W)\n", + " x = self.relu(self.bn1(self.conv1(x)))\n", + " x = self.maxpool(x)\n", + " x = self.layer1(x) # (B, 64, D, H/4, W/4)\n", + " x = self.layer2(x) # (B, 128, D/2, H/8, W/8)\n", + " x = self.layer3(x) # (B, 256, D/4, H/16, W/16)\n", + " x = self.layer4(x) # (B, 512, D/8, H/32, W/32)\n", + " x = self.pool(x) # (B, 512, 1,1,1)\n", + " x = paddle.flatten(x, 1) # (B, 512)\n", + " return x\n", + "\n", + "class Volume3DEncoder(nn.Layer):\n", + " \"\"\"\n", + " 3D ResNet-18 over (D,H,W) for each time step.\n", + " 输入单帧体数据: (B, C=20, D=24, H=20, W=20) → 输出 (B, 512)\n", + " \"\"\"\n", + " def __init__(self, in_channels: int = 20, base: int = 64, dropout: float = 0.0):\n", + " super().__init__()\n", + " self.backbone = ResNet3D(BasicBlock3D, layers=[2,2,2,2], in_channels=in_channels, base_width=base)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.out_dim = self.backbone.out_dim # 512\n", + " def forward(self, x): # x: (B, C, D, H, W)\n", + " x = self.backbone(x) # (B,512)\n", + " x = self.drop(x)\n", + " return x\n", + "\n", + "# ====================== MoE(Top-k;gather_nd 选择专家) ======================\n", + "class ExpertFFN(nn.Layer):\n", + " def __init__(self, d_model, d_ff, dropout=0.1, act='relu'):\n", + " super().__init__()\n", + " Act = getattr(F, act) if isinstance(act, str) else act\n", + " self.fc1 = nn.Linear(d_model, d_ff)\n", + " self.fc2 = nn.Linear(d_ff, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.act = Act\n", + " def forward(self, x):\n", + " return self.fc2(self.drop(self.act(self.fc1(x))))\n", + "\n", + "class MoEConfig:\n", + " def __init__(self,\n", + " n_experts=8,\n", + " top_k=1,\n", + " d_ff=2048,\n", + " dropout=0.1,\n", + " router_temp=0.5,\n", + " balance_loss_w=0.005,\n", + " entropy_reg_w=-0.005,\n", + " diversity_w=1e-3,\n", + " sticky_w=0.0,\n", + " sup_router_w=0.0,\n", + " use_gumbel=True):\n", + " self.n_experts = n_experts\n", + " self.top_k = top_k\n", + " self.d_ff = d_ff\n", + " self.dropout = dropout\n", + " self.router_temp = router_temp\n", + " self.balance_loss_w = balance_loss_w\n", + " self.entropy_reg_w = entropy_reg_w\n", + " self.diversity_w = diversity_w\n", + " self.sticky_w = sticky_w\n", + " self.sup_router_w = sup_router_w\n", + " self.use_gumbel = use_gumbel\n", + "\n", + "class MoE(nn.Layer):\n", + " \"\"\"forward(x, domain_id=None) → (y, aux_loss),支持 (B,T,D) 或 (N,D)\"\"\"\n", + " def __init__(self, d_model: int, cfg: MoEConfig):\n", + " super().__init__()\n", + " self.cfg = cfg\n", + " self.router = nn.Linear(d_model, cfg.n_experts)\n", + " self.experts = nn.LayerList([ExpertFFN(d_model, cfg.d_ff, cfg.dropout) for _ in range(cfg.n_experts)])\n", + " self.ln = nn.LayerNorm(d_model)\n", + " self.drop = nn.Dropout(cfg.dropout)\n", + "\n", + " def _router_probs(self, logits):\n", + " if self.cfg.use_gumbel and self.training:\n", + " u = paddle.uniform(logits.shape, min=1e-6, max=1-1e-6, dtype=logits.dtype)\n", + " g = -paddle.log(-paddle.log(u))\n", + " logits = logits + g\n", + " return F.softmax(logits / self.cfg.router_temp, axis=-1)\n", + "\n", + " def forward(self, x, domain_id=None):\n", + " orig_shape = x.shape\n", + " if len(orig_shape) == 3:\n", + " B, T, D = orig_shape\n", + " X = x.reshape([B*T, D])\n", + " else:\n", + " X = x\n", + " N, D = X.shape\n", + "\n", + " logits = self.router(X) # (N,E)\n", + " probs = self._router_probs(logits) # (N,E)\n", + " topk_val, topk_idx = paddle.topk(probs, k=self.cfg.top_k, axis=-1) # (N,k)\n", + "\n", + " # 并行专家\n", + " all_out = paddle.stack([e(X) for e in self.experts], axis=1) # (N,E,D)\n", + "\n", + " # gather_nd 逐样本取 top-k\n", + " arangeN = paddle.arange(N, dtype='int64')\n", + " picked_list = []\n", + " for i in range(self.cfg.top_k):\n", + " idx_i = topk_idx[:, i].astype('int64') # (N,)\n", + " idx_nd = paddle.stack([arangeN, idx_i], axis=1) # (N,2)\n", + " picked_i = paddle.gather_nd(all_out, idx_nd) # (N,D)\n", + " picked_list.append(picked_i)\n", + " picked = paddle.stack(picked_list, axis=1) # (N,k,D)\n", + "\n", + " # 加权\n", + " w = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9) # (N,k)\n", + " Y = paddle.sum(picked * w.unsqueeze(-1), axis=1) # (N,D)\n", + "\n", + " # 残差+归一\n", + " Y = self.drop(Y)\n", + " Y = self.ln(Y + X)\n", + "\n", + " # 辅助损失\n", + " aux = 0.0\n", + " if self.cfg.balance_loss_w > 0:\n", + " mean_prob = probs.mean(axis=0)\n", + " target = paddle.full_like(mean_prob, 1.0 / self.cfg.n_experts)\n", + " aux = aux + self.cfg.balance_loss_w * F.mse_loss(mean_prob, target)\n", + " if self.cfg.entropy_reg_w != 0.0:\n", + " ent = -paddle.sum(probs * (paddle.log(probs + 1e-9)), axis=1).mean()\n", + " aux = aux + self.cfg.entropy_reg_w * ent\n", + " if (domain_id is not None) and (self.cfg.sup_router_w > 0):\n", + " dom = domain_id.reshape([-1])[:N] % self.cfg.n_experts\n", + " aux = aux + self.cfg.sup_router_w * F.cross_entropy(logits, dom)\n", + " if self.cfg.diversity_w > 0 and self.cfg.n_experts > 1:\n", + " chosen = F.one_hot(topk_idx[:, 0], num_classes=self.cfg.n_experts).astype('float32') # (N,E)\n", + " denom = chosen.sum(axis=0).clip(min=1.0).unsqueeze(-1)\n", + " means = (all_out * chosen.unsqueeze(-1)).sum(axis=0) / denom # (E,D)\n", + " sims = []\n", + " for i in range(self.cfg.n_experts):\n", + " for j in range(i+1, self.cfg.n_experts):\n", + " si = F.normalize(means[i:i+1], axis=-1)\n", + " sj = F.normalize(means[j:j+1], axis=-1)\n", + " sims.append((si*sj).sum())\n", + " if sims:\n", + " aux = aux + self.cfg.diversity_w * paddle.stack(sims).mean()\n", + "\n", + " if len(orig_shape) == 3:\n", + " Y = Y.reshape([B, T, D])\n", + " return Y, aux\n", + "\n", + "class MoEHead(nn.Layer):\n", + " def __init__(self, d_model=512, cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.moe = MoE(d_model, cfg or MoEConfig())\n", + " def forward(self, tok, domain_id=None):\n", + " y, aux = self.moe(tok.unsqueeze(1), domain_id=domain_id) # (B,1,D)\n", + " return y.squeeze(1), aux\n", + "\n", + "# ====================== 自定义 Transformer Encoder(FFN 可替换 MoE) ======================\n", + "class TransformerEncoderLayerMoE(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, d_ff=1024, dropout=0.1,\n", + " use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.use_moe = use_moe\n", + " self.self_attn = nn.MultiHeadAttention(embed_dim=d_model, num_heads=nhead, dropout=dropout)\n", + " self.ln1 = nn.LayerNorm(d_model)\n", + " self.do1 = nn.Dropout(dropout)\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(\n", + " nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model),\n", + " )\n", + " self.do2 = nn.Dropout(dropout)\n", + "\n", + " def forward(self, x, domain_id=None): # (B,T,D)\n", + " h = self.ln1(x)\n", + " h = paddle.transpose(h, [1, 0, 2]) # (T,B,D)\n", + " sa = self.self_attn(h, h, h) # (T,B,D)\n", + " sa = paddle.transpose(sa, [1, 0, 2]) # (B,T,D)\n", + " x = x + self.do1(sa)\n", + " aux = 0.0\n", + " if self.use_moe:\n", + " x, aux = self.moe(x, domain_id=domain_id)\n", + " else:\n", + " x = x + self.do2(self.ffn(x))\n", + " return x, aux\n", + "\n", + "class TemporalTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, num_layers=2, d_ff=1024, dropout=0.1,\n", + " max_len=4096, use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.pos = SinusoidalPositionalEncoding(d_model, max_len=max_len)\n", + " self.layers = nn.LayerList([\n", + " TransformerEncoderLayerMoE(d_model, nhead, d_ff, dropout,\n", + " use_moe=use_moe, moe_cfg=moe_cfg)\n", + " for _ in range(num_layers)\n", + " ])\n", + " def forward(self, x, domain_id=None): # x: (B,T,D)\n", + " x = self.pos(x)\n", + " aux_total = 0.0\n", + " for layer in self.layers:\n", + " x, aux = layer(x, domain_id=domain_id)\n", + " aux_total = aux_total + aux\n", + " return x, aux_total\n", + "\n", + "# ====================== Cross-Attention 融合 ======================\n", + "class MultiHeadCrossAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_model = d_model\n", + " self.nhead = nhead\n", + " self.d_head = d_model // nhead\n", + " self.Wq = nn.Linear(d_model, d_model)\n", + " self.Wk = nn.Linear(d_model, d_model)\n", + " self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.ln = nn.LayerNorm(d_model)\n", + "\n", + " def forward(self, q, kv):\n", + " B, Nq, D = q.shape\n", + " q_lin = self.Wq(q); k_lin = self.Wk(kv); v_lin = self.Wv(kv)\n", + " def split_heads(t):\n", + " return t.reshape([B, -1, self.nhead, self.d_head]).transpose([0, 2, 1, 3])\n", + " qh = split_heads(q_lin); kh = split_heads(k_lin); vh = split_heads(v_lin)\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head)\n", + " attn = F.softmax(scores, axis=-1)\n", + " ctx = paddle.matmul(attn, vh)\n", + " ctx = ctx.transpose([0, 2, 1, 3]).reshape([B, Nq, D])\n", + " out = self.proj(ctx)\n", + " out = self.drop(out)\n", + " return self.ln(out + q)\n", + "\n", + "class BiModalCrossFusion(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, dropout=0.1, fuse_hidden=512):\n", + " super().__init__()\n", + " self.ca_v_from_t = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.ca_t_from_v = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.fuse = nn.Sequential(\n", + " nn.Linear(2 * d_model, fuse_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " )\n", + " self.out_dim = fuse_hidden\n", + "\n", + " def forward(self, video_seq, tabm_tok):\n", + " v_tok = video_seq.mean(axis=1, keepdim=True) # (B,1,D)\n", + " t_tok = tabm_tok.unsqueeze(1) # (B,1,D)\n", + " v_upd = self.ca_v_from_t(v_tok, t_tok) # (B,1,D)\n", + " t_upd = self.ca_t_from_v(t_tok, video_seq) # (B,1,D)\n", + " fused = paddle.concat([v_upd, t_upd], axis=-1) # (B,1,2D)\n", + " fused = fused.squeeze(1) # (B,2D)\n", + " return self.fuse(fused) # (B, F)\n", + "\n", + "# ====================== 总模型 ======================\n", + "class TwoModalMultiLabelModel(nn.Layer):\n", + " def __init__(self,\n", + " # 气象模态\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=365, depth_n=24,\n", + " # 结构化模态\n", + " vec_dim=424,\n", + " # 维度与结构\n", + " d_model=512, nhead=4, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1, num_labels=4,\n", + " # MoE 开关\n", + " moe_temporal: bool = True,\n", + " moe_fused: bool = False,\n", + " moe_tabm: bool = False,\n", + " # MoE 超参\n", + " moe_cfg_temporal: MoEConfig = None,\n", + " moe_cfg_fused: MoEConfig = None,\n", + " moe_cfg_tabm: MoEConfig = None):\n", + " super().__init__()\n", + " # A: 逐帧 3D ResNet18\n", + " self.vol_encoder = Volume3DEncoder(in_channels=vid_channels, dropout=dropout) # (B*T,512)\n", + " # A: 时序 Transformer(可 MoE)\n", + " self.temporal = TemporalTransformerFlexible(\n", + " d_model=d_model, nhead=nhead, num_layers=n_trans_layers,\n", + " d_ff=trans_ff, dropout=dropout, max_len=vid_frames,\n", + " use_moe=moe_temporal,\n", + " moe_cfg=moe_cfg_temporal or MoEConfig(\n", + " n_experts=8, top_k=1, d_ff=max(2048, trans_ff), router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " )\n", + " )\n", + " # B: TabM\n", + " self.tabm = TabMFeatureExtractor(vec_dim, d_hidden=tabm_hidden, dropout=dropout)\n", + " self.tabm_proj = nn.Linear(tabm_hidden, d_model)\n", + "\n", + " # 可选:TabM 分支 MoE 头\n", + " self.moe_tabm = moe_tabm\n", + " if moe_tabm:\n", + " self.tabm_moe = MoEHead(d_model=d_model, cfg=moe_cfg_tabm or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 融合\n", + " self.fusion = BiModalCrossFusion(d_model=d_model, nhead=nhead, dropout=dropout, fuse_hidden=d_model)\n", + "\n", + " # 可选:融合 token MoE 头\n", + " self.moe_fused = moe_fused\n", + " if moe_fused:\n", + " self.fused_moe = MoEHead(d_model=d_model, cfg=moe_cfg_fused or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 分类头\n", + " self.head = nn.Linear(self.fusion.out_dim, num_labels)\n", + "\n", + " self.vid_frames = vid_frames\n", + " self.depth_n = depth_n\n", + "\n", + " # 导出融合前 512 表示(用于检索库)\n", + " def encode(self, x_video, x_vec, domain_id=None):\n", + " \"\"\"\n", + " x_video: (B, T, C=20, H=20, W=20, N=24)\n", + " x_vec: (B, 424)\n", + " \"\"\"\n", + " B, T, C, H, W, N = x_video.shape\n", + " assert N == self.depth_n, f\"N mismatch: got {N}, expect {self.depth_n}\"\n", + " # 逐帧 3D 编码: (B*T, C, D=N, H, W)\n", + " xvt = x_video.transpose([0,1,2,5,3,4]).reshape([B*T, C, N, H, W])\n", + " f_frame = self.vol_encoder(xvt) # (B*T, 512)\n", + " f_seq = f_frame.reshape([B, T, -1]) # (B, T, 512)\n", + " z_vid, _ = self.temporal(f_seq, domain_id=domain_id) # (B,T,512)\n", + " z_tabm = self.tabm(x_vec)\n", + " z_tabm = self.tabm_proj(z_tabm) # (B,512)\n", + " if self.moe_tabm:\n", + " z_tabm, _ = self.tabm_moe(z_tabm, domain_id=domain_id)\n", + " fused = self.fusion(z_vid, z_tabm) # (B,512)\n", + " if self.moe_fused:\n", + " fused, _ = self.fused_moe(fused, domain_id=domain_id)\n", + " return fused\n", + "\n", + " def forward(self, x_video, x_vec, domain_id=None):\n", + " fused = self.encode(x_video, x_vec, domain_id=domain_id) # (B,512)\n", + " logits = self.head(fused) # (B,4)\n", + " aux_placeholder = paddle.to_tensor(0.0, dtype='float32')\n", + " return logits, aux_placeholder\n", + "\n", + "# ====================== 指标与训练循环 ======================\n", + "def f1_per_class(y_true: np.ndarray, y_pred: np.ndarray, eps: float = 1e-9) -> Tuple[np.ndarray, float, float]:\n", + " assert y_true.shape == y_pred.shape\n", + " N, C = y_true.shape\n", + " f1_c = np.zeros(C, dtype=np.float32)\n", + " for c in range(C):\n", + " yt, yp = y_true[:, c], y_pred[:, c]\n", + " tp = np.sum((yt == 1) & (yp == 1))\n", + " fp = np.sum((yt == 0) & (yp == 1))\n", + " fn = np.sum((yt == 1) & (yp == 0))\n", + " prec = tp / (tp + fp + eps)\n", + " rec = tp / (tp + fn + eps)\n", + " f1_c[c] = 2 * prec * rec / (prec + rec + eps)\n", + " macro_f1 = float(np.mean(f1_c))\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " prec = tp / (tp + fp + 1e-9)\n", + " rec = tp / (tp + fn + 1e-9)\n", + " micro_f1 = 2 * prec * rec / (prec + rec + 1e-9)\n", + " return f1_c, macro_f1, float(micro_f1)\n", + "\n", + "def average_precision_micro(y_true: np.ndarray, y_prob: np.ndarray, num_thresholds: int = 101) -> float:\n", + " thresholds = np.linspace(0.0, 1.0, num_thresholds)\n", + " precision, recall = [], []\n", + " for t in thresholds:\n", + " y_pred = (y_prob >= t).astype(np.float32)\n", + " tp = np.sum((y_true == 1) & (y_pred == 1))\n", + " fp = np.sum((y_true == 0) & (y_pred == 1))\n", + " fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " p = tp / (tp + fp + 1e-9)\n", + " r = tp / (tp + fn + 1e-9)\n", + " precision.append(p); recall.append(r)\n", + " order = np.argsort(recall)\n", + " recall = np.array(recall)[order]\n", + " precision = np.array(precision)[order]\n", + " return float(np.trapz(precision, recall))\n", + "\n", + "def train_one_epoch(model, loader, optimizer,\n", + " pos_weight: Optional[paddle.Tensor] = None,\n", + " clip_grad_norm: Optional[float] = None):\n", + " model.train()\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " if pos_weight is not None:\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'), pos_weight=pos_weight)\n", + " else:\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'))\n", + " loss = cls\n", + " loss.backward()\n", + " if clip_grad_norm is not None:\n", + " nn.utils.clip_grad_norm_(model.parameters(), max_norm=clip_grad_norm)\n", + " optimizer.step()\n", + " optimizer.clear_grad()\n", + " total_loss += float(loss); total_batches += 1\n", + " return total_loss / max(1, total_batches)\n", + "\n", + "# ====================== 检索增强(cos / l2;k 邻居软加权;概率融合) ======================\n", + "class Retriever:\n", + " def __init__(self, sim_metric: str = 'cos', k: int = 8, alpha: float = 0.3, tau: float = 0.5):\n", + " assert sim_metric in ['cos', 'l2']\n", + " self.sim_metric = sim_metric\n", + " self.k = k\n", + " self.alpha = alpha\n", + " self.tau = tau\n", + " self.keys = None # (N,D)\n", + " self.labels = None # (N,C)\n", + "\n", + " @paddle.no_grad()\n", + " def build(self, model: nn.Layer, loader: DataLoader):\n", + " model.eval()\n", + " feats, labs = [], []\n", + " for x_vid, x_vec, y in loader:\n", + " f = model.encode(x_vid.astype('float32'), x_vec.astype('float32')) # (B,512)\n", + " feats.append(f.numpy())\n", + " labs.append(y.numpy())\n", + " self.keys = paddle.to_tensor(np.concatenate(feats, axis=0)).astype('float32') # (N,D)\n", + " self.labels = paddle.to_tensor(np.concatenate(labs, axis=0)).astype('float32') # (N,C)\n", + " self.keys_norm = F.normalize(self.keys, axis=-1)\n", + "\n", + " @paddle.no_grad()\n", + " def query_and_fuse(self, model_probs: paddle.Tensor, test_feat: paddle.Tensor) -> paddle.Tensor:\n", + " assert self.keys is not None, \"build() must be called first.\"\n", + " B, D = test_feat.shape\n", + " if self.sim_metric == 'cos':\n", + " q = F.normalize(test_feat, axis=-1)\n", + " sim = paddle.matmul(q, self.keys_norm, transpose_y=True) # (B,N)\n", + " w = F.softmax(sim / self.tau, axis=-1)\n", + " else:\n", + " q2 = paddle.sum(test_feat * test_feat, axis=-1, keepdim=True) # (B,1)\n", + " k2 = paddle.sum(self.keys * self.keys, axis=-1, keepdim=True).transpose([1,0]) # (1,N)\n", + " dot = paddle.matmul(test_feat, self.keys, transpose_y=True) # (B,N)\n", + " dist2 = q2 + k2 - 2.0 * dot # (B,N)\n", + " w = F.softmax(-dist2 / self.tau, axis=-1)\n", + "\n", + " topk_val, topk_idx = paddle.topk(w, k=min(self.k, w.shape[1]), axis=-1) # (B,k)\n", + " picked_labels = paddle.gather(self.labels, topk_idx.reshape([-1]), axis=0) # (B*k, C)\n", + " C = self.labels.shape[1]\n", + " picked_labels = picked_labels.reshape([B, -1, C]) # (B,k,C)\n", + " w_norm = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9) # (B,k)\n", + " p_knn = paddle.sum(picked_labels * w_norm.unsqueeze(-1), axis=1) # (B,C)\n", + "\n", + " p_final = (1.0 - self.alpha) * model_probs + self.alpha * p_knn\n", + " return p_final.clip(1e-6, 1-1e-6)\n", + "\n", + "@paddle.no_grad()\n", + "def evaluate(model, loader, threshold: float = 0.5,\n", + " retriever: Optional[Retriever] = None):\n", + " model.eval()\n", + " ys, ps = [], []\n", + " total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " prob = F.sigmoid(logits) # (B,C)\n", + " if retriever is not None:\n", + " feat = model.encode(x_vid.astype('float32'), x_vec.astype('float32')) # (B,512)\n", + " prob = retriever.query_and_fuse(prob, feat)\n", + " loss = F.binary_cross_entropy(prob, y.astype('float32'))\n", + " ys.append(y.numpy()); ps.append(prob.numpy())\n", + " total_loss += float(loss); total_batches += 1\n", + "\n", + " y_true = np.concatenate(ys, axis=0)\n", + " y_prob = np.concatenate(ps, axis=0)\n", + " y_pred = (y_prob >= threshold).astype(np.float32)\n", + " per_f1, macro_f1, micro_f1 = f1_per_class(y_true, y_pred)\n", + " ap_micro = average_precision_micro(y_true, y_prob)\n", + " return {\n", + " \"loss\": total_loss / max(1, total_batches),\n", + " \"macro_f1\": macro_f1,\n", + " \"micro_f1\": micro_f1,\n", + " \"per_class_f1\": per_f1.tolist(),\n", + " \"micro_AP\": ap_micro\n", + " }\n", + "\n", + "# ====================== ToyDataset(T=365, N=24) ======================\n", + "class ToyTwoModalDataset(Dataset):\n", + " \"\"\"\n", + " 返回:\n", + " x_video: (T=365, C=20, H=20, W=20, N=24)\n", + " x_vec: (424,)\n", + " y: (4,) 0/1\n", + " \"\"\"\n", + " def __init__(self, n: int, seed: int = 0, T: int = 365, C: int = 20, H: int = 20, W: int = 20, N: int = 24):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.n = n\n", + " self.T, self.C, self.H, self.W, self.N = T, C, H, W, N\n", + " # (n, T, C, H, W, N)\n", + " self.video = rng.normal(size=(n, T, C, H, W, N)).astype('float32')\n", + " self.vec = rng.normal(size=(n, 424)).astype('float32')\n", + "\n", + " # 造标签:对视频先在 H/W/N 上均值,再在 T 上均值 → (n, C)\n", + " vid_hwn = self.video.mean(axis=(3, 4, 5)) # (n, T, C)\n", + " vid_avg = vid_hwn.mean(axis=1) # (n, C)\n", + "\n", + " Wv = rng.normal(size=(C, 4))\n", + " Wt = rng.normal(size=(424, 4))\n", + " logits = vid_avg @ Wv + self.vec @ Wt + rng.normal(scale=0.5, size=(n, 4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.y = (probs > 0.5).astype('float32')\n", + "\n", + " def __getitem__(self, idx: int):\n", + " return self.video[idx], self.vec[idx], self.y[idx]\n", + " def __len__(self):\n", + " return self.n\n", + "\n", + "# ====================== 训练入口 ======================\n", + "if __name__ == \"__main__\":\n", + " paddle.seed(2025)\n", + "\n", + " # 数据\n", + " T, C, H, W, N = 365, 20, 20, 20, 24\n", + " train_ds = ToyTwoModalDataset(n=32, seed=42, T=T, C=C, H=H, W=W, N=N)\n", + " val_ds = ToyTwoModalDataset(n=16, seed=233, T=T, C=C, H=H, W=W, N=N)\n", + "\n", + " def collate_fn(batch):\n", + " vids, vecs, ys = zip(*batch)\n", + " return (paddle.to_tensor(np.stack(vids, 0)), # (B,T,C,H,W,N)\n", + " paddle.to_tensor(np.stack(vecs, 0)), # (B,424)\n", + " paddle.to_tensor(np.stack(ys, 0))) # (B,4)\n", + "\n", + " # T=365 + 3D 卷积较吃内存,示例用小 batch\n", + " train_loader = DataLoader(train_ds, batch_size=1, shuffle=True, drop_last=False, collate_fn=collate_fn)\n", + " val_loader = DataLoader(val_ds, batch_size=1, shuffle=False, drop_last=False, collate_fn=collate_fn)\n", + "\n", + " # 类别不平衡权重(可选)\n", + " y_train = np.stack([y for _, _, y in train_ds], 0)\n", + " pos_ratio = np.clip(y_train.mean(axis=0), 1e-3, 1-1e-3)\n", + " pos_weight = paddle.to_tensor(((1-pos_ratio)/pos_ratio).astype('float32')) # (4,)\n", + "\n", + " # 模型\n", + " model = TwoModalMultiLabelModel(\n", + " vid_channels=C, vid_h=H, vid_w=W, vid_frames=T, depth_n=N,\n", + " vec_dim=424,\n", + " d_model=512, nhead=4, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1,\n", + " num_labels=4,\n", + " moe_temporal=True, # 推荐开启(FFN 位置 MoE)\n", + " moe_fused=False,\n", + " moe_tabm=False\n", + " )\n", + " optimizer = paddle.optimizer.Adam(learning_rate=3e-4, parameters=model.parameters())\n", + "\n", + " # 训练(演示用)\n", + " best_macro_f1, best = -1.0, None\n", + " for ep in range(1, 2+1):\n", + " train_loss = train_one_epoch(model, train_loader, optimizer,\n", + " pos_weight=pos_weight, clip_grad_norm=1.0)\n", + " val_metrics = evaluate(model, val_loader, threshold=0.5, retriever=None)\n", + " print(f\"[Epoch {ep:02d}] train_loss={train_loss:.4f} | \"\n", + " f\"val_loss={val_metrics['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics['micro_AP']:.4f}\")\n", + " if val_metrics[\"macro_f1\"] > best_macro_f1:\n", + " best_macro_f1 = val_metrics[\"macro_f1\"]\n", + " best = {k: v.clone() for k, v in model.state_dict().items()}\n", + "\n", + " if best is not None:\n", + " model.set_state_dict(best)\n", + " print(f\"Loaded best state with macro_f1={best_macro_f1:.4f}\")\n", + "\n", + " # === 构建检索库(用训练集) ===\n", + " retr = Retriever(sim_metric='cos', k=8, alpha=0.3, tau=0.5) # 可改 'l2'\n", + " retr.build(model, DataLoader(train_ds, batch_size=1, shuffle=False, collate_fn=collate_fn))\n", + "\n", + " # === 测试时启用检索增强 ===\n", + " val_metrics_knn = evaluate(model, val_loader, threshold=0.5, retriever=retr)\n", + " print(f\"[RkNN] val_loss={val_metrics_knn['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics_knn['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics_knn['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics_knn['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics_knn['micro_AP']:.4f}\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RwuikckFkM1O", + "outputId": "e3f4b29c-5ea0-4521-fb95-4c5e1b2481c6" + }, + "execution_count": null, + "outputs": [ + { + "metadata": { + "tags": null + }, + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipython-input-3749866666.py:468: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", + " return float(np.trapz(precision, recall))\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[Epoch 01] train_loss=1.4326 | val_loss=1.2070 | macro_f1=0.2811 | micro_f1=0.3667 | per_class_f1=[0.31578946113586426, 0.20000000298023224, 0.6086956262588501, 0.0] | micro_AP=0.3789\n", + "[Epoch 02] train_loss=0.9451 | val_loss=0.9437 | macro_f1=0.2456 | micro_f1=0.3729 | per_class_f1=[0.31578946113586426, 0.0, 0.0, 0.6666666865348816] | micro_AP=0.3957\n", + "Loaded best state with macro_f1=0.2811\n", + "[RkNN] val_loss=0.8693 | macro_f1=0.2904 | micro_f1=0.3793 | per_class_f1=[0.3529411852359772, 0.20000000298023224, 0.6086956262588501, 0.0] | micro_AP=0.4058\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# 3D Resnet+Bi-Transformer+AFNO+MoE+KNN-Based Retrieve" + ], + "metadata": { + "id": "Olb6WKmR4D2B" + } + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math\n", + "from typing import Optional, Tuple\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "# 选中第 0 张 GPU;如有多卡改成 'gpu:1' 等\n", + "# paddle.set_device('gpu:0')\n", + "\n", + "# ====================== 工具:正弦位置编码 ======================\n", + "class SinusoidalPositionalEncoding(nn.Layer):\n", + " def __init__(self, d_model: int, max_len: int = 4096):\n", + " super().__init__()\n", + " pe = np.zeros((max_len, d_model), dtype=\"float32\")\n", + " position = np.arange(0, max_len, dtype=\"float32\")[:, None]\n", + " div_term = np.exp(np.arange(0, d_model, 2, dtype=\"float32\") * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = np.sin(position * div_term)\n", + " pe[:, 1::2] = np.cos(position * div_term)\n", + " self.register_buffer(\"pe\", paddle.to_tensor(pe), persistable=False)\n", + " def forward(self, x): # (B,T,D)\n", + " T = x.shape[1]\n", + " return x + self.pe[:T, :]\n", + "\n", + "# ====================== TabM(占位,可换你的实现) ======================\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " def __init__(self, num_features: int, d_hidden: int = 512, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(num_features, d_hidden),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(d_hidden, d_hidden),\n", + " nn.ReLU(),\n", + " )\n", + " self.d_hidden = d_hidden\n", + " def forward(self, x_num: paddle.Tensor):\n", + " return self.net(x_num)\n", + "\n", + "# ====================== 3D ResNet-18 体数据特征抽取 ======================\n", + "class BasicBlock3D(nn.Layer):\n", + " expansion = 1\n", + " def __init__(self, in_planes, planes, stride=(1,1,1), downsample=None):\n", + " super().__init__()\n", + " self.conv1 = nn.Conv3D(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(planes)\n", + " self.relu = nn.ReLU()\n", + " self.conv2 = nn.Conv3D(planes, planes, kernel_size=3, stride=1, padding=1, bias_attr=False)\n", + " self.bn2 = nn.BatchNorm3D(planes)\n", + " self.downsample = downsample\n", + " def forward(self, x):\n", + " identity = x\n", + " out = self.relu(self.bn1(self.conv1(x)))\n", + " out = self.bn2(self.conv2(out))\n", + " if self.downsample is not None:\n", + " identity = self.downsample(x)\n", + " out = self.relu(out + identity)\n", + " return out\n", + "\n", + "class ResNet3D(nn.Layer):\n", + " def __init__(self, block, layers, in_channels=20, base_width=64):\n", + " super().__init__()\n", + " self.in_planes = base_width\n", + " self.conv1 = nn.Conv3D(in_channels, self.in_planes,\n", + " kernel_size=(3,7,7), stride=(1,2,2),\n", + " padding=(1,3,3), bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(self.in_planes)\n", + " self.relu = nn.ReLU()\n", + " self.maxpool = nn.MaxPool3D(kernel_size=(1,3,3), stride=(1,2,2), padding=(0,1,1))\n", + " self.layer1 = self._make_layer(block, base_width, layers[0], stride=(1,1,1))\n", + " self.layer2 = self._make_layer(block, base_width*2, layers[1], stride=(2,2,2))\n", + " self.layer3 = self._make_layer(block, base_width*4, layers[2], stride=(2,2,2))\n", + " self.layer4 = self._make_layer(block, base_width*8, layers[3], stride=(2,2,2))\n", + " self.out_dim = base_width*8 # 512\n", + " self.pool = nn.AdaptiveAvgPool3D(output_size=1)\n", + " def _make_layer(self, block, planes, blocks, stride=(1,1,1)):\n", + " downsample = None\n", + " if stride != (1,1,1) or self.in_planes != planes * block.expansion:\n", + " downsample = nn.Sequential(\n", + " nn.Conv3D(self.in_planes, planes * block.expansion, kernel_size=1, stride=stride, bias_attr=False),\n", + " nn.BatchNorm3D(planes * block.expansion),\n", + " )\n", + " layers = [block(self.in_planes, planes, stride=stride, downsample=downsample)]\n", + " self.in_planes = planes * block.expansion\n", + " for _ in range(1, blocks):\n", + " layers.append(block(self.in_planes, planes))\n", + " return nn.Sequential(*layers)\n", + " def forward(self, x): # (B, C, D, H, W)\n", + " x = self.relu(self.bn1(self.conv1(x)))\n", + " x = self.maxpool(x)\n", + " x = self.layer1(x)\n", + " x = self.layer2(x)\n", + " x = self.layer3(x)\n", + " x = self.layer4(x)\n", + " x = self.pool(x) # (B, 512, 1,1,1)\n", + " x = paddle.flatten(x, 1) # (B, 512)\n", + " return x\n", + "\n", + "class Volume3DEncoder(nn.Layer):\n", + " def __init__(self, in_channels: int = 20, base: int = 64, dropout: float = 0.0):\n", + " super().__init__()\n", + " self.backbone = ResNet3D(BasicBlock3D, layers=[2,2,2,2], in_channels=in_channels, base_width=base)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.out_dim = self.backbone.out_dim # 512\n", + " def forward(self, x): # (B, C, D, H, W)\n", + " x = self.backbone(x)\n", + " x = self.drop(x)\n", + " return x\n", + "\n", + "# ====================== MoE(Top-k;gather_nd 选择专家) ======================\n", + "class ExpertFFN(nn.Layer):\n", + " def __init__(self, d_model, d_ff, dropout=0.1, act='relu'):\n", + " super().__init__()\n", + " Act = getattr(F, act) if isinstance(act, str) else act\n", + " self.fc1 = nn.Linear(d_model, d_ff)\n", + " self.fc2 = nn.Linear(d_ff, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.act = Act\n", + " def forward(self, x):\n", + " return self.fc2(self.drop(self.act(self.fc1(x))))\n", + "\n", + "class MoEConfig:\n", + " def __init__(self,\n", + " n_experts=8, top_k=1, d_ff=2048, dropout=0.1,\n", + " router_temp=0.5, balance_loss_w=0.005, entropy_reg_w=-0.005,\n", + " diversity_w=1e-3, sticky_w=0.0, sup_router_w=0.0, use_gumbel=True):\n", + " self.n_experts = n_experts; self.top_k = top_k; self.d_ff = d_ff; self.dropout = dropout\n", + " self.router_temp = router_temp; self.balance_loss_w = balance_loss_w\n", + " self.entropy_reg_w = entropy_reg_w; self.diversity_w = diversity_w\n", + " self.sticky_w = sticky_w; self.sup_router_w = sup_router_w; self.use_gumbel = use_gumbel\n", + "\n", + "class MoE(nn.Layer):\n", + " def __init__(self, d_model: int, cfg: MoEConfig):\n", + " super().__init__()\n", + " self.cfg = cfg\n", + " self.router = nn.Linear(d_model, cfg.n_experts)\n", + " self.experts = nn.LayerList([ExpertFFN(d_model, cfg.d_ff, cfg.dropout) for _ in range(cfg.n_experts)])\n", + " self.ln = nn.LayerNorm(d_model)\n", + " self.drop = nn.Dropout(cfg.dropout)\n", + " def _router_probs(self, logits):\n", + " if self.cfg.use_gumbel and self.training:\n", + " u = paddle.uniform(logits.shape, min=1e-6, max=1-1e-6, dtype=logits.dtype)\n", + " g = -paddle.log(-paddle.log(u)); logits = logits + g\n", + " return F.softmax(logits / self.cfg.router_temp, axis=-1)\n", + " def forward(self, x, domain_id=None):\n", + " orig_shape = x.shape\n", + " if len(orig_shape) == 3:\n", + " B, T, D = orig_shape; X = x.reshape([B*T, D])\n", + " else:\n", + " X = x\n", + " N, D = X.shape\n", + " logits = self.router(X); probs = self._router_probs(logits)\n", + " topk_val, topk_idx = paddle.topk(probs, k=self.cfg.top_k, axis=-1)\n", + " all_out = paddle.stack([e(X) for e in self.experts], axis=1) # (N,E,D)\n", + " arangeN = paddle.arange(N, dtype='int64')\n", + " picked_list = []\n", + " for i in range(self.cfg.top_k):\n", + " idx_i = topk_idx[:, i].astype('int64')\n", + " idx_nd = paddle.stack([arangeN, idx_i], axis=1)\n", + " picked_i = paddle.gather_nd(all_out, idx_nd)\n", + " picked_list.append(picked_i)\n", + " picked = paddle.stack(picked_list, axis=1) # (N,k,D)\n", + " w = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9)\n", + " Y = paddle.sum(picked * w.unsqueeze(-1), axis=1)\n", + " Y = self.drop(Y); Y = self.ln(Y + X)\n", + " aux = 0.0\n", + " if self.cfg.balance_loss_w > 0:\n", + " mean_prob = probs.mean(axis=0)\n", + " target = paddle.full_like(mean_prob, 1.0 / self.cfg.n_experts)\n", + " aux = aux + self.cfg.balance_loss_w * F.mse_loss(mean_prob, target)\n", + " if self.cfg.entropy_reg_w != 0.0:\n", + " ent = -paddle.sum(probs * (paddle.log(probs + 1e-9)), axis=1).mean()\n", + " aux = aux + self.cfg.entropy_reg_w * ent\n", + " if (domain_id is not None) and (self.cfg.sup_router_w > 0):\n", + " dom = domain_id.reshape([-1])[:N] % self.cfg.n_experts\n", + " aux = aux + self.cfg.sup_router_w * F.cross_entropy(logits, dom)\n", + " if self.cfg.diversity_w > 0 and self.cfg.n_experts > 1:\n", + " chosen = F.one_hot(topk_idx[:, 0], num_classes=self.cfg.n_experts).astype('float32')\n", + " denom = chosen.sum(axis=0).clip(min=1.0).unsqueeze(-1)\n", + " means = (all_out * chosen.unsqueeze(-1)).sum(axis=0) / denom\n", + " sims = []\n", + " for i in range(self.cfg.n_experts):\n", + " for j in range(i+1, self.cfg.n_experts):\n", + " si = F.normalize(means[i:i+1], axis=-1)\n", + " sj = F.normalize(means[j:j+1], axis=-1)\n", + " sims.append((si*sj).sum())\n", + " if sims:\n", + " aux = aux + self.cfg.diversity_w * paddle.stack(sims).mean()\n", + " if len(orig_shape) == 3:\n", + " Y = Y.reshape([B, T, D])\n", + " return Y, aux\n", + "\n", + "class MoEHead(nn.Layer):\n", + " def __init__(self, d_model=512, cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.moe = MoE(d_model, cfg or MoEConfig())\n", + " def forward(self, tok, domain_id=None):\n", + " y, aux = self.moe(tok.unsqueeze(1), domain_id=domain_id)\n", + " return y.squeeze(1), aux\n", + "\n", + "# ====================== Self-Attention Transformer(可 MoE) ======================\n", + "class TransformerEncoderLayerMoE(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, d_ff=1024, dropout=0.1,\n", + " use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.use_moe = use_moe\n", + " self.self_attn = nn.MultiHeadAttention(embed_dim=d_model, num_heads=nhead, dropout=dropout)\n", + " self.ln1 = nn.LayerNorm(d_model); self.do1 = nn.Dropout(dropout)\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(\n", + " nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff), nn.ReLU(), nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model),\n", + " ); self.do2 = nn.Dropout(dropout)\n", + " def forward(self, x, domain_id=None): # (B,T,D)\n", + " h = self.ln1(x)\n", + " h = paddle.transpose(h, [1,0,2])\n", + " sa = self.self_attn(h, h, h)\n", + " sa = paddle.transpose(sa, [1,0,2])\n", + " x = x + self.do1(sa)\n", + " aux = 0.0\n", + " if self.use_moe:\n", + " x, aux = self.moe(x, domain_id=domain_id)\n", + " else:\n", + " x = x + self.do2(self.ffn(x))\n", + " return x, aux\n", + "\n", + "class TemporalTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, num_layers=2, d_ff=1024, dropout=0.1,\n", + " max_len=4096, use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.pos = SinusoidalPositionalEncoding(d_model, max_len=max_len)\n", + " self.layers = nn.LayerList([\n", + " TransformerEncoderLayerMoE(d_model, nhead, d_ff, dropout, use_moe=use_moe, moe_cfg=moe_cfg)\n", + " for _ in range(num_layers)\n", + " ])\n", + " def forward(self, x, domain_id=None):\n", + " x = self.pos(x); aux_total = 0.0\n", + " for layer in self.layers:\n", + " x, aux = layer(x, domain_id=domain_id); aux_total += aux\n", + " return x, aux_total\n", + "\n", + "# ====================== AFNO(1D) + MoE FFN ======================\n", + "class AFNO1DLayer(nn.Layer):\n", + " \"\"\"\n", + " 自适应傅里叶算子(时间 1D 版):\n", + " - 对 (B,T,D) 沿 T 做 rFFT → (B,D,F)\n", + " - 仅保留前 K=modes 个频率,对每个频率在“通道组内”做两层复线性(W1,W2)+ GELU + Softshrink\n", + " - 把频谱其余部分置零 → irFFT → 残差 + Dropout + (可选 LN)\n", + " \"\"\"\n", + " def __init__(self, d_model: int, modes: int = 32, num_blocks: int = 8,\n", + " shrink: float = 0.01, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % num_blocks == 0, \"d_model must be divisible by num_blocks\"\n", + " self.d_model = d_model\n", + " self.modes = modes\n", + " self.num_blocks = num_blocks\n", + " self.block = d_model // num_blocks\n", + " self.shrink = shrink\n", + " # 复权重拆成实/虚:形状 (G, Cb, Cb)\n", + " scale = 1.0 / math.sqrt(self.block)\n", + " def param():\n", + " return nn.initializer.Uniform(-scale, scale)\n", + " self.w1r = self.create_parameter([num_blocks, self.block, self.block], default_initializer=param())\n", + " self.w1i = self.create_parameter([num_blocks, self.block, self.block], default_initializer=param())\n", + " self.w2r = self.create_parameter([num_blocks, self.block, self.block], default_initializer=param())\n", + " self.w2i = self.create_parameter([num_blocks, self.block, self.block], default_initializer=param())\n", + " self.ln = nn.LayerNorm(d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + "\n", + " def _complex_linear(self, xr, xi, Wr, Wi):\n", + " # xr, xi: (B, G, K, Cb); Wr/Wi: (G, Cb, Cb)\n", + " # (a+ib)*(Wr+iWi) = (a@Wr - b@Wi) + i(a@Wi + b@Wr)\n", + " out_r = paddle.matmul(xr, Wr) - paddle.matmul(xi, Wi)\n", + " out_i = paddle.matmul(xr, Wi) + paddle.matmul(xi, Wr)\n", + " return out_r, out_i\n", + "\n", + " def forward(self, x): # x: (B,T,D)\n", + " B, T, D = x.shape\n", + " Kmax = T // 2 + 1\n", + " K = min(self.modes, Kmax)\n", + "\n", + " h = self.ln(x) # PreNorm\n", + " h_td = paddle.transpose(h, [0, 2, 1]) # (B,D,T)\n", + " h_ft = paddle.fft.rfft(h_td) # (B,D,F) complex64\n", + "\n", + " # reshape 通道为 G 组: (B,G,Cb,F)\n", + " h_ft = h_ft.reshape([B, self.num_blocks, self.block, Kmax])\n", + " # 仅前 K 频率: (B,G,Cb,K) → 交换到 (B,G,K,Cb) 方便 matmul\n", + " xk = h_ft[:, :, :, :K].transpose([0,1,3,2])\n", + " xr, xi = paddle.real(xk), paddle.imag(xk) # (B,G,K,Cb)\n", + "\n", + " # 组内两层复线性 + GELU + Softshrink\n", + " yr, yi = self._complex_linear(xr, xi, self.w1r, self.w1i)\n", + " yr = F.gelu(yr); yi = F.gelu(yi)\n", + " # Softshrink(稀疏化)\n", + " # yr = F.softshrink(yr, lambd=self.shrink); yi = F.softshrink(yi, lambd=self.shrink)\n", + " yr = F.softshrink(yr, threshold=self.shrink)\n", + " yi = F.softshrink(yi, threshold=self.shrink)\n", + " yr, yi = self._complex_linear(yr, yi, self.w2r, self.w2i) # (B,G,K,Cb)\n", + "\n", + "\n", + "\n", + "\n", + " # 放回谱: (B,G,K,Cb) → (B,G,Cb,K) → (B,D,K)\n", + " yk = paddle.complex(yr, yi).transpose([0,1,3,2]).reshape([B, D, K])\n", + " out_ft = paddle.zeros([B, D, Kmax], dtype='complex64')\n", + " out_ft[:, :, :K] = yk\n", + "\n", + " # 反变换 & 残差\n", + " out_td = paddle.fft.irfft(out_ft, n=T) # (B,D,T)\n", + " out = paddle.transpose(out_td, [0, 2, 1]) # (B,T,D)\n", + " out = self.drop(out)\n", + " return x + out\n", + "\n", + "class AFNOTransformerFlexible(nn.Layer):\n", + " \"\"\"\n", + " 堆叠若干 AFNO1DLayer;随后接 MoE FFN(与 Self-Attn 分支同构)\n", + " \"\"\"\n", + " def __init__(self, d_model=512, num_layers=2, modes=32, dropout=0.1,\n", + " d_ff=1024, use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.layers = nn.LayerList([AFNO1DLayer(d_model, modes=modes, num_blocks=8, shrink=0.01, dropout=dropout)\n", + " for _ in range(num_layers)])\n", + " self.use_moe = use_moe\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(\n", + " nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff), nn.ReLU(), nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model),\n", + " )\n", + " self.do = nn.Dropout(dropout)\n", + "\n", + " def forward(self, x, domain_id=None): # (B,T,D)\n", + " for layer in self.layers:\n", + " x = layer(x)\n", + " aux = 0.0\n", + " if self.use_moe:\n", + " x, aux = self.moe(x, domain_id=domain_id)\n", + " else:\n", + " x = x + self.do(self.ffn(x))\n", + " return x, aux\n", + "\n", + "# ====================== Cross-Attention 融合 ======================\n", + "class MultiHeadCrossAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_head = d_model // nhead; self.nhead = nhead\n", + " self.Wq = nn.Linear(d_model, d_model); self.Wk = nn.Linear(d_model, d_model); self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model); self.drop = nn.Dropout(dropout); self.ln = nn.LayerNorm(d_model)\n", + " def forward(self, q, kv):\n", + " B, Nq, D = q.shape\n", + " def split(t): return t.reshape([B, -1, self.nhead, self.d_head]).transpose([0,2,1,3])\n", + " qh = split(self.Wq(q)); kh = split(self.Wk(kv)); vh = split(self.Wv(kv))\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head)\n", + " attn = F.softmax(scores, axis=-1)\n", + " ctx = paddle.matmul(attn, vh).transpose([0,2,1,3]).reshape([B, Nq, D])\n", + " out = self.drop(self.proj(ctx))\n", + " return self.ln(out + q)\n", + "\n", + "class BiModalCrossFusion(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, dropout=0.1, fuse_hidden=512):\n", + " super().__init__()\n", + " self.ca_v_from_t = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.ca_t_from_v = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.fuse = nn.Sequential(nn.Linear(2*d_model, fuse_hidden), nn.ReLU(), nn.Dropout(dropout))\n", + " self.out_dim = fuse_hidden\n", + " def forward(self, video_seq, tabm_tok):\n", + " v_tok = video_seq.mean(axis=1, keepdim=True)\n", + " t_tok = tabm_tok.unsqueeze(1)\n", + " v_upd = self.ca_v_from_t(v_tok, t_tok)\n", + " t_upd = self.ca_t_from_v(t_tok, video_seq)\n", + " fused = paddle.concat([v_upd, t_upd], axis=-1).squeeze(1)\n", + " return self.fuse(fused)\n", + "\n", + "# ====================== 总模型:Self-Attn + AFNO 并行 ======================\n", + "class TwoModalMultiLabelModel(nn.Layer):\n", + " def __init__(self,\n", + " # 视频模态\n", + " vid_channels=20, vid_h=20, vid_w=20, vid_frames=365, depth_n=24,\n", + " # 结构化模态\n", + " vec_dim=424,\n", + " # 维度与结构\n", + " d_model=512, nhead=4, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1, num_labels=4,\n", + " # MoE 开关\n", + " moe_temporal_attn: bool = True,\n", + " moe_temporal_afno: bool = True,\n", + " moe_fused: bool = False,\n", + " moe_tabm: bool = False,\n", + " # AFNO 频率数\n", + " afno_modes: int = 32,\n", + " # MoE 超参\n", + " moe_cfg_temporal_attn: MoEConfig = None,\n", + " moe_cfg_temporal_afno: MoEConfig = None,\n", + " moe_cfg_fused: MoEConfig = None,\n", + " moe_cfg_tabm: MoEConfig = None):\n", + " super().__init__()\n", + " # 逐帧 3D ResNet18\n", + " self.vol_encoder = Volume3DEncoder(in_channels=vid_channels, dropout=dropout)\n", + " # Self-Attention Transformer\n", + " self.trans_attn = TemporalTransformerFlexible(\n", + " d_model=d_model, nhead=nhead, num_layers=n_trans_layers, d_ff=trans_ff, dropout=dropout,\n", + " max_len=vid_frames, use_moe=moe_temporal_attn,\n", + " moe_cfg=moe_cfg_temporal_attn or MoEConfig(\n", + " n_experts=8, top_k=1, d_ff=max(2048, trans_ff), router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " )\n", + " )\n", + " # AFNO Transformer(1D)\n", + " self.trans_afno = AFNOTransformerFlexible(\n", + " d_model=d_model, num_layers=n_trans_layers, modes=afno_modes, dropout=dropout,\n", + " d_ff=trans_ff, use_moe=moe_temporal_afno,\n", + " moe_cfg=moe_cfg_temporal_afno or MoEConfig(\n", + " n_experts=8, top_k=1, d_ff=max(2048, trans_ff), router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " )\n", + " )\n", + " # 两路拼接后投回 d_model\n", + " self.video_merge = nn.Linear(2*d_model, d_model)\n", + "\n", + " # TabM\n", + " self.tabm = TabMFeatureExtractor(vec_dim, d_hidden=tabm_hidden, dropout=dropout)\n", + " self.tabm_proj = nn.Linear(tabm_hidden, d_model)\n", + " self.moe_tabm = moe_tabm\n", + " if moe_tabm:\n", + " self.tabm_moe = MoEHead(d_model=d_model, cfg=moe_cfg_tabm or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 融合\n", + " self.fusion = BiModalCrossFusion(d_model=d_model, nhead=nhead, dropout=dropout, fuse_hidden=d_model)\n", + " self.moe_fused = moe_fused\n", + " if moe_fused:\n", + " self.fused_moe = MoEHead(d_model=d_model, cfg=moe_cfg_fused or MoEConfig(\n", + " n_experts=6, top_k=1, d_ff=1024, router_temp=0.5,\n", + " balance_loss_w=0.005, entropy_reg_w=-0.005, diversity_w=1e-3\n", + " ))\n", + "\n", + " # 分类头\n", + " self.head = nn.Linear(self.fusion.out_dim, num_labels)\n", + "\n", + " self.vid_frames = vid_frames; self.depth_n = depth_n\n", + "\n", + " # 导出融合前 512 表示(用于检索库)\n", + " def encode(self, x_video, x_vec, domain_id=None):\n", + " \"\"\"\n", + " x_video: (B,T,C,H,W,N) —— N 为体深度(24)\n", + " \"\"\"\n", + " B, T, C, H, W, N = x_video.shape\n", + " assert N == self.depth_n, f\"N mismatch: {N} vs {self.depth_n}\"\n", + " xvt = x_video.transpose([0,1,2,5,3,4]).reshape([B*T, C, N, H, W])\n", + " f_frame = self.vol_encoder(xvt) # (B*T,512)\n", + " seq = f_frame.reshape([B, T, -1]) # (B,T,512)\n", + "\n", + " z_attn, _ = self.trans_attn(seq, domain_id=domain_id) # (B,T,512)\n", + " z_afno, _ = self.trans_afno(seq, domain_id=domain_id) # (B,T,512)\n", + " z_vid = self.video_merge(paddle.concat([z_attn, z_afno], axis=-1)) # (B,T,512)\n", + "\n", + " z_tabm = self.tabm(x_vec); z_tabm = self.tabm_proj(z_tabm) # (B,512)\n", + " if self.moe_tabm:\n", + " z_tabm, _ = self.tabm_moe(z_tabm, domain_id=domain_id)\n", + "\n", + " fused = self.fusion(z_vid, z_tabm) # (B,512)\n", + " if self.moe_fused:\n", + " fused, _ = self.fused_moe(fused, domain_id=domain_id)\n", + " return fused\n", + "\n", + " def forward(self, x_video, x_vec, domain_id=None):\n", + " fused = self.encode(x_video, x_vec, domain_id=domain_id)\n", + " logits = self.head(fused) # (B,4)\n", + " return logits, paddle.to_tensor(0.0, dtype='float32')\n", + "\n", + "# ====================== 简洁指标(可替换为你之前的“全量指标”版本) ======================\n", + "def f1_per_class(y_true: np.ndarray, y_pred: np.ndarray, eps: float = 1e-9) -> Tuple[np.ndarray, float, float]:\n", + " N, C = y_true.shape\n", + " f1_c = np.zeros(C, dtype=np.float32)\n", + " for c in range(C):\n", + " yt, yp = y_true[:, c], y_pred[:, c]\n", + " tp = np.sum((yt == 1) & (yp == 1)); fp = np.sum((yt == 0) & (yp == 1)); fn = np.sum((yt == 1) & (yp == 0))\n", + " prec = tp / (tp + fp + eps); rec = tp / (tp + fn + eps)\n", + " f1_c[c] = 2 * prec * rec / (prec + rec + eps)\n", + " macro_f1 = float(np.mean(f1_c))\n", + " tp = np.sum((y_true == 1) & (y_pred == 1)); fp = np.sum((y_true == 0) & (y_pred == 1)); fn = np.sum((y_true == 1) & (y_pred == 0))\n", + " prec = tp / (tp + fp + 1e-9); rec = tp / (tp + fn + 1e-9); micro_f1 = 2 * prec * rec / (prec + rec + 1e-9)\n", + " return f1_c, macro_f1, float(micro_f1)\n", + "\n", + "def average_precision_micro(y_true: np.ndarray, y_prob: np.ndarray, num_thresholds: int = 101) -> float:\n", + " thresholds = np.linspace(0.0, 1.0, num_thresholds)\n", + " precision, recall = [], []\n", + " yt = y_true.reshape(-1); ps = y_prob.reshape(-1)\n", + " for t in thresholds:\n", + " yp = (ps >= t).astype(np.float32)\n", + " tp = np.sum((yt == 1) & (yp == 1)); fp = np.sum((yt == 0) & (yp == 1)); fn = np.sum((yt == 1) & (yp == 0))\n", + " p = tp / (tp + fp + 1e-9); r = tp / (tp + fn + 1e-9)\n", + " precision.append(p); recall.append(r)\n", + " order = np.argsort(recall)\n", + " return float(np.trapz(np.array(precision)[order], np.array(recall)[order]))\n", + "\n", + "@paddle.no_grad()\n", + "def evaluate(model, loader, threshold: float = 0.5, retriever=None):\n", + " model.eval()\n", + " ys, ps, total_loss, total_batches = [], [], 0.0, 0\n", + " for x_vid, x_vec, y in loader:\n", + " logits, _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " prob = F.sigmoid(logits)\n", + " if retriever is not None:\n", + " feat = model.encode(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " prob = retriever.query_and_fuse(prob, feat)\n", + " loss = F.binary_cross_entropy(prob, y.astype('float32'))\n", + " ys.append(y.numpy()); ps.append(prob.numpy())\n", + " total_loss += float(loss); total_batches += 1\n", + " y_true = np.concatenate(ys, 0); y_prob = np.concatenate(ps, 0)\n", + " y_pred = (y_prob >= threshold).astype(np.float32)\n", + " per_f1, macro_f1, micro_f1 = f1_per_class(y_true, y_pred)\n", + " ap_micro = average_precision_micro(y_true, y_prob)\n", + " return {\"loss\": total_loss/max(1,total_batches), \"macro_f1\": macro_f1, \"micro_f1\": micro_f1,\n", + " \"per_class_f1\": per_f1.tolist(), \"micro_AP\": ap_micro}\n", + "\n", + "# ====================== 检索增强(cos / l2;k 邻居软加权;概率融合) ======================\n", + "class Retriever:\n", + " def __init__(self, sim_metric: str = 'cos', k: int = 8, alpha: float = 0.3, tau: float = 0.5):\n", + " assert sim_metric in ['cos', 'l2']\n", + " self.sim_metric = sim_metric; self.k = k; self.alpha = alpha; self.tau = tau\n", + " self.keys = None; self.labels = None\n", + " @paddle.no_grad()\n", + " def build(self, model: nn.Layer, loader: DataLoader):\n", + " model.eval()\n", + " feats, labs = [], []\n", + " for x_vid, x_vec, y in loader:\n", + " f = model.encode(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " feats.append(f.numpy()); labs.append(y.numpy())\n", + " self.keys = paddle.to_tensor(np.concatenate(feats, 0)).astype('float32')\n", + " self.labels = paddle.to_tensor(np.concatenate(labs, 0)).astype('float32')\n", + " self.keys_norm = F.normalize(self.keys, axis=-1)\n", + " @paddle.no_grad()\n", + " def query_and_fuse(self, model_probs: paddle.Tensor, test_feat: paddle.Tensor) -> paddle.Tensor:\n", + " B, D = test_feat.shape\n", + " if self.sim_metric == 'cos':\n", + " q = F.normalize(test_feat, axis=-1)\n", + " sim = paddle.matmul(q, self.keys_norm, transpose_y=True)\n", + " w = F.softmax(sim / self.tau, axis=-1)\n", + " else:\n", + " q2 = paddle.sum(test_feat * test_feat, axis=-1, keepdim=True)\n", + " k2 = paddle.sum(self.keys * self.keys, axis=-1, keepdim=True).transpose([1,0])\n", + " dot = paddle.matmul(test_feat, self.keys, transpose_y=True)\n", + " dist2 = q2 + k2 - 2.0 * dot\n", + " w = F.softmax(-dist2 / self.tau, axis=-1)\n", + " topk_val, topk_idx = paddle.topk(w, k=min(self.k, w.shape[1]), axis=-1)\n", + " picked_labels = paddle.gather(self.labels, topk_idx.reshape([-1]), axis=0)\n", + " C = self.labels.shape[1]\n", + " picked_labels = picked_labels.reshape([B, -1, C])\n", + " w_norm = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9)\n", + " p_knn = paddle.sum(picked_labels * w_norm.unsqueeze(-1), axis=1)\n", + " p_final = (1.0 - self.alpha) * model_probs + self.alpha * p_knn\n", + " return p_final.clip(1e-6, 1-1e-6)\n", + "\n", + "# ====================== ToyDataset(T=365, N=24) ======================\n", + "class ToyTwoModalDataset(Dataset):\n", + " def __init__(self, n: int, seed: int = 0, T: int = 365, C: int = 20, H: int = 20, W: int = 20, N: int = 24):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.n = n; self.T=T; self.C=C; self.H=H; self.W=W; self.N=N\n", + " self.video = rng.normal(size=(n, T, C, H, W, N)).astype('float32')\n", + " self.vec = rng.normal(size=(n, 424)).astype('float32')\n", + " vid_hwn = self.video.mean(axis=(3,4,5)) # (n,T,C)\n", + " vid_avg = vid_hwn.mean(axis=1) # (n,C)\n", + " Wv = rng.normal(size=(C,4)); Wt = rng.normal(size=(424,4))\n", + " logits = vid_avg @ Wv + self.vec @ Wt + rng.normal(scale=0.5, size=(n,4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.y = (probs > 0.5).astype('float32')\n", + " def __getitem__(self, idx: int):\n", + " return self.video[idx], self.vec[idx], self.y[idx]\n", + " def __len__(self): return self.n\n", + "\n", + "# ====================== 训练入口 ======================\n", + "if __name__ == \"__main__\":\n", + " paddle.seed(2025)\n", + " # 数据\n", + " T, C, H, W, N = 365, 20, 20, 20, 24\n", + " train_ds = ToyTwoModalDataset(n=32, seed=42, T=T, C=C, H=H, W=W, N=N)\n", + " val_ds = ToyTwoModalDataset(n=16, seed=233, T=T, C=C, H=H, W=W, N=N)\n", + " def collate_fn(batch):\n", + " vids, vecs, ys = zip(*batch)\n", + " return (paddle.to_tensor(np.stack(vids, 0)),\n", + " paddle.to_tensor(np.stack(vecs, 0)),\n", + " paddle.to_tensor(np.stack(ys, 0)))\n", + " train_loader = DataLoader(train_ds, batch_size=1, shuffle=True, drop_last=False, collate_fn=collate_fn)\n", + " val_loader = DataLoader(val_ds, batch_size=1, shuffle=False, drop_last=False, collate_fn=collate_fn)\n", + "\n", + " # 类别不平衡权重(可选)\n", + " y_train = np.stack([y for _, _, y in train_ds], 0)\n", + " pos_ratio = np.clip(y_train.mean(axis=0), 1e-3, 1-1e-3)\n", + " pos_weight = paddle.to_tensor(((1-pos_ratio)/pos_ratio).astype('float32'))\n", + "\n", + " # 模型:Self-Attn + AFNO 两路,并行 + MoE FFN\n", + " model = TwoModalMultiLabelModel(\n", + " vid_channels=C, vid_h=H, vid_w=W, vid_frames=T, depth_n=N,\n", + " vec_dim=424,\n", + " d_model=512, nhead=4, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1, num_labels=4,\n", + " moe_temporal_attn=True, moe_temporal_afno=True,\n", + " moe_fused=False, moe_tabm=False,\n", + " afno_modes=32\n", + " )\n", + " optimizer = paddle.optimizer.Adam(learning_rate=3e-4, parameters=model.parameters())\n", + "\n", + " # 训练(演示用:小 epoch)\n", + " best_macro_f1, best = -1.0, None\n", + " for ep in range(1, 2+1):\n", + " model.train(); total_loss, total_batches = 0.0, 0\n", + " for x_vid, x_vec, y in train_loader:\n", + " logits, _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " cls = F.binary_cross_entropy_with_logits(logits, y.astype('float32'), pos_weight=pos_weight)\n", + " cls.backward()\n", + " optimizer.step(); optimizer.clear_grad()\n", + " total_loss += float(cls); total_batches += 1\n", + " val_metrics = evaluate(model, val_loader, threshold=0.5, retriever=None)\n", + " print(f\"[Epoch {ep:02d}] train_loss={total_loss/max(1,total_batches):.4f} | \"\n", + " f\"val_loss={val_metrics['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics['micro_AP']:.4f}\")\n", + " if val_metrics[\"macro_f1\"] > best_macro_f1:\n", + " best_macro_f1 = val_metrics[\"macro_f1\"]\n", + " best = {k: v.clone() for k, v in model.state_dict().items()}\n", + " if best is not None:\n", + " model.set_state_dict(best); print(f\"Loaded best state with macro_f1={best_macro_f1:.4f}\")\n", + "\n", + " # 检索库 + 检索增强评估\n", + " retr = Retriever(sim_metric='cos', k=8, alpha=0.3, tau=0.5)\n", + " retr.build(model, DataLoader(train_ds, batch_size=1, shuffle=False, collate_fn=collate_fn))\n", + " val_metrics_knn = evaluate(model, val_loader, threshold=0.5, retriever=retr)\n", + " print(f\"[RkNN] val_loss={val_metrics_knn['loss']:.4f} | \"\n", + " f\"macro_f1={val_metrics_knn['macro_f1']:.4f} | \"\n", + " f\"micro_f1={val_metrics_knn['micro_f1']:.4f} | \"\n", + " f\"per_class_f1={val_metrics_knn['per_class_f1']} | \"\n", + " f\"micro_AP={val_metrics_knn['micro_AP']:.4f}\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KzXknA11mNYw", + "outputId": "c2b50e9d-b2c8-473e-8b76-711b5eb0b8f8" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/paddle/nn/layer/norm.py:818: UserWarning: When training, we now always track global mean and variance.\n", + " warnings.warn(\n", + "/tmp/ipython-input-1998060628.py:505: DeprecationWarning: `trapz` is deprecated. Use `trapezoid` instead, or one of the numerical integration functions in `scipy.integrate`.\n", + " return float(np.trapz(np.array(precision)[order], np.array(recall)[order]))\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[Epoch 01] train_loss=1.1379 | val_loss=0.7339 | macro_f1=0.3188 | micro_f1=0.5085 | per_class_f1=[0.0, 0.0, 0.6086956262588501, 0.6666666865348816] | micro_AP=0.4581\n", + "[Epoch 02] train_loss=0.9088 | val_loss=0.7662 | macro_f1=0.1667 | micro_f1=0.3721 | per_class_f1=[0.0, 0.0, 0.0, 0.6666666865348816] | micro_AP=0.4726\n", + "Loaded best state with macro_f1=0.3188\n", + "[RkNN] val_loss=0.7116 | macro_f1=0.2838 | micro_f1=0.4444 | per_class_f1=[0.0, 0.0, 0.6086956262588501, 0.5263158082962036] | micro_AP=0.4903\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# 模型解释可视化" + ], + "metadata": { + "id": "-TWdjdTh4YkL" + } + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math, os\n", + "from typing import Optional, Tuple, List\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# ============ 基本设置 ============ # 如需 CPU 改为 'cpu'\n", + "os.makedirs(\"viz_out\", exist_ok=True)\n", + "\n", + "# ============ 工具:正弦位置编码 ============\n", + "class SinusoidalPositionalEncoding(nn.Layer):\n", + " def __init__(self, d_model: int, max_len: int = 4096):\n", + " super().__init__()\n", + " pe = np.zeros((max_len, d_model), dtype=\"float32\")\n", + " position = np.arange(0, max_len, dtype=\"float32\")[:, None]\n", + " div_term = np.exp(np.arange(0, d_model, 2, dtype=\"float32\") * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = np.sin(position * div_term)\n", + " pe[:, 1::2] = np.cos(position * div_term)\n", + " self.register_buffer(\"pe\", paddle.to_tensor(pe), persistable=False)\n", + " def forward(self, x): # (B,T,D)\n", + " T = x.shape[1]\n", + " return x + self.pe[:T, :]\n", + "\n", + "# ============ TabM(占位,可替换为你的实现) ============\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " def __init__(self, num_features: int, d_hidden: int = 512, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(num_features, d_hidden), nn.ReLU(), nn.Dropout(dropout),\n", + " nn.Linear(d_hidden, d_hidden), nn.ReLU(),\n", + " )\n", + " self.d_hidden = d_hidden\n", + " def forward(self, x_num: paddle.Tensor):\n", + " return self.net(x_num)\n", + "\n", + "# ============ 3D ResNet18 ============\n", + "class BasicBlock3D(nn.Layer):\n", + " expansion = 1\n", + " def __init__(self, in_planes, planes, stride=(1,1,1), downsample=None):\n", + " super().__init__()\n", + " self.conv1 = nn.Conv3D(in_planes, planes, 3, stride=stride, padding=1, bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(planes)\n", + " self.relu = nn.ReLU()\n", + " self.conv2 = nn.Conv3D(planes, planes, 3, stride=1, padding=1, bias_attr=False)\n", + " self.bn2 = nn.BatchNorm3D(planes)\n", + " self.downsample = downsample\n", + " def forward(self, x):\n", + " identity = x\n", + " out = self.relu(self.bn1(self.conv1(x)))\n", + " out = self.bn2(self.conv2(out))\n", + " if self.downsample is not None:\n", + " identity = self.downsample(x)\n", + " out = self.relu(out + identity)\n", + " return out\n", + "\n", + "class ResNet3D(nn.Layer):\n", + " def __init__(self, block, layers, in_channels=20, base_width=64):\n", + " super().__init__()\n", + " self.in_planes = base_width\n", + " self.conv1 = nn.Conv3D(in_channels, self.in_planes, kernel_size=(3,7,7),\n", + " stride=(1,2,2), padding=(1,3,3), bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(self.in_planes)\n", + " self.relu = nn.ReLU()\n", + " self.maxpool = nn.MaxPool3D(kernel_size=(1,3,3), stride=(1,2,2), padding=(0,1,1))\n", + " self.layer1 = self._make_layer(block, base_width, layers[0], stride=(1,1,1))\n", + " self.layer2 = self._make_layer(block, base_width*2, layers[1], stride=(2,2,2))\n", + " self.layer3 = self._make_layer(block, base_width*4, layers[2], stride=(2,2,2))\n", + " self.layer4 = self._make_layer(block, base_width*8, layers[3], stride=(2,2,2))\n", + " self.out_dim = base_width*8 # 512\n", + " self.pool = nn.AdaptiveAvgPool3D(output_size=1)\n", + " def _make_layer(self, block, planes, blocks, stride=(1,1,1)):\n", + " downsample = None\n", + " if stride != (1,1,1) or self.in_planes != planes * block.expansion:\n", + " downsample = nn.Sequential(\n", + " nn.Conv3D(self.in_planes, planes * block.expansion, 1, stride=stride, bias_attr=False),\n", + " nn.BatchNorm3D(planes * block.expansion),\n", + " )\n", + " layers = [block(self.in_planes, planes, stride=stride, downsample=downsample)]\n", + " self.in_planes = planes * block.expansion\n", + " for _ in range(1, blocks):\n", + " layers.append(block(self.in_planes, planes))\n", + " return nn.Sequential(*layers)\n", + " def forward(self, x): # (B, C, D, H, W)\n", + " x = self.relu(self.bn1(self.conv1(x)))\n", + " x = self.maxpool(x)\n", + " x = self.layer1(x); x = self.layer2(x); x = self.layer3(x); x = self.layer4(x)\n", + " x = self.pool(x) # (B, 512, 1,1,1)\n", + " x = paddle.flatten(x, 1) # (B, 512)\n", + " return x\n", + "\n", + "class Volume3DEncoder(nn.Layer):\n", + " \"\"\"\n", + " 带安全 hook(仅在可求梯度时注册 backward hook),支持 3D Grad-CAM\n", + " \"\"\"\n", + " def __init__(self, in_channels: int = 20, base: int = 64, dropout: float = 0.0):\n", + " super().__init__()\n", + " self.backbone = ResNet3D(BasicBlock3D, [2,2,2,2], in_channels=in_channels, base_width=base)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.out_dim = self.backbone.out_dim # 512\n", + " self._feat = None\n", + " self._grad = None\n", + " def _save_feat_grad(layer, inp, out):\n", + " self._feat = out # (B, 512, D',H',W')\n", + " if getattr(out, \"stop_gradient\", False):\n", + " return\n", + " def _save_grad(grad):\n", + " self._grad = grad\n", + " out.register_hook(_save_grad)\n", + " self.backbone.layer4.register_forward_post_hook(_save_feat_grad)\n", + " def forward(self, x): # (B, C, D, H, W)\n", + " x = self.backbone(x)\n", + " x = self.drop(x)\n", + " return x\n", + "\n", + "# ============ MoE ============\n", + "class ExpertFFN(nn.Layer):\n", + " def __init__(self, d_model, d_ff, dropout=0.1):\n", + " super().__init__()\n", + " self.fc1 = nn.Linear(d_model, d_ff)\n", + " self.fc2 = nn.Linear(d_ff, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " def forward(self, x):\n", + " return self.fc2(self.drop(F.relu(self.fc1(x))))\n", + "\n", + "class MoEConfig:\n", + " def __init__(self, n_experts=8, top_k=1, d_ff=2048, dropout=0.1,\n", + " router_temp=0.5, use_gumbel=False):\n", + " self.n_experts=n_experts; self.top_k=top_k; self.d_ff=d_ff; self.dropout=dropout\n", + " self.router_temp=router_temp; self.use_gumbel=use_gumbel\n", + "\n", + "class MoE(nn.Layer):\n", + " \"\"\"缓存最近一次路由概率/索引,便于可解释与聚类\"\"\"\n", + " def __init__(self, d_model: int, cfg: MoEConfig):\n", + " super().__init__()\n", + " self.cfg = cfg\n", + " self.router = nn.Linear(d_model, cfg.n_experts)\n", + " self.experts = nn.LayerList([ExpertFFN(d_model, cfg.d_ff, cfg.dropout) for _ in range(cfg.n_experts)])\n", + " self.ln = nn.LayerNorm(d_model); self.drop = nn.Dropout(cfg.dropout)\n", + " self.last_router_probs = None\n", + " self.last_topk_idx = None\n", + " def _router_probs(self, logits):\n", + " if self.cfg.use_gumbel and self.training:\n", + " u = paddle.uniform(logits.shape, min=1e-6, max=1-1e-6, dtype=logits.dtype)\n", + " g = -paddle.log(-paddle.log(u)); logits = logits + g\n", + " return F.softmax(logits / self.cfg.router_temp, axis=-1)\n", + " def forward(self, x):\n", + " orig_shape = x.shape\n", + " if len(orig_shape) == 3: B,T,D = orig_shape; X = x.reshape([B*T, D])\n", + " else: X = x\n", + " N,D = X.shape\n", + " logits = self.router(X); probs = self._router_probs(logits)\n", + " topk_val, topk_idx = paddle.topk(probs, k=self.cfg.top_k, axis=-1)\n", + " all_out = paddle.stack([e(X) for e in self.experts], axis=1) # (N,E,D)\n", + " arangeN = paddle.arange(N, dtype='int64')\n", + " picked_list=[]\n", + " for i in range(self.cfg.top_k):\n", + " idx_i = topk_idx[:, i].astype('int64')\n", + " idx_nd = paddle.stack([arangeN, idx_i], axis=1)\n", + " picked_i = paddle.gather_nd(all_out, idx_nd)\n", + " picked_list.append(picked_i)\n", + " picked = paddle.stack(picked_list, axis=1) # (N,k,D)\n", + " w = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9)\n", + " Y = paddle.sum(picked * w.unsqueeze(-1), axis=1) # (N,D)\n", + " Y = self.drop(Y); Y = self.ln(Y + X)\n", + " self.last_router_probs = probs.detach()\n", + " self.last_topk_idx = topk_idx.detach()\n", + " if len(orig_shape)==3: Y = Y.reshape([B,T,D])\n", + " return Y\n", + "\n", + "class MoEHead(nn.Layer):\n", + " def __init__(self, d_model=512, cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.moe = MoE(d_model, cfg or MoEConfig())\n", + " self.last_router_probs = None\n", + " self.last_topk_idx = None\n", + " def forward(self, tok):\n", + " y = self.moe(tok.unsqueeze(1)).squeeze(1)\n", + " self.last_router_probs = self.moe.last_router_probs\n", + " self.last_topk_idx = self.moe.last_topk_idx\n", + " return y\n", + "\n", + "# ============ 自实现版 Multi-Head Self-Attention(记录注意力) ============\n", + "class MultiHeadSelfAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_model = d_model\n", + " self.nhead = nhead\n", + " self.d_head = d_model // nhead\n", + " self.Wq = nn.Linear(d_model, d_model)\n", + " self.Wk = nn.Linear(d_model, d_model)\n", + " self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.last_attn = None # (B,H,T,T)\n", + "\n", + " def forward(self, x): # x: (B,T,D)\n", + " B,T,D = x.shape\n", + " q = self.Wq(x); k = self.Wk(x); v = self.Wv(x)\n", + " def split(t): return t.reshape([B, T, self.nhead, self.d_head]).transpose([0,2,1,3]) # (B,H,T,dh)\n", + " qh, kh, vh = split(q), split(k), split(v)\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head) # (B,H,T,T)\n", + " attn = F.softmax(scores, axis=-1)\n", + " self.last_attn = attn.detach()\n", + " ctx = paddle.matmul(attn, vh) # (B,H,T,dh)\n", + " ctx = ctx.transpose([0,2,1,3]).reshape([B, T, D]) # (B,T,D)\n", + " out = self.drop(self.proj(ctx))\n", + " return out # 残差与LN在外面做\n", + "\n", + "# ============ Self-Attention Transformer(用自实现 MHA) ============\n", + "class TransformerEncoderLayerMoE(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, d_ff=1024, dropout=0.1,\n", + " use_moe: bool = True, moe_cfg: MoEConfig = None, capture_attn: bool = True):\n", + " super().__init__()\n", + " self.use_moe = use_moe; self.capture_attn = capture_attn\n", + " self.self_attn = MultiHeadSelfAttention(d_model, nhead, dropout)\n", + " self.ln1 = nn.LayerNorm(d_model); self.do1 = nn.Dropout(dropout)\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff), nn.ReLU(), nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model))\n", + " self.do2 = nn.Dropout(dropout)\n", + " self.last_attn = None # (B,H,T,T)\n", + " def forward(self, x): # (B,T,D)\n", + " h = self.ln1(x)\n", + " out = self.self_attn(h) # (B,T,D)\n", + " if self.capture_attn:\n", + " self.last_attn = self.self_attn.last_attn # (B,H,T,T)\n", + " x = x + self.do1(out)\n", + " if self.use_moe:\n", + " x = self.moe(x)\n", + " else:\n", + " x = x + self.do2(self.ffn(x))\n", + " return x\n", + "\n", + "class TemporalTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=4, num_layers=2, d_ff=1024, dropout=0.1,\n", + " max_len=4096, use_moe: bool = True, moe_cfg: MoEConfig = None, capture_attn=True):\n", + " super().__init__()\n", + " self.pos = SinusoidalPositionalEncoding(d_model, max_len=max_len)\n", + " self.layers = nn.LayerList([\n", + " TransformerEncoderLayerMoE(d_model, nhead, d_ff, dropout,\n", + " use_moe=use_moe, moe_cfg=moe_cfg, capture_attn=capture_attn)\n", + " for _ in range(num_layers)\n", + " ])\n", + " self.last_attn_all_layers: List[paddle.Tensor] = []\n", + " def forward(self, x):\n", + " x = self.pos(x)\n", + " self.last_attn_all_layers = []\n", + " for layer in self.layers:\n", + " x = layer(x)\n", + " if layer.last_attn is not None:\n", + " self.last_attn_all_layers.append(layer.last_attn) # (B,H,T,T)\n", + " return x\n", + "\n", + "# ============ AFNO(1D) + MoE FFN ============\n", + "class AFNO1DLayer(nn.Layer):\n", + " def __init__(self, d_model: int, modes: int = 32, num_blocks: int = 8, shrink: float = 0.01, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % num_blocks == 0\n", + " self.d_model=d_model; self.modes=modes; self.num_blocks=num_blocks; self.block=d_model//num_blocks\n", + " scale=1.0/math.sqrt(self.block); init = nn.initializer.Uniform(-scale, scale)\n", + " self.w1r = self.create_parameter([num_blocks, self.block, self.block], default_initializer=init)\n", + " self.w1i = self.create_parameter([num_blocks, self.block, self.block], default_initializer=init)\n", + " self.w2r = self.create_parameter([num_blocks, self.block, self.block], default_initializer=init)\n", + " self.w2i = self.create_parameter([num_blocks, self.block, self.block], default_initializer=init)\n", + " self.ln = nn.LayerNorm(d_model); self.drop = nn.Dropout(dropout); self.shrink = shrink\n", + " def _cl(self, xr, xi, Wr, Wi):\n", + " out_r = paddle.matmul(xr, Wr) - paddle.matmul(xi, Wi)\n", + " out_i = paddle.matmul(xr, Wi) + paddle.matmul(xi, Wr)\n", + " return out_r, out_i\n", + " def forward(self, x): # (B,T,D)\n", + " B,T,D = x.shape; Kmax=T//2+1; K=min(self.modes, Kmax)\n", + " h=self.ln(x); h_td=h.transpose([0,2,1]); h_ft=paddle.fft.rfft(h_td) # (B,D,F)\n", + " h_ft=h_ft.reshape([B, self.num_blocks, self.block, Kmax])\n", + " xk=h_ft[:,:,:, :K].transpose([0,1,3,2]) # (B,G,K,Cb)\n", + " xr, xi = paddle.real(xk), paddle.imag(xk)\n", + " yr, yi = self._cl(xr, xi, self.w1r, self.w1i)\n", + " yr = F.gelu(yr); yi = F.gelu(yi)\n", + " yr = F.softshrink(yr, threshold=self.shrink); yi = F.softshrink(yi, threshold=self.shrink)\n", + " yr, yi = self._cl(yr, yi, self.w2r, self.w2i)\n", + " yk = paddle.complex(yr, yi).transpose([0,1,3,2]).reshape([B,D,K])\n", + " out_ft = paddle.zeros([B,D,Kmax], dtype='complex64')\n", + " out_ft[:,:, :K] = yk\n", + " out_td = paddle.fft.irfft(out_ft, n=T)\n", + " out = out_td.transpose([0,2,1])\n", + " out = self.drop(out)\n", + " return x + out\n", + "\n", + "class AFNOTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, num_layers=2, modes=32, dropout=0.1,\n", + " d_ff=1024, use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.layers = nn.LayerList([AFNO1DLayer(d_model, modes, 8, 0.01, dropout) for _ in range(num_layers)])\n", + " self.use_moe = use_moe\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff), nn.ReLU(), nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model))\n", + " self.do = nn.Dropout(dropout)\n", + " def forward(self, x):\n", + " for layer in self.layers:\n", + " x = layer(x)\n", + " if self.use_moe:\n", + " x = self.moe(x)\n", + " else:\n", + " x = x + self.do(self.ffn(x))\n", + " return x\n", + "\n", + "# ============ Cross-Attention(记录注意力) ============\n", + "class MultiHeadCrossAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_head = d_model // nhead; self.nhead = nhead\n", + " self.Wq = nn.Linear(d_model, d_model); self.Wk = nn.Linear(d_model, d_model); self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model); self.drop = nn.Dropout(dropout); self.ln = nn.LayerNorm(d_model)\n", + " self.last_attn = None # (B, H, Nq, Nk)\n", + " def forward(self, q, kv):\n", + " B, Nq, D = q.shape; Nk = kv.shape[1]\n", + " def split(t): return t.reshape([B, -1, self.nhead, self.d_head]).transpose([0,2,1,3])\n", + " qh = split(self.Wq(q)); kh = split(self.Wk(kv)); vh = split(self.Wv(kv))\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head) # (B,H,Nq,Nk)\n", + " attn = F.softmax(scores, axis=-1)\n", + " self.last_attn = attn.detach()\n", + " ctx = paddle.matmul(attn, vh).transpose([0,2,1,3]).reshape([B,Nq,D])\n", + " out = self.drop(self.proj(ctx))\n", + " return self.ln(out + q)\n", + "\n", + "class BiModalCrossFusion(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, dropout=0.1, fuse_hidden=512):\n", + " super().__init__()\n", + " self.ca_v_from_t = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.ca_t_from_v = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.fuse = nn.Sequential(nn.Linear(2*d_model, fuse_hidden), nn.ReLU(), nn.Dropout(dropout))\n", + " self.out_dim = fuse_hidden\n", + " self.last_attn_v_from_t = None # (B,H,1,1)\n", + " self.last_attn_t_from_v = None # (B,H,1,T)\n", + " def forward(self, video_seq, tabm_tok):\n", + " v_tok = video_seq.mean(axis=1, keepdim=True) # (B,1,D)\n", + " t_tok = tabm_tok.unsqueeze(1) # (B,1,D)\n", + " v_upd = self.ca_v_from_t(v_tok, t_tok)\n", + " t_upd = self.ca_t_from_v(t_tok, video_seq)\n", + " self.last_attn_v_from_t = self.ca_v_from_t.last_attn\n", + " self.last_attn_t_from_v = self.ca_t_from_v.last_attn\n", + " fused = paddle.concat([v_upd, t_upd], axis=-1).squeeze(1)\n", + " return self.fuse(fused)\n", + "\n", + "# ============ 总模型 ============\n", + "class TwoModalMultiLabelModel(nn.Layer):\n", + " def __init__(self, vid_channels=20, vid_frames=365, depth_n=24,\n", + " vec_dim=424, d_model=256, nhead=4, n_trans_layers=2, trans_ff=512,\n", + " tabm_hidden=256, dropout=0.1, num_labels=4,\n", + " moe_temporal_attn=True, moe_temporal_afno=True, moe_fused=False, moe_tabm=False,\n", + " afno_modes=32):\n", + " super().__init__()\n", + " self.vol_encoder = Volume3DEncoder(in_channels=vid_channels, dropout=dropout)\n", + " # 关键:3D ResNet 输出 512 → d_model 的输入投影\n", + " self.video_in = nn.Linear(self.vol_encoder.out_dim, d_model)\n", + "\n", + " self.trans_attn = TemporalTransformerFlexible(\n", + " d_model=d_model, nhead=nhead, num_layers=n_trans_layers, d_ff=trans_ff, dropout=dropout,\n", + " max_len=vid_frames, use_moe=moe_temporal_attn, moe_cfg=MoEConfig(d_ff=max(2048,trans_ff), n_experts=8),\n", + " capture_attn=True\n", + " )\n", + " self.trans_afno = AFNOTransformerFlexible(\n", + " d_model=d_model, num_layers=n_trans_layers, modes=afno_modes, dropout=dropout,\n", + " d_ff=trans_ff, use_moe=moe_temporal_afno, moe_cfg=MoEConfig(d_ff=max(2048,trans_ff), n_experts=8)\n", + " )\n", + " self.video_merge = nn.Linear(2*d_model, d_model)\n", + "\n", + " self.tabm = TabMFeatureExtractor(vec_dim, d_hidden=tabm_hidden, dropout=dropout)\n", + " self.tabm_proj = nn.Linear(tabm_hidden, d_model)\n", + " self.moe_tabm = moe_tabm\n", + " if moe_tabm:\n", + " self.tabm_moe = MoEHead(d_model=d_model, cfg=MoEConfig(d_ff=1024, n_experts=6))\n", + "\n", + " self.fusion = BiModalCrossFusion(d_model=d_model, nhead=nhead, dropout=dropout, fuse_hidden=d_model)\n", + " self.moe_fused = moe_fused\n", + " if moe_fused:\n", + " self.fused_moe = MoEHead(d_model=d_model, cfg=MoEConfig(d_ff=1024, n_experts=6))\n", + "\n", + " self.head = nn.Linear(self.fusion.out_dim, num_labels)\n", + " self.depth_n = depth_n\n", + "\n", + " def encode(self, x_video, x_vec):\n", + " B,T,C,H,W,N = x_video.shape\n", + " assert N == self.depth_n\n", + " xvt = x_video.transpose([0,1,2,5,3,4]).reshape([B*T, C, N, H, W])\n", + " f_frame = self.vol_encoder(xvt) # (B*T,512)\n", + " seq = f_frame.reshape([B, T, -1]) # (B,T,512)\n", + " seq = self.video_in(seq) # (B,T,d_model)\n", + "\n", + " z_attn = self.trans_attn(seq) # (B,T,d_model)\n", + " z_afno = self.trans_afno(seq) # (B,T,d_model)\n", + " z_vid = self.video_merge(paddle.concat([z_attn, z_afno], axis=-1)) # (B,T,d_model)\n", + "\n", + " z_tabm = self.tabm(x_vec); z_tabm = self.tabm_proj(z_tabm) # (B,d_model)\n", + " if self.moe_tabm:\n", + " z_tabm = self.tabm_moe(z_tabm)\n", + "\n", + " fused = self.fusion(z_vid, z_tabm) # (B,d_model)\n", + " if self.moe_fused:\n", + " fused = self.fused_moe(fused)\n", + " return fused\n", + "\n", + " def forward(self, x_video, x_vec):\n", + " fused = self.encode(x_video, x_vec)\n", + " logits = self.head(fused)\n", + " return logits\n", + "\n", + "# ============ 3D Grad-CAM ============\n", + "class GradCAM3D:\n", + " def __init__(self, model: TwoModalMultiLabelModel):\n", + " self.model = model\n", + " @paddle.no_grad()\n", + " def _trilinear_upsample(self, vol, out_shape):\n", + " try:\n", + " from scipy.ndimage import zoom\n", + " Dz = out_shape[0] / vol.shape[0]\n", + " Dy = out_shape[1] / vol.shape[1]\n", + " Dx = out_shape[2] / vol.shape[2]\n", + " return zoom(vol, (Dz, Dy, Dx), order=1)\n", + " except Exception:\n", + " return vol\n", + " def generate(self, x_video, x_vec, target_class: int = 0, time_index: int = 0):\n", + " assert x_video.shape[0] == 1, \"Grad-CAM 演示请用单样本 B=1\"\n", + " self.model.eval()\n", + " self.model.clear_gradients()\n", + " logits = self.model(x_video.astype('float32'), x_vec.astype('float32')) # (1,num_labels)\n", + " cls = logits[0, target_class]\n", + " cls.backward()\n", + " feat = self.model.vol_encoder._feat # (1,512,D',H',W')\n", + " grad = self.model.vol_encoder._grad\n", + " assert (feat is not None) and (grad is not None), \"未捕获到特征/梯度\"\n", + " feat_np = feat.numpy()[0]; grad_np = grad.numpy()[0]\n", + " w = grad_np.mean(axis=(1,2,3)) # (512,)\n", + " cam = np.maximum(0, np.tensordot(w, feat_np, axes=(0,0))) # (D',H',W')\n", + " cam = cam - cam.min(); cam = cam / (cam.max() + 1e-8)\n", + " # 将 CAM 插值到输入体素大小:(N,H,W);这里我们没有逐帧求 CAM,而是对“最后一层体特征”整体做\n", + " # 若你需要对某个 time_index 的体做 CAM,可在 3D 编码处按帧送入并单独反传。\n", + " B,T,C,H,W,N = x_video.shape\n", + " cam_up = self._trilinear_upsample(cam, (N, H, W))\n", + " return cam_up\n", + "\n", + "# ============ MoE 路由聚类工具 ============\n", + "def kmeans_numpy(X: np.ndarray, K: int = 4, iters: int = 50, seed: int = 0):\n", + " rng = np.random.default_rng(seed)\n", + " N,D = X.shape\n", + " cent = X[rng.choice(N, K, replace=False)]\n", + " for _ in range(iters):\n", + " dist2 = ((X[:,None,:]-cent[None,:,:])**2).sum(axis=2) # (N,K)\n", + " idx = dist2.argmin(axis=1)\n", + " new_cent = np.stack([X[idx==k].mean(axis=0) if np.any(idx==k) else cent[k] for k in range(K)], 0)\n", + " if np.allclose(new_cent, cent): break\n", + " cent = new_cent\n", + " return idx, cent\n", + "\n", + "def collect_moe_routing_vectors(model: TwoModalMultiLabelModel, loader: DataLoader,\n", + " branch: str = \"temporal_attn\", topk_hist: bool = True):\n", + " model.eval()\n", + " vecs = []\n", + " for x_vid, x_vec, y in loader:\n", + " _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " if branch == \"temporal_attn\":\n", + " moe = None\n", + " for lyr in model.trans_attn.layers[::-1]:\n", + " if hasattr(lyr, \"moe\"):\n", + " moe = lyr.moe; break\n", + " elif branch == \"temporal_afno\":\n", + " moe = model.trans_afno.moe if hasattr(model.trans_afno, \"moe\") else None\n", + " elif branch == \"tabm\":\n", + " moe = model.tabm_moe.moe if getattr(model, \"moe_tabm\", False) else None\n", + " else:\n", + " moe = model.fused_moe.moe if getattr(model, \"moe_fused\", False) else None\n", + " if moe is None or moe.last_router_probs is None:\n", + " continue\n", + " probs = moe.last_router_probs.numpy() # (N_tokens, E)\n", + " if topk_hist:\n", + " top1 = moe.last_topk_idx.numpy()[:,0] # (N_tokens,)\n", + " E = probs.shape[1]\n", + " hist = np.bincount(top1, minlength=E).astype(\"float32\")\n", + " hist = hist / (hist.sum() + 1e-9)\n", + " vecs.append(hist)\n", + " else:\n", + " vecs.append(probs.mean(axis=0))\n", + " return np.stack(vecs, 0) if len(vecs)>0 else None\n", + "\n", + "# ============ Toy 数据集 ============\n", + "class ToyTwoModalDataset(Dataset):\n", + " def __init__(self, n: int, seed: int = 0, T: int = 365, C: int = 20, H: int = 20, W: int = 20, N: int = 24):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.video = rng.normal(size=(n, T, C, H, W, N)).astype('float32')\n", + " self.vec = rng.normal(size=(n, 424)).astype('float32')\n", + " vid_hwn = self.video.mean(axis=(3,4,5))\n", + " vid_avg = vid_hwn.mean(axis=1)\n", + " Wv = rng.normal(size=(C,4)); Wt = rng.normal(size=(424,4))\n", + " logits = vid_avg @ Wv + self.vec @ Wt + rng.normal(scale=0.5, size=(n,4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.y = (probs > 0.5).astype('float32')\n", + " def __getitem__(self, idx: int):\n", + " return self.video[idx], self.vec[idx], self.y[idx]\n", + " def __len__(self): return len(self.y)\n", + "\n", + "# ============ 小工具:绘图 ============\n", + "def show_heatmap_2d(arr2d: np.ndarray, title: str, save_path: Optional[str] = None):\n", + " plt.figure(); plt.imshow(arr2d, interpolation='nearest'); plt.title(title); plt.colorbar()\n", + " if save_path: plt.savefig(save_path, bbox_inches='tight');\n", + " plt.show(); plt.close()\n", + "\n", + "def show_attention_matrix(attn: np.ndarray, title: str, save_path: Optional[str] = None):\n", + " if attn.ndim == 4 and attn.shape[2] == 1 and attn.shape[3] == 1:\n", + " attn = attn[0,:,0,0][:,None] # (H,1)\n", + " elif attn.ndim == 4 and attn.shape[2] == 1:\n", + " attn = attn[0] # (H,1,T)\n", + " elif attn.ndim == 4:\n", + " attn = attn[0] # (H,T,T)\n", + " plt.figure(figsize=(5,4))\n", + " if attn.ndim == 2:\n", + " plt.imshow(attn, aspect='auto', interpolation='nearest')\n", + " elif attn.ndim == 3:\n", + " H = attn.shape[0]\n", + " cols = int(np.ceil(np.sqrt(H))); rows = int(np.ceil(H/cols))\n", + " fig, axes = plt.subplots(rows, cols, figsize=(3*cols, 3*rows))\n", + " axes = axes.flatten()\n", + " for h in range(H):\n", + " axes[h].imshow(attn[h], interpolation='nearest'); axes[h].set_title(f\"head {h}\")\n", + " for k in range(H, len(axes)): axes[k].axis('off')\n", + " fig.suptitle(title)\n", + " if save_path: fig.savefig(save_path, bbox_inches='tight')\n", + " plt.show(); plt.close(fig); return\n", + " plt.title(title); plt.colorbar()\n", + " if save_path: plt.savefig(save_path, bbox_inches='tight')\n", + " plt.show(); plt.close()\n", + "\n", + "# ============ Demo:可解释可视化 ============\n", + "if __name__ == \"__main__\":\n", + " # 1) 构造“已训练好”的模型(这里随机权重示意)\n", + " model = TwoModalMultiLabelModel(\n", + " vid_channels=20, vid_frames=365, depth_n=24,\n", + " vec_dim=424, d_model=256, nhead=4, n_trans_layers=2, trans_ff=512,\n", + " tabm_hidden=256, dropout=0.1, num_labels=4,\n", + " moe_temporal_attn=True, moe_temporal_afno=True,\n", + " moe_fused=False, moe_tabm=False, afno_modes=32\n", + " )\n", + " model.eval()\n", + "\n", + " # 2) 取一个样本\n", + " toy = ToyTwoModalDataset(n=8, seed=123, T=365, C=20, H=20, W=20, N=24)\n", + " x_video, x_vec, y = toy[0]\n", + " x_video = paddle.to_tensor(x_video[None, ...]) # (1,T,C,H,W,N)\n", + " x_vec = paddle.to_tensor(x_vec[None, ...]) # (1,424)\n", + "\n", + " # 3) 3D Grad-CAM:一次“有梯度”的前向 + 反传(不要 no_grad)\n", + " model.clear_gradients()\n", + " logits = model(x_video.astype('float32'), x_vec.astype('float32'))\n", + " target_class = int(paddle.argmax(logits, axis=-1)[0])\n", + " cam3d = GradCAM3D(model).generate(\n", + " x_video.astype('float32'), x_vec.astype('float32'),\n", + " target_class=target_class, time_index=0\n", + " ) # (N,H,W) or (D',H',W')\n", + "\n", + " # 展示几个深度切片\n", + " Nz = cam3d.shape[0]\n", + " for z in [0, Nz//3, 2*Nz//3, Nz-1]:\n", + " show_heatmap_2d(cam3d[z], f\"Grad-CAM depth={z}\", save_path=f\"viz_out/gradcam_z{z}.png\")\n", + "\n", + " # 4) Self-Attention & Cross-Attention 注意力矩阵\n", + " with paddle.no_grad():\n", + " _ = model.encode(x_video.astype('float32'), x_vec.astype('float32'))\n", + " last_attn_list = model.trans_attn.last_attn_all_layers\n", + " if len(last_attn_list) > 0:\n", + " attn = last_attn_list[-1].numpy() # (B,H,T,T)\n", + " attn_crop = attn[:, :, :64, :64]\n", + " show_attention_matrix(attn_crop, \"Self-Attention (last layer, first 64 tokens)\",\n", + " save_path=\"viz_out/self_attn_lastlayer_64.png\")\n", + " print(\"Self-Attn matrix shape:\", attn.shape)\n", + " else:\n", + " print(\"Self-Attn not captured.\")\n", + " if model.fusion.last_attn_v_from_t is not None:\n", + " show_attention_matrix(model.fusion.last_attn_v_from_t.numpy(),\n", + " \"Cross-Attn v<-t (token→token)\",\n", + " save_path=\"viz_out/cross_attn_v_from_t.png\")\n", + " if model.fusion.last_attn_t_from_v is not None:\n", + " attn_tv = model.fusion.last_attn_t_from_v.numpy()\n", + " attn_tv_crop = attn_tv[:,:,:, :64]\n", + " show_attention_matrix(attn_tv_crop,\n", + " \"Cross-Attn t<-v (token←video_seq first 64)\",\n", + " save_path=\"viz_out/cross_attn_t_from_v_64.png\")\n", + "\n", + " # 5) MoE 路由聚类(示例用 toy 数据)\n", + " def collate_fn(batch):\n", + " vids, vecs, ys = zip(*batch)\n", + " return (paddle.to_tensor(np.stack(vids, 0)),\n", + " paddle.to_tensor(np.stack(vecs, 0)),\n", + " paddle.to_tensor(np.stack(ys, 0)))\n", + " train_loader = DataLoader(toy, batch_size=1, shuffle=False, collate_fn=collate_fn)\n", + " moe_vecs = collect_moe_routing_vectors(model, train_loader, branch=\"temporal_attn\", topk_hist=True)\n", + " if moe_vecs is not None:\n", + " idx, cent = kmeans_numpy(moe_vecs, K=4, iters=100, seed=0)\n", + " print(\"\\n[MoE Routing Clusters @ temporal_attn]\")\n", + " for k in range(4):\n", + " sel = (idx==k)\n", + " if np.any(sel):\n", + " mean_vec = moe_vecs[sel].mean(axis=0)\n", + " dom = int(mean_vec.argmax())\n", + " print(f\" - Cluster {k}: size={int(sel.sum())}, dominant_expert={dom}, mean_dist={np.round(mean_vec,3)}\")\n", + " plt.figure(figsize=(6,4))\n", + " plt.imshow(moe_vecs, aspect='auto', interpolation='nearest')\n", + " plt.title(\"Samples × Experts (routing histogram)\"); plt.xlabel(\"Expert\"); plt.ylabel(\"Sample\")\n", + " plt.colorbar(); plt.savefig(\"viz_out/moe_routing_heatmap.png\", bbox_inches='tight')\n", + " plt.show(); plt.close()\n", + " else:\n", + " print(\"MoE routing not available on selected branch.\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "3FGUHDpRVnm6", + "outputId": "5b54a53c-7a05-4086-cf05-65083c8528e4" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGzCAYAAABzfl4TAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVCBJREFUeJzt3XlcVOX+B/DPoDK4MCDKWriboCIoJmKWCxSolaS5cOm6kXa7YipZaota1kVzT72Sv9xKCSXNSr0UomgJaoJYmpEaCirgFiAai8zz+8PLuY6zwDBzFD2f9+91Xj/nnO/zzHNOePn6bEclhBAgIiIisgKb+90AIiIiengwsSAiIiKrYWJBREREVsPEgoiIiKyGiQURERFZDRMLIiIishomFkRERGQ1TCyIiIjIaphYEBERkdUwsSBFGDNmDFq1anW/m3FP9O3bF3379r1v369SqRAVFXXfvp+I7i8mFiSr7OxsREVF4bHHHkOjRo3QqFEjdOzYERMnTsTPP/98v5tnVHFxMd577z34+vqiSZMmaNiwITp37ozp06fj4sWLBssMHz4cKpUK06dPN3g9JSUFKpUKKpUKGzduNBjzxBNPQKVSoXPnzla7FzmkpqZizpw5KCwsvOffnZeXhxkzZqBfv36wt7eHSqVCSkqK0fjy8nL861//gpeXF+zs7ODq6opBgwbh/Pnz967RRArCxIJks2PHDnTu3Bmff/45goODsWTJEixbtgwDBgzArl274Ofnh3Pnzt3vZur5448/4Ofnh7lz56Jjx46YP38+Pv74Y/Tr1w9r1qwx2BtQXFyMb7/9Fq1atcIXX3wBU6/gsbOzQ1xcnN75s2fPIjU1FXZ2dta8HVmkpqbivffeuy+JRVZWFubPn48LFy7Ax8fHZGxFRQUGDRqEDz/8EKGhofj3v/+NN998E40bN0ZRUdE9ajGRstS/3w2gh9OZM2cwcuRItGzZEsnJyXB3d9e5Pn/+fPz73/+GjY3p3PbGjRto3LixnE3VcevWLQwZMgQFBQVISUlB7969da5/+OGHmD9/vl65rVu3orKyEmvXrkX//v2xf/9+9OnTx+B3DBw4EN988w2uXLmC5s2bS+fj4uLg6uqK9u3b488//7TujT1E/P39cfXqVTg5OeHLL7/EsGHDjMYuWbIE+/btw48//ogePXrcw1YSKRd7LEgWH330EW7cuIF169bpJRUAUL9+fbz22mvw9PSUzo0ZMwZNmjTBmTNnMHDgQNjb2yMiIgIA8MMPP2DYsGFo0aIF1Go1PD09MXXqVPz11196dW/fvh2dO3eGnZ0dOnfujK+++qrG7d66dSuOHTuGt99+Wy+pAACNRoMPP/xQ7/ymTZvw9NNPo1+/fvD29samTZuMfsfgwYOhVquRkJCgcz4uLg7Dhw9HvXr1atze1atXo23btmjYsCF69OiBH374wWBcWVkZZs+ejXbt2knP780330RZWZlOXNX8iE2bNqFDhw6ws7ODv78/9u/fL8XMmTMHb7zxBgCgdevW0vDO2bNndeqq+u+gVqvRqVMnJCYm1vi+TLG3t4eTk1O1cVqtFsuWLcMLL7yAHj164NatW7h586ZV2kBExrHHgmSxY8cOtGvXDgEBAWaVu3XrFkJCQtC7d28sXLgQjRo1AgAkJCTg5s2bePXVV9GsWTMcPnwYy5cvx/nz53V+QX///fcYOnQoOnbsiJiYGFy9ehVjx47Fo48+WqPv/+abbwAAf//732vc5osXL2Lv3r3YsGEDACA8PBxLlizBihUrYGtrqxffqFEjDB48GF988QVeffVVAMCxY8dw4sQJfPrppzWee7JmzRq88sor6NWrF6ZMmYI//vgDzz//PJycnHQSNq1Wi+effx4//vgjJkyYAG9vb/zyyy9YsmQJfv/9d2zfvl2n3n379mHz5s147bXXoFar8e9//xuhoaE4fPgwOnfujCFDhuD333/HF198gSVLlki9Ls7OzlIdP/74I7Zt24Z//vOfsLe3x8cff4yhQ4ciJycHzZo1A3B7mKKmwxFOTk7V9m7d7ddff8XFixfRpUsXTJgwARs2bEB5eTl8fHywbNky9OvXz6z6iKiGBJGVFRUVCQAiLCxM79qff/4pLl++LB03b96Uro0ePVoAEDNmzNArd2dclZiYGKFSqcS5c+ekc35+fsLd3V0UFhZK577//nsBQLRs2bLatnft2lU4ODhUG3enhQsXioYNG4ri4mIhhBC///67ACC++uornbi9e/cKACIhIUHs2LFDqFQqkZOTI4QQ4o033hBt2rQRQgjRp08f0alTJ5PfWV5eLlxcXISfn58oKyuTzq9evVoAEH369JHOff7558LGxkb88MMPOnXExsYKAOLAgQPSOQACgDhy5Ih07ty5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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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q6srtm7dysCCSAIMLEgSI0eOxKeffopjx46hb9++FtX1888/49dff8XmzZt1hgvu70av2Q/j7NmzenXk5OTofN66davOipKav/Kff/55fP7559iyZQvmzp1rsl2CICA+Ph5DhgzBX//6V73zCxcuxNatW40GFgMGDED79u2RmppqcAmrKffe673d/1VVVcjNzYWPj494rFOnTjh58iQCAwON7q1xL0PP79dff0WLFi3EXo+61FObtLQ0DBkypE55c3NzdXZOvXHjBoYNG4aKigqDy5lrU15eXueJo0RkHgYWJIm3334b8fHxmDJlClJSUuDi4qJz/t6/XGtT85fqvWUEQcDHH3+sk8/V1RW+vr7YvHmzzjyL5ORk/PLLLzobcT399NMGr/XSSy8hNjYWH330EQYPHoyAgACd87du3cKiRYvw0Ucf4fDhw7hw4QI++OADvPTSS3p1/frrr3jvvfdw5coVuLm56Z1XKBT45z//iRMnTpi1CgUA+vTpAycnJ8TFxWHy5MniPItNmzbpLaMcO3Ys9u7di3//+9+IiorSOffHH39Aq9Xq7BWSnp6OzMxM9O7dG8DdnoGvvvoKISEh4n+LmvyWLNms7xyLsrIyjBgxApcvX8aBAwcMDt3U5FMoFOLKoho7duzA77//jj59+tS77URkHAMLkkTnzp0RHx+P8PBwdOnSRdx5UxAE5ObmIj4+HjY2NnVaBurl5YVOnTrhzTffxOXLl6FSqcQvh/vFxsZi5MiRGDBgAKZMmYKbN29i1apV6NatW50m7DVr1gw7d+5EUFAQBg4ciLFjx+Lpp59Gs2bNcPr0acTHx6NNmzb46KOPsHXrVjRp0gQjR440WNcLL7yAv/3tb0hISEBMTIzBPKNGjcKoUaNqbZehdn744Yd49dVXMXToUIwbNw65ubnYuHGj3hyLP//5z9i+fTv+8pe/4MCBA3j66adRXV2NM2fOYPv27fj22291vmS7d++O4OBgneWmAPD++++LeWomd/7tb3/D+PHj0axZMzz//PNmbWZW3zkWEREROHbsGKZMmYLs7GydvStatWolTpg9e/YsgoKCMG7cOHh5ecHGxgbHjx/Hli1b4OHhgRkzZph9bSKqgwZckUIycO7cOeG1114TnnjiCcHOzk5o3ry54OXlJfzlL38RsrKydPJOnDhRaNmypcF6fvnlFyEoKEho1aqV0K5dO2Hq1KniEsaNGzfq5N2xY4fg7e0tKJVKoWvXrsLOnTuFiRMn1mm5aY3ff/9dmDdvntCjRw+hRYsWgp2dndC9e3dh7ty5QkFBgVBZWSm0bdtWeOaZZ0zW07FjR6FXr16CIOguNzWlLstNa/zrX/8SOnbsKCiVSqFPnz7CoUOHhEGDBuksNxWEu8tTFy9eLHTr1k1QKpVCmzZtBD8/P+H9998XiouLxXwAhGnTpglbtmwROnfuLCiVSqFXr17CgQMH9K69cOFC4bHHHhNsbGx0loTW1HG/Dh06CBMnTqzTfZnSoUMHo8tS7/1vfO3aNSEqKkrw8vISWrZsKdja2gqdO3cWZs6cKVy7ds3idhCRYQpBMKNPmogeaQqFAtOmTcPq1asbuilE9JDilt5ERERkNQwsiIiIyGoYWBAREZHVMLAgIpEgCJxfQSSRNWvWwMPDA3Z2dvD398exY8eM5j19+jTCwsLg4eEBhUKBlStX1qvO8vJyTJs2DW3btkWrVq0QFhaGwsJCa96WHgYWREREEtu2bRtiYmIwf/58ZGZmwsfHB8HBwXpb6te4ffs2PD09sWjRIqPb6NelzlmzZuGbb75BYmIiDh48iCtXrmD06NGS3GMNrgohIiKSmL+/P5566imxR1Cr1cLd3R3Tp0/HnDlzTJb18PDAzJkzMXPmTLPqLC4uhpOTE+Lj48VN/M6cOQNvb2+kp6ejX79+1r9RPCIbZGm1Wly5cgWtW7e2ylbDRET0YAmCgFu3bsHNzU3vfUHWVF5ejsrKSovrEQRB7/tGqVRCqVTq5a2srERGRobOawJsbGwQFBSE9PT0el2/LnVmZGSgqqpKZyM6Ly8vtG/fnoFFba5cuSLJi5SIiOjBys/Pr9OOvPVRXl6Ojh1aQXO1uvbMtWjVqpXebr41LzO83/Xr11FdXa33agMXFxecOXOmXtevS50ajQa2trZwcHDQy6PRaOp13bp4JAKLmrcaPr7gXdjY2TVwa4iIyFza8nJcWvBhnd9SWx+VlZXQXK1GbkYHqFrXv1ek5JYWHf0uIj8/HyqVSjxuqLdCjh6JwKKmO8rGzo6BBRHRQ+xBDGerWttYFFiI9ahUOoGFMe3atUOTJk30VmMUFhYanZhpjTrVajUqKytRVFSk02thyXXrgqtCiIhIVqoFrcXJHLa2tvDz80NKSop4TKvVIiUlRe8Nytas08/PD82aNdPJk5OTg7y8vHpfty4eiR4LIiKiutJCgBb1XxBZn7IxMTGYOHEi+vTpg759+2LlypUoKyvD5MmTAQATJkzAY489htjYWAB3h21++eUX8d+XL19GVlYWWrVqhSeeeKJOddrb2yMyMhIxMTFwdHSESqXC9OnTERAQINnETUDCHgtzNgIBgMTERHh5ecHOzg49evTA3r17pWoaERHJmNYK/2eucePGYenSpZg3bx58fX2RlZWFpKQkcfJlXl4eCgoKxPxXrlxBr1690KtXLxQUFGDp0qXo1asXXnnllTrXCQArVqzAc889h7CwMAwcOBBqtRo7d+604OnVTpJ9LLZt24YJEyYgLi4O/v7+WLlyJRITE5GTkwNnZ2e9/GlpaRg4cCBiY2Px3HPPIT4+HosXL0ZmZia6d+9e6/VKSkpgb2+P9os+5BwLIqKHkLa8HHlz3kVxcXGd5i3UR813xZWcxy2evOnW5ZKkbX2YSdJjsXz5ckydOhWTJ09G165dERcXhxYtWmDDhg0G83/88ccICQnBW2+9BW9vbyxcuBC9e/fm1sJERGR11YJgcSLjrB5Y1Gzace+GHLVtBJKenq6THwCCg4ON5q+oqEBJSYlOIiIiqouaORaWJDLO6oGFqU07jG3IodFozMofGxsLe3t7MXFzLCIiosbhoVxuOnfuXBQXF4spPz+/oZtEREQPCS0EVFuQ2GNhmtWXm9ZnIxC1Wm1WfmP7sRMREdWmIZabyonVeyzqsxFIQECATn4ASE5OlnQDDyIiIrI+STbIMncjkBkzZmDQoEFYtmwZRo4ciYSEBBw/fhzr1q2TonlERCRjlq7s4KoQ0yQJLMaNG4dr165h3rx50Gg08PX11dsI5N7X4vbv3x/x8fF499138c4776Bz587YtWtXnfawICIiMof2f8mS8mScJBtkPWjcIIuI6OH2IDfIOpPtgtYWbJB165YWXt6F3CDLCL4rhIiIZKVmdYcl5ck4BhZERCQr1cLdZEl5Mo6BBRERyQrnWEjrodwgi4iIiBon9lgQEZGsaKFANRQWlSfjGFgQEZGsaIW7yZLyZByHQoiIiMhq2GNBRESyUm3hUIglZeWAgQUREckKAwtpcSiEiIiIrIY9FkREJCtaQQGtYMGqEAvKygEDCyIikhUOhUiLQyFERERkNeyxICIiWamGDaot+Lu62opteRQxsCAiIlkRLJxjIXCOhUkMLIiISFY4x0JanGNBREREVsMeCyIikpVqwQbVggVzLPiuEJMYWBARkaxooYDWgg57LRhZmMKhECIiIrIa9lgQEZGscPKmtBhYEBGRrFg+x4JDIaZwKISIiIishj0WREQkK3cnb1rwEjIOhZjEwIKIiGRFa+GW3lwVYhqHQoiIiMhqGFgQEZGs1EzetCTVx5o1a+Dh4QE7Ozv4+/vj2LFjJvMnJibCy8sLdnZ26NGjB/bu3atzXqFQGExLliwR83h4eOidX7RoUb3aX1cMLIiISFa0sLE4mWvbtm2IiYnB/PnzkZmZCR8fHwQHB+Pq1asG86elpSE8PByRkZE4ceIEQkNDERoailOnTol5CgoKdNKGDRugUCgQFhamU9cHH3ygk2/69Olmt98cDCyIiEhWqgWFxclcy5cvx9SpUzF58mR07doVcXFxaNGiBTZs2GAw/8cff4yQkBC89dZb8Pb2xsKFC9G7d2+sXr1azKNWq3XSV199hSFDhsDT01OnrtatW+vka9mypdntNwcDCyIionooKSnRSRUVFQbzVVZWIiMjA0FBQeIxGxsbBAUFIT093WCZ9PR0nfwAEBwcbDR/YWEh9uzZg8jISL1zixYtQtu2bdGrVy8sWbIEd+7cqest1gtXhRARkaxUW7gqpPp/q0Lc3d11js+fPx8LFizQy3/9+nVUV1fDxcVF57iLiwvOnDlj8BoajcZgfo1GYzD/5s2b0bp1a4wePVrn+Ouvv47evXvD0dERaWlpmDt3LgoKCrB8+XKT92gJBhZERCQrWsEGWgt23tT+b+fN/Px8qFQq8bhSqbS4bfW1YcMGREREwM7OTud4TEyM+O+ePXvC1tYWr776KmJjYyVrLwMLIiKielCpVDqBhTHt2rVDkyZNUFhYqHO8sLAQarXaYBm1Wl3n/N9//z1ycnKwbdu2Wtvi7++PO3fu4MKFC+jSpUut+euDcyyIiEhWaoZCLEnmsLW1hZ+fH1JSUsRjWq0WKSkpCAgIMFgmICBAJz8AJCcnG8y/fv16+Pn5wcfHp9a2ZGVlwcbGBs7OzmbdgznYY0FERLKiBeq1suPe8uaKiYnBxIkT0adPH/Tt2xcrV65EWVkZJk+eDACYMGECHnvsMcTGxgIAZsyYgUGDBmHZsmUYOXIkEhIScPz4caxbt06n3pKSEiQmJmLZsmV610xPT8fRo0cxZMgQtG7dGunp6Zg1axZefvlltGnTph53UTdW77GIjY3FU089hdatW8PZ2RmhoaHIyckxWWbTpk16G3jcP05ERET0sBo3bhyWLl2KefPmwdfXF1lZWUhKShInaObl5aGgoEDM379/f8THx2PdunXw8fHBF198gV27dqF79+469SYkJEAQBISHh+tdU6lUIiEhAYMGDUK3bt3w0UcfYdasWXrBibUpBMG6738NCQnB+PHj8dRTT+HOnTt45513cOrUKfzyyy9G185u2rQJM2bM0AlAFAqF3oxYY0pKSmBvb4/2iz6EDQMSIqKHjra8HHlz3kVxcXGd5i3UR813xdrMp9C8Vf077P8ovYPXev8oaVsfZlYfCklKStL5vGnTJjg7OyMjIwMDBw40Wk6hUBidxEJERGQtlmzLXVOejJP86RQXFwMAHB0dTeYrLS1Fhw4d4O7ujlGjRuH06dNG81ZUVOhtTEJEREQNT9LAQqvVYubMmXj66af1xoXu1aVLF2zYsAFfffUVtmzZAq1Wi/79++PSpUsG88fGxsLe3l5M929SQkREZIwWCosTGSdpYDFt2jScOnUKCQkJJvMFBARgwoQJ8PX1xaBBg7Bz5044OTnhk08+MZh/7ty5KC4uFlN+fr4UzSciokdQQ73dVC4kW24aHR2N3bt349ChQ3j88cfNKtusWTP06tUL586dM3heqVQ26A5nRET08LJ8S28GFqZY/ekIgoDo6Gh8+eWX2L9/Pzp27Gh2HdXV1fj555/h6upq7eYRERGRhKzeYzFt2jTEx8fjq6++QuvWrcUXptjb26N58+YA9DcC+eCDD9CvXz888cQTKCoqwpIlS3Dx4kW88sor1m4eERHJnFZQQGvJBlkWlJUDqwcWa9euBQAMHjxY5/jGjRsxadIkAHc3ArGx+f/Okt9//x1Tp06FRqNBmzZt4Ofnh7S0NHTt2tXazSMiIpnTWjgUouVQiElWDyzqst9WamqqzucVK1ZgxYoV1m4KERERPWB8VwgREcmK5a9NZ4+FKQwsiIhIVqqhQLUFe1FYUlYOGHYRERGR1bDHgoiIZIVDIdJiYEFERLJSDcuGM6qt15RHEsMuIiIishr2WBARkaxwKERaDCyIiEhWLH2RGF9CZhoDCyIikhXBwlefC1xuahLDLiIiIrIa9lgQEZGscChEWgwsiIhIVvh2U2kx7CIiIiKrYY8FERHJSrWFr023pKwcMLAgIiJZ4VCItBh2ERERkdWwx4KIiGRFCxtoLfi72pKycsDAgoiIZKVaUKDaguEMS8rKAcMuIiIishr2WBARkaxw8qa0GFgQEZGsCBa+3VTgzpsmMbAgIiJZqYYC1Ra8SMySsnLAsIuIiIishj0WREQkK1rBsnkSWsGKjXkEMbAgIiJZ0Vo4x8KSsnLAp0NERERWw8CCiIhkRQuFxak+1qxZAw8PD9jZ2cHf3x/Hjh0zmT8xMRFeXl6ws7NDjx49sHfvXp3zkyZNgkKh0EkhISE6eW7evImIiAioVCo4ODggMjISpaWl9Wp/XTGwICIiWanZedOSZK5t27YhJiYG8+fPR2ZmJnx8fBAcHIyrV68azJ+Wlobw8HBERkbixIkTCA0NRWhoKE6dOqWTLyQkBAUFBWL6/PPPdc5HRETg9OnTSE5Oxu7du3Ho0CFERUWZ3X5zMLAgIiKS2PLlyzF16lRMnjwZXbt2RVxcHFq0aIENGzYYzP/xxx8jJCQEb731Fry9vbFw4UL07t0bq1ev1smnVCqhVqvF1KZNG/FcdnY2kpKS8Omnn8Lf3x8DBgzAqlWrkJCQgCtXrkh2rwwsiIhIVmomb1qSAKCkpEQnVVRUGLxeZWUlMjIyEBQUJB6zsbFBUFAQ0tPTDZZJT0/XyQ8AwcHBevlTU1Ph7OyMLl264LXXXsONGzd06nBwcECfPn3EY0FBQbCxscHRo0fNe2hmYGBBRESyooVC3Na7Xul/cyzc3d1hb28vptjYWIPXu379Oqqrq+Hi4qJz3MXFBRqNxmAZjUZTa/6QkBB89tlnSElJweLFi3Hw4EEMHz4c1dXVYh3Ozs46dTRt2hSOjo5Gr2sNXG5KRERUD/n5+VCpVOJnpVL5QK8/fvx48d89evRAz5490alTJ6SmpiIwMPCBtuVe7LEgIiJZESxcESL8r8dCpVLpJGOBRbt27dCkSRMUFhbqHC8sLIRarTZYRq1Wm5UfADw9PdGuXTucO3dOrOP+yaF37tzBzZs3TdZjKQYWREQkKxYNg9Tjzai2trbw8/NDSkrK/7dBq0VKSgoCAgIMlgkICNDJDwDJyclG8wPApUuXcOPGDbi6uop1FBUVISMjQ8yzf/9+aLVa+Pv7m3UP5uBQCBERyUpD7LwZExODiRMnok+fPujbty9WrlyJsrIyTJ48GQAwYcIEPPbYY+I8jRkzZmDQoEFYtmwZRo4ciYSEBBw/fhzr1q0DAJSWluL9999HWFgY1Go1zp8/j7fffhtPPPEEgoODAQDe3t4ICQnB1KlTERcXh6qqKkRHR2P8+PFwc3Or9/3Xxuo9FgsWLNDbsMPLy8tkmdo2ASEiInqYjRs3DkuXLsW8efPg6+uLrKwsJCUliRM08/LyUFBQIObv378/4uPjsW7dOvj4+OCLL77Arl270L17dwBAkyZN8NNPP+GFF17Ak08+icjISPj5+eH777/XGZLZunUrvLy8EBgYiBEjRmDAgAFicCIVSXosunXrhn379v3/RZoav0zNJiCxsbF47rnnEB8fj9DQUGRmZooPkIiIyFrqM5xxf/n6iI6ORnR0tMFzqampesfGjBmDMWPGGMzfvHlzfPvtt7Ve09HREfHx8Wa101KSzLFo2rSpzoYd7dq1M5q3rpuAEBERWUNDbektF5IEFmfPnoWbmxs8PT0RERGBvLw8o3nrugnIvSoqKvQ2JiEiIqKGZ/XAwt/fH5s2bUJSUhLWrl2L3NxcPPPMM7h165bB/HXZBOR+sbGxOpuSuLu7W/UeiIjo0fWgV4XIjdUDi+HDh2PMmDHo2bMngoODsXfvXhQVFWH79u1Wu8bcuXNRXFwspvz8fKvVTUREjzYGFtKSfLmpg4MDnnzySXHDjvvVZxMQpVL5wHc4IyIiotpJvkFWaWkpzp8/L27Ycb/6bAJCRERUX+yxkJbVA4s333wTBw8exIULF5CWloYXX3wRTZo0QXh4OIC7m4DMnTtXzD9jxgwkJSVh2bJlOHPmDBYsWIDjx48bXZJDRERkCQYW0rL6UMilS5cQHh6OGzduwMnJCQMGDMCRI0fg5OQE4O4mIDY2/x/P1GwC8u677+Kdd95B586ddTYBISIiooeH1QOLhIQEk+fN3QSEiIjImgTAor0oBOs15ZHEd4UQEZGsNNTOm3LBwIKIiGSFgYW0+Np0IiIishr2WBARkaywx0JaDCyIiEhWGFhIi0MhREREZDXssSAiIlkRBAUEC3odLCkrBwwsiIhIVrRQWLSPhSVl5YBDIURERGQ17LEgIiJZ4eRNaTGwICIiWeEcC2lxKISIiIishj0WREQkKxwKkRYDCyIikhUOhUiLgQUREcmKYGGPBQML0zjHgoiIiKyGPRZERCQrAgBBsKw8GcfAgoiIZEULBRTceVMyHAohIiIiq2GPBRERyQpXhUiLgQUREcmKVlBAwX0sJMOhECIiIrIa9lgQEZGsCIKFq0K4LMQkBhZERCQrnGMhLQ6FEBERkdWwx4KIiGSFPRbSYo8FERHJSs3bTS1J9bFmzRp4eHjAzs4O/v7+OHbsmMn8iYmJ8PLygp2dHXr06IG9e/eK56qqqjB79mz06NEDLVu2hJubGyZMmIArV67o1OHh4QGFQqGTFi1aVK/21xUDCyIikpWayZuWJHNt27YNMTExmD9/PjIzM+Hj44Pg4GBcvXrVYP60tDSEh4cjMjISJ06cQGhoKEJDQ3Hq1CkAwO3bt5GZmYn33nsPmZmZ2LlzJ3JycvDCCy/o1fXBBx+goKBATNOnTzf/BszAwIKIiEhiy5cvx9SpUzF58mR07doVcXFxaNGiBTZs2GAw/8cff4yQkBC89dZb8Pb2xsKFC9G7d2+sXr0aAGBvb4/k5GSMHTsWXbp0Qb9+/bB69WpkZGQgLy9Pp67WrVtDrVaLqWXLlpLeKwMLIiKSlbu9DgoL0t16SkpKdFJFRYXB61VWViIjIwNBQUHiMRsbGwQFBSE9Pd1gmfT0dJ38ABAcHGw0PwAUFxdDoVDAwcFB5/iiRYvQtm1b9OrVC0uWLMGdO3fq8JTqj5M3iYhIVqw1edPd3V3n+Pz587FgwQK9/NevX0d1dTVcXFx0jru4uODMmTMGr6HRaAzm12g0BvOXl5dj9uzZCA8Ph0qlEo+//vrr6N27NxwdHZGWloa5c+eioKAAy5cvr/U+64uBBRERUT3k5+frfIkrlcoGaUdVVRXGjh0LQRCwdu1anXMxMTHiv3v27AlbW1u8+uqriI2Nlay9DCyIiEhWhP8lS8oDgEql0gksjGnXrh2aNGmCwsJCneOFhYVQq9UGy6jV6jrlrwkqLl68iP3799faHn9/f9y5cwcXLlxAly5dam17fXCOBRERyYpl8yvMH0axtbWFn58fUlJSxGNarRYpKSkICAgwWCYgIEAnPwAkJyfr5K8JKs6ePYt9+/ahbdu2tbYlKysLNjY2cHZ2NusezMEeCyIiIonFxMRg4sSJ6NOnD/r27YuVK1eirKwMkydPBgBMmDABjz32GGJjYwEAM2bMwKBBg7Bs2TKMHDkSCQkJOH78ONatWwfgblDx0ksvITMzE7t370Z1dbU4/8LR0RG2trZIT0/H0aNHMWTIELRu3Rrp6emYNWsWXn75ZbRp00aye2VgQURE8mKtsRAzjBs3DteuXcO8efOg0Wjg6+uLpKQkcYJmXl4ebGz+fxChf//+iI+Px7vvvot33nkHnTt3xq5du9C9e3cAwOXLl/H1118DAHx9fXWudeDAAQwePBhKpRIJCQlYsGABKioq0LFjR8yaNUtn3oUUFIJg3fe0eXh44OLFi3rH//rXv2LNmjV6xzdt2iRGbDWUSiXKy8vrfM2SkhLY29uj/aIPYWNnZ36jiYioQWnLy5E3510UFxfXad5CfdR8V3hu+htsWtT/u0J7uxy/TfpI0rY+zKzeY/Hjjz+iurpa/Hzq1Ck8++yzGDNmjNEyKpUKOTk54meFgvuwExGRNPjadGlZPbBwcnLS+bxo0SJ06tQJgwYNMlpGoVAYnRlLREREDw9JV4VUVlZiy5YtmDJlisleiNLSUnTo0AHu7u4YNWoUTp8+bbLeiooKvR3PiIiI6uJBrwqRG0kDi127dqGoqAiTJk0ymqdLly7YsGEDvvrqK2zZsgVarRb9+/fHpUuXjJaJjY2Fvb29mO7f/YyIiMgoQWF5IqMkDSzWr1+P4cOHw83NzWiegIAATJgwAb6+vhg0aBB27twJJycnfPLJJ0bLzJ07F8XFxWLKz8+XovlERERkJsmWm168eBH79u3Dzp07zSrXrFkz9OrVC+fOnTOaR6lUNtjWqURE9HDj5E1pSdZjsXHjRjg7O2PkyJFmlauursbPP/8MV1dXiVpGRESyJlghkVGSBBZarRYbN27ExIkT0bSpbqfIhAkTMHfuXPHzBx98gO+++w6//fYbMjMz8fLLL+PixYt45ZVXpGgaERERSUiSoZB9+/YhLy8PU6ZM0Tt3/+5iv//+O6ZOnQqNRoM2bdrAz88PaWlp6Nq1qxRNIyIimbPWa9PJMEkCi2HDhsHYhp6pqak6n1esWIEVK1ZI0QwiIiLDOJwhGb7dlIiIiKyGLyEjIiJZ4VCItBhYEBGRvDTA203lhIEFERHJjOJ/yZLyZAznWBAREZHVsMeCiIjkhUMhkmJgQURE8sLAQlIcCiEiIiKrYY8FERHJi6WvPudyU5MYWBARkazw7abS4lAIERERWQ17LIiISF44eVNSDCyIiEheOMdCUhwKISIiIqthjwUREcmKQribLClPxjGwICIieeEcC0kxsCAiInnhHAtJcY4FERERWQ17LIiISF44FCIpBhZERCQvDCwkxaEQIiIishr2WBARkbywx0JSDCyIiEheuCpEUhwKISIiIqthjwUREckKd96UFgMLIiKSF86xkBSHQoiIiB6ANWvWwMPDA3Z2dvD398exY8dM5k9MTISXlxfs7OzQo0cP7N27V+e8IAiYN28eXF1d0bx5cwQFBeHs2bM6eW7evImIiAioVCo4ODggMjISpaWlVr+3ezGwICIikti2bdsQExOD+fPnIzMzEz4+PggODsbVq1cN5k9LS0N4eDgiIyNx4sQJhIaGIjQ0FKdOnRLz/OMf/8A///lPxMXF4ejRo2jZsiWCg4NRXl4u5omIiMDp06eRnJyM3bt349ChQ4iKipL0XhWCIDz0nTolJSWwt7dH+0UfwsbOrqGbQ0REZtKWlyNvzrsoLi6GSqWS5Bo13xUdFlv2XaEtL8fF2e8iPz9fp61KpRJKpdJgGX9/fzz11FNYvXr13Tq0Wri7u2P69OmYM2eOXv5x48ahrKwMu3fvFo/169cPvr6+iIuLgyAIcHNzwxtvvIE333wTAFBcXAwXFxds2rQJ48ePR3Z2Nrp27Yoff/wRffr0AQAkJSVhxIgRuHTpEtzc3Or9DExhjwUREclLzXJTSxIAd3d32Nvbiyk2Ntbg5SorK5GRkYGgoCDxmI2NDYKCgpCenm6wTHp6uk5+AAgODhbz5+bmQqPR6OSxt7eHv7+/mCc9PR0ODg5iUAEAQUFBsLGxwdGjR+vx4OqGkzeJiIjqwVCPhSHXr19HdXU1XFxcdI67uLjgzJkzBstoNBqD+TUajXi+5pipPM7OzjrnmzZtCkdHRzGPFBhYEBGRvFhpVYhKpZJs2OZhxqEQIiKSF8EKyQzt2rVDkyZNUFhYqHO8sLAQarXaYBm1Wm0yf83/ry3P/ZND79y5g5s3bxq9rjUwsCAiIpKQra0t/Pz8kJKSIh7TarVISUlBQECAwTIBAQE6+QEgOTlZzN+xY0eo1WqdPCUlJTh69KiYJyAgAEVFRcjIyBDz7N+/H1qtFv7+/la7v/txKISIiGSlIXbejImJwcSJE9GnTx/07dsXK1euRFlZGSZPngwAmDBhAh577DFxAuiMGTMwaNAgLFu2DCNHjkRCQgKOHz+OdevW3W2DQoGZM2fiww8/ROfOndGxY0e89957cHNzQ2hoKADA29sbISEhmDp1KuLi4lBVVYXo6GiMHz9eshUhQD16LA4dOoTnn38ebm5uUCgU2LVrl875umzYYYi5G4cQERHVywMeCgHuLh9dunQp5s2bB19fX2RlZSEpKUmcfJmXl4eCggIxf//+/REfH49169bBx8cHX3zxBXbt2oXu3buLed5++21Mnz4dUVFReOqpp1BaWoqkpCTY3bOUduvWrfDy8kJgYCBGjBiBAQMGiMGJVMzex+K///0vDh8+DD8/P4wePRpffvmlGB0BwOLFixEbG4vNmzeLEdTPP/+MX375Redm77Vt2zZMmDABcXFx8Pf3x8qVK5GYmIicnBy9Ga2GcB8LIqKH24Pcx8Ljw48s3sfiwrt/k7StDzOzeyyGDx+ODz/8EC+++KLeOUEQsHLlSrz77rsYNWoUevbsic8++wxXrlzR69m41/LlyzF16lRMnjwZXbt2RVxcHFq0aIENGzaY2zwiIiLTGqDHQk6sOnmzLht23K8+G4dUVFSgpKREJxEREdVFzRwLSxIZZ9XAoi4bdtzP1MYhxsrExsbq7Hbm7u5uhdYTERGRpR7K5aZz585FcXGxmPLz8xu6SURE9LCw0pbeZJhVl5veu2GHq6ureLywsBC+vr4Gy9Rn4xBTL3ohIiIyyUo7b5JhVu2xqMuGHferz8YhRERE9cU5FtIyu8eitLQU586dEz/n5uYiKysLjo6OaN++fa0bdgBAYGAgXnzxRURHRwOofeMQIiIiejiYHVgcP34cQ4YMET/HxMQAACZOnIhNmzbh7bffRllZGaKiolBUVIQBAwbobdhx/vx5XL9+Xfw8btw4XLt2DfPmzYNGo4Gvr6/OxiFERERWw6EQSZm9QVZjxA2yiIgebg9ygyzP9/6OJhZ8V1SXl+O3he9wgywjHspVIURERNQ48SVkREQkLxwKkRQDCyIikhcGFpLiUAgRERFZDXssiIhIVizdi4L7WJjGHgsiIiKyGgYWREREZDUcCiEiInnh5E1JMbAgIiJZ4RwLaTGwICIi+WFwIBnOsSAiIiKrYY8FERHJC+dYSIqBBRERyQrnWEiLQyFERERkNeyxICIieeFQiKQYWBARkaxwKERaHAohIiIiq2GPBRERyQuHQiTFwIKIiOSFgYWkOBRCREREVsMeCyIikhVO3pQWAwsiIpIXDoVIioEFERHJCwMLSXGOBREREVkNeyyIiEhWOMdCWgwsiIhIXjgUIikOhRARETUiN2/eREREBFQqFRwcHBAZGYnS0lKTZcrLyzFt2jS0bdsWrVq1QlhYGAoLC8XzJ0+eRHh4ONzd3dG8eXN4e3vj448/1qkjNTUVCoVCL2k0GrPazx4LIiKSlcY+FBIREYGCggIkJyejqqoKkydPRlRUFOLj442WmTVrFvbs2YPExETY29sjOjoao0ePxuHDhwEAGRkZcHZ2xpYtW+Du7o60tDRERUWhSZMmiI6O1qkrJycHKpVK/Ozs7GxW+xlYEBGRvDTioZDs7GwkJSXhxx9/RJ8+fQAAq1atwogRI7B06VK4ubnplSkuLsb69esRHx+PoUOHAgA2btwIb29vHDlyBP369cOUKVN0ynh6eiI9PR07d+7UCyycnZ3h4OBQ73vgUAgREVE9lJSU6KSKigqL60xPT4eDg4MYVABAUFAQbGxscPToUYNlMjIyUFVVhaCgIPGYl5cX2rdvj/T0dKPXKi4uhqOjo95xX19fuLq64tlnnxV7PMzBwIKIiORFsEIC4O7uDnt7ezHFxsZa3DSNRqM39NC0aVM4Ojoaneug0Whga2ur18vg4uJitExaWhq2bduGqKgo8Zirqyvi4uKwY8cO7NixA+7u7hg8eDAyMzPNugcOhRARkawo/pcsKQ8A+fn5OnMRlEql0TJz5szB4sWLTdabnZ1tQavq7tSpUxg1ahTmz5+PYcOGice7dOmCLl26iJ/79++P8+fPY8WKFfjPf/5T5/oZWBAREdWDSqXSCSxMeeONNzBp0iSTeTw9PaFWq3H16lWd43fu3MHNmzehVqsNllOr1aisrERRUZFOr0VhYaFemV9++QWBgYGIiorCu+++W2u7+/btix9++KHWfPdiYEFERPLSAJM3nZyc4OTkVGu+gIAAFBUVISMjA35+fgCA/fv3Q6vVwt/f32AZPz8/NGvWDCkpKQgLCwNwd2VHXl4eAgICxHynT5/G0KFDMXHiRHz00Ud1andWVhZcXV3rlLcGAwsiIpKVxrzc1NvbGyEhIZg6dSri4uJQVVWF6OhojB8/XlwRcvnyZQQGBuKzzz5D3759YW9vj8jISMTExMDR0REqlQrTp09HQEAA+vXrB+Du8MfQoUMRHByMmJgYce5FkyZNxIBn5cqV6NixI7p164by8nJ8+umn2L9/P7777juz7sHsyZuHDh3C888/Dzc3NygUCuzatUs8V1VVhdmzZ6NHjx5o2bIl3NzcMGHCBFy5csVknQsWLNDbkMPLy8vcphEREdXOSpM3pbJ161Z4eXkhMDAQI0aMwIABA7Bu3TrxfFVVFXJycnD79m3x2IoVK/Dcc88hLCwMAwcOhFqtxs6dO8XzX3zxBa5du4YtW7bA1dVVTE899ZSYp7KyEm+88QZ69OiBQYMG4eTJk9i3bx8CAwPNar9CEASzHtF///tfHD58GH5+fhg9ejS+/PJLhIaGAri7dOWll17C1KlT4ePjg99//x0zZsxAdXU1jh8/brTOBQsW4IsvvsC+ffvEY02bNkW7du3q1KaSkhLY29uj/aIPYWNnZ87tEBFRI6AtL0fenHdRXFxc53kL5qr5ruj26t/RRFn/74rqinKc/uQdSdv6MDN7KGT48OEYPny4wXP29vZITk7WObZ69Wr07dsXeXl5aN++vfGGNG1qdGIKERGRVfF9H5KRfB+L4uJiKBSKWnfxOnv2LNzc3ODp6YmIiAjk5eUZzVtRUaG3MQkREVFd1MyxsCSRcZIGFuXl5Zg9ezbCw8NNdhf5+/tj06ZNSEpKwtq1a5Gbm4tnnnkGt27dMpg/NjZWZ1MSd3d3qW6BiIiIzCBZYFFVVYWxY8dCEASsXbvWZN7hw4djzJgx6NmzJ4KDg7F3714UFRVh+/btBvPPnTsXxcXFYsrPz5fiFoiI6FHUyCdvPuwkWW5aE1RcvHgR+/fvN3tyi4ODA5588kmcO3fO4HmlUmlyhzMiIiJjGvNy00eB1XssaoKKs2fPYt++fWjbtq3ZdZSWluL8+fNmb8pBREREDcvswKK0tBRZWVnIysoCAOTm5iIrKwt5eXmoqqrCSy+9hOPHj2Pr1q2orq6GRqOBRqNBZWWlWEdgYCBWr14tfn7zzTdx8OBBXLhwAWlpaXjxxRfRpEkThIeHW36HRERE9+JQiKTMHgo5fvw4hgwZIn6OiYkBAEycOBELFizA119/DeDua1fvdeDAAQwePBgAcP78eVy/fl08d+nSJYSHh+PGjRtwcnLCgAEDcOTIkTptf0pERGQODoVIy+zAYvDgwTC1p1Zd9tu6cOGCzueEhARzm0FERESNEN8VQkRE8tIALyGTEwYWREQkLwwsJMXAgoiIZIVzLKQl+ZbeREREJB/ssSAiInnhUIikGFgQEZGsKAQBijqsYDRVnozjUAgRERFZDXssiIhIXjgUIikGFkREJCtcFSItDoUQERGR1bDHgoiI5IVDIZJiYEFERLLCoRBpcSiEiIiIrIY9FkREJC8cCpEUAwsiIpIVDoVIi4EFERHJC3ssJMU5FkRERGQ17LEgIiLZ4XCGdBhYEBGRvAjC3WRJeTKKQyFERERkNeyxICIiWeGqEGkxsCAiInnhqhBJcSiEiIiIrIY9FkREJCsK7d1kSXkyjoEFERHJC4dCJMWhECIiIrIaBhZERCQrNatCLElSunnzJiIiIqBSqeDg4IDIyEiUlpaaLFNeXo5p06ahbdu2aNWqFcLCwlBYWKiTR6FQ6KWEhASdPKmpqejduzeUSiWeeOIJbNq0yez2M7AgIiJ5qdkgy5IkoYiICJw+fRrJycnYvXs3Dh06hKioKJNlZs2ahW+++QaJiYk4ePAgrly5gtGjR+vl27hxIwoKCsQUGhoqnsvNzcXIkSMxZMgQZGVlYebMmXjllVfw7bffmtV+zrEgIiJZacz7WGRnZyMpKQk//vgj+vTpAwBYtWoVRowYgaVLl8LNzU2vTHFxMdavX4/4+HgMHToUwN0AwtvbG0eOHEG/fv3EvA4ODlCr1QavHRcXh44dO2LZsmUAAG9vb/zwww9YsWIFgoOD63wP7LEgIiKqh5KSEp1UUVFhcZ3p6elwcHAQgwoACAoKgo2NDY4ePWqwTEZGBqqqqhAUFCQe8/LyQvv27ZGenq6Td9q0aWjXrh369u2LDRs2QLin9yU9PV2nDgAIDg7Wq6M2DCyIiEheBCskAO7u7rC3txdTbGysxU3TaDRwdnbWOda0aVM4OjpCo9EYLWNrawsHBwed4y4uLjplPvjgA2zfvh3JyckICwvDX//6V6xatUqnHhcXF706SkpK8Mcff9T5HjgUQkREsmKtoZD8/HyoVCrxuFKpNFpmzpw5WLx4scl6s7Oz69+oOnjvvffEf/fq1QtlZWVYsmQJXn/9dateh4EFERFRPahUKp3AwpQ33ngDkyZNMpnH09MTarUaV69e1Tl+584d3Lx50+jcCLVajcrKShQVFen0WhQWFhotAwD+/v5YuHAhKioqoFQqoVar9VaSFBYWQqVSoXnz5qZv8B4MLIiISF4a4LXpTk5OcHJyqjVfQEAAioqKkJGRAT8/PwDA/v37odVq4e/vb7CMn58fmjVrhpSUFISFhQEAcnJykJeXh4CAAKPXysrKQps2bcSeloCAAOzdu1cnT3Jyssk6DGFgQUREstKYV4V4e3sjJCQEU6dORVxcHKqqqhAdHY3x48eLK0IuX76MwMBAfPbZZ+jbty/s7e0RGRmJmJgYODo6QqVSYfr06QgICBBXhHzzzTcoLCxEv379YGdnh+TkZPz973/Hm2++KV77L3/5C1avXo23334bU6ZMwf79+7F9+3bs2bPHrHswe/LmoUOH8Pzzz8PNzQ0KhQK7du3SOT9p0iS9DThCQkJqrXfNmjXw8PCAnZ0d/P39cezYMXObRkRE9NDbunUrvLy8EBgYiBEjRmDAgAFYt26deL6qqgo5OTm4ffu2eGzFihV47rnnEBYWhoEDB0KtVmPnzp3i+WbNmmHNmjUICAiAr68vPvnkEyxfvhzz588X83Ts2BF79uxBcnIyfHx8sGzZMnz66admLTUF6tFjUVZWBh8fH0yZMsXg5hsAEBISgo0bN4qfTU1oAYBt27YhJiYGcXFx8Pf3x8qVKxEcHIycnBy92bFEREQWaeTvCnF0dER8fLzR8x4eHjrLRAHAzs4Oa9aswZo1awyWCQkJqdMf+YMHD8aJEyfMa/B9zA4shg8fjuHDh5vMUzMJpK6WL1+OqVOnYvLkyQDubtKxZ88ebNiwAXPmzDG3iUREREY15qGQR4Ek+1ikpqbC2dkZXbp0wWuvvYYbN24YzVtZWYmMjAydTTlsbGwQFBRkdFOOiooKvY1JiIiIqOFZPbAICQnBZ599hpSUFCxevBgHDx7E8OHDUV1dbTD/9evXUV1dbXBTDmObgcTGxupsSuLu7m7t2yAiokeVVrA8kVFWXxUyfvx48d89evRAz5490alTJ6SmpiIwMNAq15g7dy5iYmLEzyUlJQwuiIiobhr5HIuHneRbent6eqJdu3Y4d+6cwfPt2rVDkyZNDG7KYWyehlKpFDcmMWeDEiIiIgUsfG16Q99AIyd5YHHp0iXcuHEDrq6uBs/b2trCz88PKSkp4jGtVouUlBSzN+UgIiKihmV2YFFaWoqsrCxkZWUBuPv+9qysLOTl5aG0tBRvvfUWjhw5ggsXLiAlJQWjRo3CE088obMONjAwEKtXrxY/x8TE4N///jc2b96M7OxsvPbaaygrKxNXiRAREVlNzc6bliQyyuw5FsePH8eQIUPEzzVzHSZOnIi1a9fip59+wubNm1FUVAQ3NzcMGzYMCxcu1NnL4vz587h+/br4edy4cbh27RrmzZsHjUYDX19fJCUl6U3oJCIishSXm0rL7MBi8ODBehtz3Ovbb7+ttY4LFy7oHYuOjkZ0dLS5zSEiIqJGhO8KISIieeGqEEkxsCAiIllRCAIUFsyTsKSsHEi+KoSIiIjkgz0WREQkL9r/JUvKk1EMLIiISFY4FCItDoUQERGR1bDHgoiI5IWrQiTFwIKIiOTF0t0zORRiEgMLIiKSFe68KS3OsSAiIiKrYY8FERHJC4dCJMXAgoiIZEWhvZssKU/GcSiEiIiIrIY9FkREJC8cCpEUAwsiIpIX7mMhKQ6FEBERkdWwx4KIiGSF7wqRFgMLIiKSF86xkBSHQoiIiMhq2GNBRETyIgCwZC8KdliYxMCCiIhkhXMspMXAgoiI5EWAhXMsrNaSRxLnWBAREZHVsMeCiIjkhatCJMXAgoiI5EULQGFheTKKQyFERERkNQwsiIhIVmpWhViSpHTz5k1ERERApVLBwcEBkZGRKC0tNVmmvLwc06ZNQ9u2bdGqVSuEhYWhsLBQPL9p0yYoFAqD6erVqwCA1NRUg+c1Go1Z7edQCBERyUsjn2MRERGBgoICJCcno6qqCpMnT0ZUVBTi4+ONlpk1axb27NmDxMRE2NvbIzo6GqNHj8bhw4cBAOPGjUNISIhOmUmTJqG8vBzOzs46x3NycqBSqcTP95+vDQMLIiKiRiI7OxtJSUn48ccf0adPHwDAqlWrMGLECCxduhRubm56ZYqLi7F+/XrEx8dj6NChAICNGzfC29sbR44cQb9+/dC8eXM0b95cLHPt2jXs378f69ev16vP2dkZDg4O9b4HDoUQEZG81PRYWJIAlJSU6KSKigqLm5aeng4HBwcxqACAoKAg2NjY4OjRowbLZGRkoKqqCkFBQeIxLy8vtG/fHunp6QbLfPbZZ2jRogVeeuklvXO+vr5wdXXFs88+K/Z4mIOBBRERyYuVAgt3d3fY29uLKTY21uKmaTQavaGHpk2bwtHR0ehcB41GA1tbW71eBhcXF6Nl1q9fjz/96U86vRiurq6Ii4vDjh07sGPHDri7u2Pw4MHIzMw06x44FEJERFQP+fn5OnMRlEql0bxz5szB4sWLTdaXnZ1ttbaZkp6ejuzsbPznP//ROd6lSxd06dJF/Ny/f3+cP38eK1as0MtrCgMLIiKSFyvtY6FSqXQCC1PeeOMNTJo0yWQeT09PqNVqcZVGjTt37uDmzZtQq9UGy6nValRWVqKoqEin16KwsNBgmU8//RS+vr7w8/Ortd19+/bFDz/8UGu+ezGwICIiWWmIl5A5OTnBycmp1nwBAQEoKipCRkaG+MW/f/9+aLVa+Pv7Gyzj5+eHZs2aISUlBWFhYQDuruzIy8tDQECATt7S0lJs3769zsM2WVlZcHV1rVPeGgwsiIhIXhrxclNvb2+EhIRg6tSpiIuLQ1VVFaKjozF+/HhxRcjly5cRGBiIzz77DH379oW9vT0iIyMRExMDR0dHqFQqTJ8+HQEBAejXr59O/du2bcOdO3fw8ssv61175cqV6NixI7p164by8nJ8+umn2L9/P7777juz7sHsyZuHDh3C888/Dzc3NygUCuzatUvnvLENOJYsWWK0zgULFujl9/LyMrdpRERED72tW7fCy8sLgYGBGDFiBAYMGIB169aJ56uqqpCTk4Pbt2+Lx1asWIHnnnsOYWFhGDhwINRqNXbu3KlX9/r16zF69GiDy0krKyvxxhtvoEePHhg0aBBOnjyJffv2ITAw0Kz2m91jUVZWBh8fH0yZMgWjR4/WO19QUKDz+b///S8iIyPF7hljunXrhn379v1/w5qyM4WIiCSgFQCFBb0OWmk3yHJ0dDS5GZaHhweE+3pN7OzssGbNGqxZs8Zk3WlpaUbPvf3223j77bfNa6wBZn97Dx8+HMOHDzd6/v6JIl999RWGDBkCT09P0w1p2tToxBQiIiKracRDIY8CSfexKCwsxJ49exAZGVlr3rNnz8LNzQ2enp6IiIhAXl6e0bwVFRV6G5MQERFRw5M0sNi8eTNat25tcMjkXv7+/ti0aROSkpKwdu1a5Obm4plnnsGtW7cM5o+NjdXZlMTd3V2K5hMR0SPJ0s2x2GNhiqSBxYYNGxAREQE7OzuT+YYPH44xY8agZ8+eCA4Oxt69e1FUVITt27cbzD937lwUFxeLKT8/X4rmExHRo8hKO2+SYZLNkPz++++Rk5ODbdu2mV3WwcEBTz75JM6dO2fwvFKpNLnDGRERETUMyXos1q9fDz8/P/j4+JhdtrS0FOfPnzd7Uw4iIqJaaQXLExlldmBRWlqKrKwsZGVlAQByc3ORlZWlM9mypKQEiYmJeOWVVwzWERgYiNWrV4uf33zzTRw8eBAXLlxAWloaXnzxRTRp0gTh4eHmNo+IiMg0QWt5IqPMHgo5fvw4hgwZIn6OiYkBAEycOBGbNm0CACQkJEAQBKOBwfnz53H9+nXx86VLlxAeHo4bN27AyckJAwYMwJEjR+q0/SkRERE1HmYHFoMHD9bbmON+UVFRiIqKMnr+woULOp8TEhLMbQYREVH9cB8LSXF7SyIikhethUtGOcfCJAYWREQkL+yxkJSk+1gQERGRvLDHgoiI5EWAhT0WVmvJI4mBBRERyQuHQiTFoRAiIiKyGvZYEBGRvGi1ACzY5ErLDbJMYWBBRETywqEQSXEohIiIiKyGPRZERCQv7LGQFAMLIiKSF+68KSkOhRAREZHVsMeCiIhkRRC0ECx49bklZeWAgQUREcmLIFg2nME5FiYxsCAiInkRLJxjwcDCJM6xICIiIqthjwUREcmLVgsoLJgnwTkWJjGwICIieeFQiKQ4FEJERERWwx4LIiKSFUGrhWDBUAiXm5rGwIKIiOSFQyGS4lAIERERWQ17LIiISF60AqBgj4VUGFgQEZG8CAIAS5abMrAwhUMhREREZDXssSAiIlkRtAIEC4ZCBPZYmMQeCyIikhdBa3mS0M2bNxEREQGVSgUHBwdERkaitLTUZJl169Zh8ODBUKlUUCgUKCoqqle9P/30E5555hnY2dnB3d0d//jHP8xuPwMLIiKSFUErWJykFBERgdOnTyM5ORm7d+/GoUOHEBUVZbLM7du3ERISgnfeeafe9ZaUlGDYsGHo0KEDMjIysGTJEixYsADr1q0zq/0cCiEiImoksrOzkZSUhB9//BF9+vQBAKxatQojRozA0qVL4ebmZrDczJkzAQCpqan1rnfr1q2orKzEhg0bYGtri27duiErKwvLly+vNbC51yMRWNSMd2nLyxu4JUREVB81//v9IOYv3BEqLBrOuIMqAHf/wr+XUqmEUqm0qG3p6elwcHAQv/wBICgoCDY2Njh69ChefPFFyepNT0/HwIEDYWtrK+YJDg7G4sWL8fvvv6NNmzZ1utYjEVjcunULAHBpwYcN3BIiIrLErVu3YG9vL0ndtra2UKvV+EGz1+K6WrVqBXd3d51j8+fPx4IFCyyqV6PRwNnZWedY06ZN4ejoCI1GI2m9Go0GHTt21Mnj4uIinpNVYOHm5ob8/Hy0bt0aCoXCaL6SkhK4u7sjPz8fKpXqAbbQMmz3g/Wwtht4eNvOdj9YjbHdgiDg1q1bRrv6rcHOzg65ubmorKy0uC5BEPS+b0z1VsyZMweLFy82WWd2drbF7WoMHonAwsbGBo8//nid86tUqkbzy2QOtvvBeljbDTy8bWe7H6zG1m6peiruZWdnBzs7O8mvc7833ngDkyZNMpnH09MTarUaV69e1Tl+584d3Lx5E2q1ut7Xr0u9arUahYWFOnlqPptz7UcisCAiImrMnJyc4OTkVGu+gIAAFBUVISMjA35+fgCA/fv3Q6vVwt/fv97Xr0u9AQEB+Nvf/oaqqio0a9YMAJCcnIwuXbrUeRgE4HJTIiKiRsPb2xshISGYOnUqjh07hsOHDyM6Ohrjx48Xh4kuX74MLy8vHDt2TCyn0WiQlZWFc+fOAQB+/vlnZGVl4ebNm3Wu909/+hNsbW0RGRmJ06dPY9u2bfj4448RExNj3k0IMlJeXi7Mnz9fKC8vb+immIXtfrAe1nYLwsPbdrb7wXpY2y0XN27cEMLDw4VWrVoJKpVKmDx5snDr1i3xfG5urgBAOHDggHhs/vz5Ne+C10kbN26sc72CIAgnT54UBgwYICiVSuGxxx4TFi1aZHb7FYLAvUmJiIjIOjgUQkRERFbDwIKIiIishoEFERERWQ0DCyIiIrIaBhZERERkNY9cYLFmzRp4eHjAzs4O/v7+Out8DUlMTISXlxfs7OzQo0cP7N1r+R7y5oiNjcVTTz2F1q1bw9nZGaGhocjJyTFZZtOmTVAoFDrpQe8kt2DBAr02eHl5mSzT0M8aADw8PPTarVAoMG3aNIP5G/JZHzp0CM8//zzc3NygUCiwa9cunfOCIGDevHlwdXVF8+bNERQUhLNnz9Zar7m/I9Zsd1VVFWbPno0ePXqgZcuWcHNzw4QJE3DlyhWTddbn582a7QaASZMm6bUhJCSk1nob8nkDMPjzrlAosGTJEqN1PojnTY+uRyqw2LZtG2JiYjB//nxkZmbCx8cHwcHBetuY1khLS0N4eDgiIyNx4sQJhIaGIjQ0FKdOnXpgbT548CCmTZuGI0eOIDk5GVVVVRg2bBjKyspMllOpVCgoKBDTxYsXH1CL/1+3bt102vDDDz8YzdsYnjUA/PjjjzptTk5OBgCMGTPGaJmGetZlZWXw8fHBmjVrDJ7/xz/+gX/+85+Ii4vD0aNH0bJlSwQHB6PcxFt+zf0dsXa7b9++jczMTLz33nvIzMzEzp07kZOTgxdeeKHWes35ebN2u2uEhITotOHzzz83WWdDP28AOu0tKCjAhg0boFAoEBYWZrJeqZ83PcLM3vmiEevbt68wbdo08XN1dbXg5uYmxMbGGsw/duxYYeTIkTrH/P39hVdffVXSdppy9epVAYBw8OBBo3k2btwo2NvbP7hGGTB//nzBx8enzvkb47MWBEGYMWOG0KlTJ0Gr1Ro83xietSAIAgDhyy+/FD9rtVpBrVYLS5YsEY8VFRUJSqVS+Pzzz43WY+7viLXbbcixY8cEAMLFixeN5jH3581Shto9ceJEYdSoUWbV0xif96hRo4ShQ4eazPOgnzc9Wh6ZHovKykpkZGQgKChIPGZjY4OgoCCkp6cbLJOenq6TH7j77nlj+R+E4uJiAICjo6PJfKWlpejQoQPc3d0xatQonD59+kE0T8fZs2fh5uYGT09PREREIC8vz2jexvisKysrsWXLFkyZMsXkW3Ebw7O+X25uLjQajc4ztbe3h7+/v9FnWp/fkQehuLgYCoUCDg4OJvOZ8/MmldTUVDg7O6NLly547bXXcOPGDaN5G+PzLiwsxJ49exAZGVlr3sbwvOnh9MgEFtevX0d1dbX47vgaLi4uRt9hr9FozMovNa1Wi5kzZ+Lpp59G9+7djebr0qULNmzYgK+++gpbtmyBVqtF//79cenSpQfWVn9/f2zatAlJSUlYu3YtcnNz8cwzz+DWrVsG8ze2Zw0Au3btQlFRkck3DjaGZ21IzXMz55nW53dEauXl5Zg9ezbCw8NNvmXT3J83KYSEhOCzzz5DSkoKFi9ejIMHD2L48OGorq42mL8xPu/NmzejdevWGD16tMl8jeF508OLbzdtRKZNm4ZTp07VOpYZEBCAgIAA8XP//v3h7e2NTz75BAsXLpS6mQCA4cOHi//u2bMn/P390aFDB2zfvr1Ofw01BuvXr8fw4cPFF/AY0hie9aOqqqoKY8eOhSAIWLt2rcm8jeHnbfz48eK/e/TogZ49e6JTp05ITU1FYGDgA2mDpTZs2ICIiIhaJyA3hudND69HpseiXbt2aNKkicF3yRt7j7yxd89b8s77+oqOjsbu3btx4MABPP7442aVbdasGXr16iW+1a4hODg44MknnzTahsb0rAHg4sWL2LdvH1555RWzyjWGZw1AfG7mPNP6/I5IpSaouHjxIpKTk032VhhS28/bg+Dp6Yl27doZbUNjet4A8P333yMnJ8fsn3mgcTxveng8MoGFra0t/Pz8kJKSIh7TarVISUnR+YvzXgEBATr5gbvvnjeWXwqCICA6Ohpffvkl9u/fj44dO5pdR3V1NX7++We4urpK0MK6KS0txfnz5422oTE863tt3LgRzs7OGDlypFnlGsOzBoCOHTtCrVbrPNOSkhIcPXrU6DOtz++IFGqCirNnz2Lfvn1o27at2XXU9vP2IFy6dAk3btww2obG8rxrrF+/Hn5+fvDx8TG7bGN43vQQaejZo9aUkJAgKJVKYdOmTcIvv/wiREVFCQ4ODoJGoxEEQRD+/Oc/C3PmzBHzHz58WGjatKmwdOlSITs7W5g/f77QrFkz4eeff35gbX7ttdcEe3t7ITU1VSgoKBDT7du3xTz3t/v9998Xvv32W+H8+fNCRkaGMH78eMHOzk44ffr0A2v3G2+8IaSmpgq5ubnC4cOHhaCgIKFdu3bC1atXDba5MTzrGtXV1UL79u2F2bNn651rTM/61q1bwokTJ4QTJ04IAITly5cLJ06cEFdPLFq0SHBwcBC++uor4aeffhJGjRoldOzYUfjjjz/EOoYOHSqsWrVK/Fzb74jU7a6srBReeOEF4fHHHxeysrJ0fuYrKiqMtru2nzep233r1i3hzTffFNLT04Xc3Fxh3759Qu/evYXOnTvrvHq8sT3vGsXFxUKLFi2EtWvXGqyjIZ43PboeqcBCEARh1apVQvv27QVbW1uhb9++wpEjR8RzgwYNEiZOnKiTf/v27cKTTz4p2NraCt26dRP27NnzQNsLwGDauHGj0XbPnDlTvEcXFxdhxIgRQmZm5gNt97hx4wRXV1fB1tZWeOyxx4Rx48YJ586dM9pmQWj4Z13j22+/FQAIOTk5euca07M+cOCAwZ+NmvZptVrhvffeE1xcXASlUikEBgbq3VOHDh2E+fPn6xwz9Tsidbtzc3ON/swfOHDAaLtr+3mTut23b98Whg0bJjg5OQnNmjUTOnToIEydOlUvQGhsz7vGJ598IjRv3lwoKioyWEdDPG96dCkEQRAk7RIhIiIi2Xhk5lgQERFRw2NgQURERFbDwIKIiIishoEFERERWQ0DCyIiIrIaBhZERERkNQwsiIiIyGoYWBAREZHVMLAgIiIiq2FgQURERFbDwIKIiIis5v8ApIdOua5B/+4AAAAASUVORK5CYII=\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf4AAAI1CAYAAAA3qJjPAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsvXmYXVWZNb7OcKeaU5WhEjISgiEgDQYIEUTEYEQaGaKAn0oIqC0GFJDWX1oZRCConw1KMzh9ARFUIpMDc0DtViQyNgiGoEAGMlVS8607nv37o1J3r3fXvUUqZKik3vU896lT5+69z573PeudPGOMgUKhUCgUimEBf3dXQKFQKBQKxa6DHvwKhUKhUAwj6MGvUCgUCsUwgh78CoVCoVAMI+jBr1AoFArFMIIe/AqFQqFQDCPowa9QKBQKxTCCHvwKhUKhUAwj6MGvUCgUCsUwgh78exHOPvtsTJ48Wdzr6urCZz7zGTQ3N8PzPFx44YW7pW67Em+88QY8z8Ott9662+rwkY98BJ/97GdL///+97+H53n4/e9/v9vqxPA8D1dcccXursYOxe23347p06cjFouhoaEBAHDsscfi2GOP3a312lPgeR7OP//83V2NfnjooYdQU1ODTZs27e6q7DXQg3834sUXX8THPvYxTJo0CclkEvvssw+OP/543HDDDTvsGddccw1uvfVWnHfeebj99tvx6U9/+m3zfOUrX4HneTjjjDPKfv/nP/8ZV1xxBdra2so+77777nuHtd423Hnnnbj++ut3ybMGgz/96U945JFH8NWvfnWXPfOmm27arT90djf+/ve/4+yzz8bUqVPxox/9CD/84Q93ynMeeOCBQf9giqIIN998Mw455BCkUik0NTXhuOOOwwsvvFAxzx133AHP81BTU7PT6rWn4MMf/jD2228/LF68eHdXZe+BUewW/OlPfzLxeNzst99+5pvf/Kb50Y9+ZC677DLzoQ99yEydOnW7ypw/f76ZNGmSuDdr1ixz1FFHbXMZURSZ8ePHm8mTJ5tUKmU6Ojr6pfnOd75jAJjXX3+933fV1dVm/vz5g6z59uHEE0/s115jetvQ09NjCoXCLqmHi5NPPtl86EMfEveeeOIJA8A88cQTO+WZBx54oHn/+9+/zekBmMsvv3yn1GV34OabbzYAzMqVK8X9bDZrstnsDnvOwoULzWC3zfnz55swDM0555xjfvSjH5nrr7/ezJ8/3zzyyCNl03d2dppx48aZ6upqU11dvdPq5QKAWbhw4TsqY2fhpptuMlVVVWX3I8XgEe7G3xzDGldffTXq6+vx17/+tURL9mHjxo077DkbN27EjBkztjn973//e6xZswaPP/445s6di3vuuQfz58/fYfXZFfA8D8lkcrc8e+PGjfjd736HW265Zbc8f29AJpNBPB6H7287Idm3Zty1FI/Hd8rzthV33XUXbrvtNtxzzz049dRTtynPVVddhdraWnzgAx/YZezZUMe8efNwwQUXYOnSpTjnnHN2d3X2fOzuXx7DFe9617vMscceu83pb7/9dvOe97zHJJNJM2LECHPGGWeYVatWiTT8xt/3hul+yr2lM84991wzY8YMY4wxJ5xwgjn++OPF95dffnnFcsvd57f/NWvWmAULFpjRo0ebeDxuZsyYYX7yk5+I8vvq/ctf/tJcddVVZp999jGJRMIcd9xx4m3u/e9/f79n9bW9ry5LliwRZS9btswcffTRpqqqytTX15uPfvSj5uWXXy7bvpUrV5r58+eb+vp6U1dXZ84++2zT3d09YN8ZY8z/+3//zwAwb7zxRtl28Rv/H//4R/Oxj33MTJgwwcTjcTN+/Hhz4YUXmnQ6LfKuW7fOnH322WafffYx8XjcNDc3m49+9KOlsZw0aVK/vni7t384b/xvvPGGOe+888z+++9vksmkaWxsNB/72MfEfPnHP/5hAJj//M//7Ffen/70JwPA3HnnnaV7gxnvn//85+ZrX/uaGTdunPE8z7S2tg5Yf0a59ve17f3vf7/oi4Gel8vlzBVXXGH2228/k0gkTGNjoznqqKNKb+bz588vO8cHwqxZs8wRRxxhjDGmWCyarq6uAdO/+uqrJh6Pm9/97ndm/vz52/TG/3b16urqMhdffLEZP368icfjZv/99zff+c53TBRFohyUeeP/5je/aTzPM9///vdL9x544IHSOqqpqTEf+chHzEsvvdSvTtXV1WbNmjXm5JNPNtXV1WbkyJHmy1/+cj8m7uc//7l5z3veY2pqakxtba056KCDzPXXX9+vnYceeqj56Ec/+rb9oXh76Bv/bsKkSZPw5JNP4qWXXsJBBx00YNqrr74al156KU4//XR85jOfwaZNm3DDDTfgmGOOwXPPPdfvLQcADjjgANx+++246KKLMH78eHz5y18GAIwaNaric7LZLO6+++5S2k984hNYsGAB1q9fj+bmZgDAaaedhldffRU///nPcd1112HkyJGlcm+//XZ85jOfwRFHHIHPfe5zAICpU6cCADZs2IAjjzyypEA0atQoPPjggzj33HPR0dHRT+nw2muvhe/7uOSSS9De3o5vf/vb+OQnP4mnnnoKAPC1r30N7e3tWLNmDa677joAGFAe+thjj+GEE07AvvvuiyuuuAI9PT244YYbcNRRR+HZZ5/tpxR5+umnY8qUKVi8eDGeffZZ/PjHP8bo0aPxrW99q+IzgF79h6amJkyaNGnAdACwdOlSpNNpnHfeeWhqasLy5ctxww03YM2aNVi6dGkp3bx58/C3v/0NF1xwASZPnoyNGzfi0UcfxapVqzB58mRcf/31uOCCC1BTU4Ovfe1rAIAxY8a87fMZf/3rX/HnP/8ZZ555JsaPH4833ngDN998M4499li8/PLLqKqqwr777oujjjoKd9xxBy666CKR/4477kBtbS1OPvlkAIMf729+85uIx+O45JJLkM1mt+lNvQ/XX389fvrTn+Lee+/FzTffjJqaGhx88MED5in3vCuuuAKLFy8uzeGOjg48/fTTePbZZ3H88cfj3/7t3/DWW2/h0Ucfxe233/629ero6MDy5cvxhS98Af/xH/+BG264AV1dXZgyZQquvfZanH766f3yXHjhhfjABz6Aj3zkI7jrrru2qf0D1csYg49+9KN44okncO655+KQQw7Bww8/jH//93/H2rVrS2unHL7+9a/jmmuuwQ9+8IOSourtt9+O+fPnY+7cufjWt76FdDqNm2++GUcffTSee+45sY6KxSLmzp2LWbNm4f/+3/+Lxx57DN/97ncxdepUnHfeeQCARx99FJ/4xCfwwQ9+sLS2XnnlFfzpT3/Cl770JVGfmTNnKgOyo7C7f3kMVzzyyCMmCAITBIGZPXu2+cpXvmIefvhhk8vlRLo33njDBEFgrr76anH/xRdfNGEYivvlZPyTJk0yJ5544jbV6Ve/+pWQk3Z0dJhkMmmuu+46kW57ZPznnnuuGTt2rGlpaRH3zzzzTFNfX196y+17IzvggAOEbPZ73/ueAWBefPHF0r1KMv5yb/yHHHKIGT16tNm8eXPp3gsvvGB83zdnnXVW6V7fG/8555wjyjz11FNNU1NTv2e5OProo83MmTP73S/3xu++2RtjzOLFi43neebNN980xhjT2tpqAJjvfOc7Az73ncr4y9XlySefNADMT3/609K9H/zgBwaAeeWVV0r3crmcGTlypBj3wY73vvvuW7YO24q+cdu0aZO4X+mNv9zz/uVf/uVt18pgZOnPPvusAWCamprMmDFjzE033WTuuOMOc8QRRxjP88yDDz4o0v/2t781YRiav/3tb8YYs81v/APV67777jMAzFVXXSXuf+xjHzOe55nXXnutdA/0xv/lL3/Z+L5vbr311tL3nZ2dpqGhwXz2s58VZa1fv97U19eL+30sxJVXXinSHnrooWJ9fOlLXzJ1dXXbpI9zzTXXGABmw4YNb5tWMTBUq3834fjjj8eTTz6Jj370o3jhhRfw7W9/G3PnzsU+++yDX//616V099xzD6Iowumnn46WlpbSp7m5GdOmTcMTTzyxw+p0xx134LDDDsN+++0HAKitrcWJJ56IO+644x2Va4zB3XffjZNOOgnGGNGOuXPnor29Hc8++6zIs2DBAvHW9773vQ8A8M9//nPQz1+3bh2ef/55nH322WhsbCzdP/jgg3H88cfjgQce6Jfn85//vPj/fe97HzZv3oyOjo4Bn7V582aMGDFim+qVSqVK193d3WhpacF73/teGGPw3HPPldLE43H8/ve/R2tr6zaVuz3guuTzeWzevBn77bcfGhoaxNicfvrpSCaTYk48/PDDaGlpwac+9SkA2zfe8+fPF3XY2Sj3vIaGBvztb3/DypUrd8gzurq6APTOifvvvx/nnXce/s//+T9YtmwZmpqacNVVV5XS5nI5XHTRRfj85z8/KJ2ct8MDDzyAIAjwxS9+Udz/8pe/DGMMHnzwQXHfGIPzzz8f3/ve9/Czn/1M6Pc8+uijaGtrwyc+8QkxpkEQYNasWWX3onLriNdwQ0MDuru78eijj75tW/rWVUtLy9s3XDEg9ODfjTj88MNxzz33oLW1FcuXL8eiRYvQ2dmJj33sY3j55ZcBACtXroQxBtOmTcOoUaPE55VXXhm0IuCmTZuwfv360qdvc2pra8MDDzyA97///XjttddKn6OOOgpPP/00Xn311e1u56ZNm9DW1oYf/vCH/dqwYMECAP0VGidOnCj+71v023P4vfnmmwCAd73rXf2+O+CAA9DS0oLu7u4d9nxjzDbVa9WqVaUfIzU1NRg1ahTe//73AwDa29sBAIlEAt/61rfw4IMPYsyYMTjmmGPw7W9/G+vXr9+mZ2wrenp6cNlll2HChAlIJBIYOXIkRo0ahba2tlJdgN6N+qSTTsKdd95ZunfHHXdgn332wXHHHQdg+8Z7ypQpO7Q9b4dyz7vyyivR1taG/fffH+9+97vx7//+7/jf//3f7X5G3w+LKVOmYNasWaX7NTU1OOmkk7B8+XIUCgUAwHXXXYeWlhZ84xvf2O7nlcObb76JcePGoba2Vtw/4IADSt8zfvrTn+LGG2/EDTfcgE984hPiu74fRMcdd1y/cX3kkUf6jWkymewnWhwxYoRYQ1/4whew//7744QTTsD48eNxzjnn4KGHHirblr515XnetjZfUQEq4x8CiMfjOPzww3H44Ydj//33x4IFC7B06VJcfvnliKIInufhwQcfRBAE/fJuq51vHw4//HCx2C+//HJcccUVWLp0KbLZLL773e/iu9/9br98d9xxx3ZvSlEUAQA+9alPVbQQcGWy5doKbPuh+k6xvc9vamraph8HxWIRxx9/PLZs2YKvfvWrmD59Oqqrq7F27VqcffbZpT4DeuW+J510Eu677z48/PDDuPTSS7F48WI8/vjjOPTQQwfXsAq44IILsGTJElx44YWYPXs26uvr4XkezjzzTFEXADjrrLOwdOlS/PnPf8a73/1u/PrXv8YXvvCFklb89oz3rnzbr/S8Y445Bv/4xz9w//3345FHHsGPf/xjXHfddbjlllvwmc98ZtDPGDduHIDy+hajR49GPp8v/eC86qqr8IUvfAEdHR0lVqmrqwvGGLzxxhuoqqrC6NGjB12HweKoo47C888/j//6r//C6aefLhiyvnG9/fbbSzo/jDCUx0mlNcQYPXo0nn/+eTz88MN48MEH8eCDD2LJkiU466yzcNttt4m0feuqT69Isf3Qg3+I4bDDDgPQS08DvcpxxhhMmTIF+++//zsu/4477kBPT0/p/3333bd0/6CDDsLll1/eL88PfvAD3HnnnaWDf6Bf3OW+GzVqFGpra1EsFjFnzpx32oQBn1UOfYp2K1as6Pfd3//+d4wcORLV1dU7pE7Tp0/H3Xff/bbpXnzxRbz66qu47bbbcNZZZ5XuV6I8p06dii9/+cv48pe/jJUrV+KQQw7Bd7/7XfzsZz8D8M7fgn71q19h/vz54kdfJpMp66Tpwx/+MEaNGoU77rgDs2bNQjqdFo6hdtZ47wo0NjZiwYIFWLBgAbq6unDMMcfgiiuuKB38g+nncePGobm5GWvXru333VtvvYVkMona2lqsWrUKXV1d+Pa3v41vf/vb/dJOmTIFJ5988oCKbZXqNWnSJDz22GPo7OwUb/1///vfS98z9ttvP3z729/Gscceiw9/+MNYtmxZKV+fou7o0aN36LjG43GcdNJJOOmkkxBFEb7whS/gBz/4AS699NKS2BEAXn/99RITpXhnUKp/N+GJJ54o+/bYJ2/uo6VPO+00BEGAb3zjG/3SG2OwefPmQT33qKOOwpw5c0qffffdF6tXr8Yf//hHnH766fjYxz7W77NgwQK89tprJY36vkOy3KFQXV3d734QBJg3bx7uvvtuvPTSS/3ybK8rzurqakFDV8LYsWNxyCGH4LbbbhN1e+mll/DII4/gIx/5yHY9vxxmz56N1tbWt9VF6Hsb4jE1xuB73/ueSJdOp5HJZMS9qVOnora2FtlstnSvXL8PBkEQ9JtfN9xwA4rFYr+0YRjiE5/4BO666y7ceuutePe73y3e4HfWeO9suGuppqYG++23X79+BsrP/XI444wzsHr1avGDrqWlBffffz+OO+44+L6P0aNH49577+33+cAHPoBkMol7770XixYtGvA5ler1kY98BMViEf/1X/8l7l933XXwPA8nnHBCv7IOPvhgPPDAA3jllVdw0kknlV4U5s6di7q6OlxzzTXI5/P98m3PuLp97vt+aS5xvwPAM888g9mzZw/6GYr+0Df+3YQLLrgA6XQap556KqZPn45cLoc///nP+OUvf4nJkyeXZKFTp07FVVddhUWLFuGNN97AKaecgtraWrz++uu499578bnPfQ6XXHLJO6rLnXfeWTL7KYePfOQjCMOw9IY3c+ZMAL0mdWeeeSZisRhOOukkVFdXY+bMmXjsscfwn//5nxg3blxJvnnttdfiiSeewKxZs/DZz34WM2bMwJYtW/Dss8/isccew5YtWwZd75kzZ+KXv/wlLr74Yhx++OEl2Wk5fOc738EJJ5yA2bNn49xzzy2Z89XX1+9QV6cnnngiwjDEY489VjJpLIfp06dj6tSpuOSSS7B27VrU1dXh7rvv7icmePXVV/HBD34Qp59+OmbMmIEwDHHvvfdiw4YNOPPMM0vpZs6ciZtvvhlXXXUV9ttvP4wePbokc98W/Ou//ituv/121NfXY8aMGXjyySfx2GOPoampqWz6s846C9///vfxxBNPlDVx3FHj3Wce9sYbb2xzW7YXM2bMwLHHHouZM2eisbERTz/9NH71q18J//V9c/+LX/wi5s6diyAIxDi4WLRoEe666y7MmzcPF198Merr63HLLbcgn8/jmmuuAQBUVVXhlFNO6Zf3vvvuw/Lly8t+56JSvU466SR84AMfwNe+9jW88cYb+Jd/+Rc88sgjuP/++3HhhReW3uJdHHnkkbj//vvxkY98BB/72Mdw3333oa6uDjfffDM+/elP4z3veQ/OPPNMjBo1CqtWrcLvfvc7HHXUUf1+YLwdPvOZz2DLli047rjjMH78eLz55pu44YYbcMghh5T0EIBenZD//d//xcKFCwdVvqICdqkNgaKEBx980Jxzzjlm+vTppqampuS+94ILLihrrnL33Xebo48+uuTGc/r06WbhwoVmxYoVpTTba8737ne/20ycOHHANMcee6wZPXq0yefzxphexx777LOP8X1fmPb9/e9/N8ccc4xJpVL9HPhs2LDBLFy40EyYMMHEYjHT3NxsPvjBD5of/vCHpTR95lZLly4Vzy9notfV1WX+z//5P6ahoWGbHPg89thj5qijjjKpVMrU1dWZk046qaIDH9csbMmSJdvkAMkYYz760Y+aD37wg+JeOXO+l19+2cyZM8fU1NSYkSNHms9+9rPmhRdeEHVvaWkxCxcuNNOnTzfV1dWmvr7ezJo1y9x1112i/PXr15sTTzzR1NbWbpcDn9bWVrNgwQIzcuRIU1NTY+bOnWv+/ve/m0mTJlV0wXzggQca3/fNmjVryn7/Tsa7DyNHjjRHHnnkgG0xZvDmfOWed9VVV5kjjjjCNDQ0mFQqZaZPn26uvvpqYWJbKBTMBRdcYEaNGmU8z9sm075//OMf5tRTTzV1dXUmlUqZ4447zixfvvxt8w3GnG+genV2dpqLLrrIjBs3zsRiMTNt2rRtduBz//33mzAMzRlnnGGKxaIxprcP586da+rr600ymTRTp041Z599tnn66afftu5949SHX/3qV+ZDH/pQycnTxIkTzb/927+ZdevWiXw333yzuuzdgfCM2UXaUgrFMMF///d/49hjj8Xf//53TJs2bXdXZ6fh0EMPRWNjI5YtW7ZTyn/55Zdx4IEH4re//S1OPPHEnfIMxZ6BQw89FMcee+yADocU2w6V8SsUOxjve9/78KEPfaisotbegqeffhrPP/+8UEzc0XjiiScwe/ZsPfSHOR566CGsXLnybfUcFNsOfeNXKBTbjJdeegnPPPMMvvvd76KlpQX//Oc/d1tAJIVCsX3QN36FQrHN+NWvfoUFCxYgn8/j5z//uR76CsUeCH3jVygUCoViGEHf+BUKhUKhGEbQg1+hUCgUimEEPfgVCoVCoRhG0INfoVAoFIphBD34FQqFQqEYRtCDX6FQKBSKYQQ9+BUKhUKhGEbQg1+hUCgUimEEPfgVCoVCoRhG0INfoVAoFIphBD34FQqFQqEYRtCDX6FQKBSKYQQ9+BUKhUKhGEbQg1+hUCgUimEEPfgVCoVCoRhG0INfoVAoFIphBD34FQqFQqEYRtCDX6FQKBSKYQQ9+BUKhUKhGEbQg38vwhVXXAHP89DS0rK7q1LC2WefjcmTJ+/uaigUeyV0zSu2B3rwK4YMXnnlFXz4wx9GTU0NGhsb8elPfxqbNm3a3dVSKBQ7AcuXL8cXvvAFzJw5E7FYDJ7n7e4qDRvowa8YElizZg2OOeYYvPbaa7jmmmtwySWX4He/+x2OP/545HK53V09hUKxg/HAAw/gxz/+MTzPw7777ru7qzOsoAe/YkjgmmuuQXd3Nx5//HF88YtfxH/8x3/grrvuwgsvvIBbb711d1dPoVDsYJx33nlob2/H008/jeOPP353V2dYQQ/+vRBtbW04++yz0dDQgPr6eixYsADpdLpfup/97GeYOXMmUqkUGhsbceaZZ2L16tUizX//93/j4x//OCZOnIhEIoEJEybgoosuQk9PT7/y7rvvPhx00EFIJpM46KCDcO+9925zne+++27867/+KyZOnFi6N2fOHOy///646667BtF6hWL4YU9c82PGjEEqlRp8YxXvGOHuroBix+P000/HlClTsHjxYjz77LP48Y9/jNGjR+Nb3/pWKc3VV1+NSy+9FKeffjo+85nPYNOmTbjhhhtwzDHH4LnnnkNDQwMAYOnSpUin0zjvvPPQ1NSE5cuX44YbbsCaNWuwdOnSUnmPPPII5s2bhxkzZmDx4sXYvHkzFixYgPHjx79tfdeuXYuNGzfisMMO6/fdEUccgQceeOCdd4pCsRdjT1vzit0Mo9hrcPnllxsA5pxzzhH3Tz31VNPU1FT6/4033jBBEJirr75apHvxxRdNGIbifjqd7vecxYsXG8/zzJtvvlm6d8ghh5ixY8eatra20r1HHnnEADCTJk0asN5//etfDQDz05/+tN93//7v/24AmEwmM2AZCsVwxJ665l0sXLjQ6HG066BU/16Iz3/+8+L/973vfdi8eTM6OjoAAPfccw+iKMLpp5+OlpaW0qe5uRnTpk3DE088UcrLVFx3dzdaWlrw3ve+F8YYPPfccwCAdevW4fnnn8f8+fNRX19fSn/88cdjxowZb1vfPgoxkUj0+y6ZTIo0CoWiP/a0Na/YvVCqfy8Ey8kBYMSIEQCA1tZW1NXVYeXKlTDGYNq0aWXzx2Kx0vWqVatw2WWX4de//jVaW1tFuvb2dgDAm2++CQBly3vXu96FZ599dsD69m002Wy233eZTEakUSgU/bGnrXnF7oUe/HshgiAoe98YAwCIogie5+HBBx8sm7ampgYAUCwWcfzxx2PLli346le/iunTp6O6uhpr167F2WefjSiKdkh9x44dC6D3LcLFunXr0NjYWJYNUCgUvdjT1rxi90IP/mGIqVOnwhiDKVOmYP/996+Y7sUXX8Srr76K2267DWeddVbp/qOPPirSTZo0CQCwcuXKfmWsWLHibeuzzz77YNSoUXj66af7fbd8+XIccsghb1uGQqGojKG25hW7FyrjH4Y47bTTEAQBvvGNb5TeCPpgjMHmzZsB2LcITmOMwfe+9z2RZ+zYsTjkkENw2223lahAoHezePnll7epTvPmzcNvf/tbYVq0bNkyvPrqq/j4xz8+uAYqFAqBobjmFbsP+sY/DDF16lRcddVVWLRoEd544w2ccsopqK2txeuvv457770Xn/vc53DJJZdg+vTpmDp1Ki655BKsXbsWdXV1uPvuu/vJ/QBg8eLFOPHEE3H00UfjnHPOwZYtW3DDDTfgwAMPRFdX19vW6T/+4z+wdOlSfOADH8CXvvQldHV14Tvf+Q7e/e53Y8GCBTujGxSKYYOhuObffPNN3H777QBQYvuuuuoqAL2Mwqc//ekd2AMKgV1vSKDYWegz7dm0aZO4v2TJEgPAvP766+L+3XffbY4++mhTXV1tqqurzfTp083ChQvNihUrSmlefvll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/es499xzcd555w0qr0IxHLEnr/kPfOADAIATTjgBJ598Mg466CDU1NTg/PPP3+YyFIODHvx7IYIgKHvfGAOg1x2q53l48MEHy6atqakBABSLRRx//PHYsmULvvrVr2L69Omorq7G2rVrcfbZZyOKoh1e90cffRRnnXUWTjzxRNxyyy07vHyFYm/EnrzmGVOnTsWhhx6KO+64Qw/+nQg9+Ichpk6dCmMMpkyZgv33379iuhdffBGvvvoqbrvtNpx11lml+48++qhI1+dPeuXKlf3KcP1PD4SnnnoKp556Kg477DDcddddCEOdngrFjsBQXfPl0NPTg2w2+47KUAwMlfEPQ5x22mkIggDf+MY3Sm8EfTDGYPPmzQDsWwSnMcbge9/7nsgzduxYHHLIIbjttttKVCDQu1m8/PLL21SnV155BSeeeCImT56M3/72t0LOqFAo3hmG2povFAr9xAgAsHz5crz44os47LDDtr1xikFDX6mGIaZOnYqrrroKixYtwhtvvIFTTjkFtbW1eP3113Hvvffic5/7HC655BJMnz4dU6dOxSWXXIK1a9eirq4Od999d9kFu3jxYpx44ok4+uijcc4552DLli244YYbcOCBB6Krq2vA+nR2dmLu3LlobW3Fv//7v+N3v/tdv/ruTZG4FIpdjaG25ru6ujBhwgScccYZOPDAA1FdXY0XX3wRS5YsQX19PS699NKd1RUKQM359iZU8tu9ZMkSA6CfD+y7777bHH300aa6utpUV1eb6dOnm4ULF4rADy+//LKZM2eOqampMSNHjjSf/exnzQsvvNAvoEhfeQcccIBJJBJmxowZ5p577tkmv92vv/56xaAlAMz8+fPfQa8oFHsv9tQ1n81mzZe+9CVz8MEHm7q6OhOLxcykSZPMueeeq776dwE8YxzeR6FQKBQKxV4LlfErFAqFQjGMoAe/QqFQKBTDCHrwKxQKhUIxjKAHv0KhUCgUwwg77eC/8cYbMXnyZCSTScyaNQvLly/fWY9SKBRDALrmFYo9AztFq/+Xv/wlzjrrLNxyyy2YNWsWrr/+eixduhQrVqzA6NGjB8wbRRHeeust1NbWwvO8HV01hWJYwBiDzs5OjBs3Dr6/84m9d7LmAV33CsWOwDav+51hI3jEEUeYhQsXlv4vFotm3LhxZvHixW+bd/Xq1QPadOtHP/rZ9s/q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bzbveMc7LmGrLxyefvpp8/rXv95cf/315lOf+tTg9Unog1OnTpmrr77a/OZv/qZ56qmnzIsvvmgee+wx88ILLwz2uffee029Xjff+MY3zN/8zd+YX/mVXzHbt283nU7nErb8tWHS5r3O+WHovL94837sHvxvf/vbzZ49ewZ/p2lqtmzZYvbu3XsJW3VxcezYMUNE5vHHHzfGGLO0tGSCIDCPPPLIYJ+///u/N0RknnjiiUvVzAuCZrNprrnmGvOd73zH/It/8S8GC8Ck9MHv/M7vmHe+852572dZZubn581//a//dfDa0tKSiaLI/O///b8vRhMvCCZ93k/ynDdG5/3FnvdjFerv9/t04MAB2rVr1+A113Vp165d9MQTT1zCll1cLC8vExHRzMwMEREdOHCA4jhm/bJjxw7atm3bFdcve/bsoV/+5V9m10o0OX3wzW9+k2688Ub6tV/7Ndq0aRO95S1voa985SuD91966SVaWFhg/VCv1+mmm266bPtB5/1kz3kinfcXe96P1YP/xIkTlKYpzc3Nsdfn5uZoYWHhErXq4iLLMrrjjjvolltuoeuuu46IiBYWFigMQ5qammL7Xmn98vDDD9Nf/dVf0d69e4fem5Q+ePHFF+n++++na665hh577DH6xCc+Qb/1W79FX/va14iIBtd6Jc2RSZ/3kzzniXTeE138eT92tryTjj179tBzzz1HP/jBDy51Uy4qDh8+TJ/61KfoO9/5DhUKhUvdnEuGLMvoxhtvpM997nNERPSWt7yFnnvuOfrSl75EH/nIRy5x6xQXApM654l03p/FxZ73Y/WLf8OGDeR53lDF5uLiIs3Pz1+iVl083H777fTtb3+b/u///b901VVXDV6fn5+nfr9PS0tLbP8rqV8OHDhAx44do7e+9a3k+z75vk+PP/44ffGLXyTf92lubu6K7wMios2bN9Mb3/hG9tq1115Lhw4dIiIaXOuVNEcmed5P8pwn0nl/Fhd73o/Vgz8MQ7rhhhto//79g9eyLKP9+/fTzp07L2HLLiyMMXT77bfT17/+dfrud79L27dvZ+/fcMMNFAQB65eDBw/SoUOHrph+ec973kM/+tGP6Nlnnx38u/HGG+nDH/7wYPtK7wMioltuuWWI1vWTn/yErr76aiIi2r59O83Pz7N+aDQa9NRTT122/TCJ817n/Cp03q/ios/7V1GAeEHx8MMPmyiKzFe/+lXz4x//2HzsYx8zU1NTZmFh4VI37YLhE5/4hKnX6+Z73/ueOXr06OBfu90e7PPxj3/cbNu2zXz3u981zzzzjNm5c6fZuXPnJWz1hQdW9xozGX3w9NNPG9/3ze///u+b559/3vzJn/yJKZVK5n/9r/812Ofee+81U1NT5s/+7M/M3/7t35r3v//9VwSdb5Lmvc75fOi8v/Dzfuwe/MYY89//+38327ZtM2EYmre//e3mySefvNRNuqAgopH/HnzwwcE+nU7H/If/8B/M9PS0KZVK5ld/9VfN0aNHL12jLwLkAjApffCtb33LXHfddSaKIrNjxw7z5S9/mb2fZZn59Kc/bebm5kwUReY973mPOXjw4CVq7fnDJM17nfP50Hl/4ee9Y4wx648TKBQKhUKhuBwxVjl+hUKhUCgUFxb64FcoFAqFYoKgD36FQqFQKCYI+uBXKBQKhWKCoA9+hUKhUCgmCPrgVygUCoVigqAPfoVCoVAoJgj64FcoFAqFYoKgD36FQqFQKCYI+uBXKBQKhWKCoA9+hUKhUCgmCP8/2AwTSsBFjP4AAAAASUVORK5CYII=\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Self-Attn matrix shape: (1, 4, 365, 365)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAHOCAYAAADJ3DBLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASqBJREFUeJzt3XlcVPX+P/DXsMywMwiyKosI4ZJXgjSX1BIzs9QytfTelFLTqLS00jaXm+JS3zLzauqN3LfKNHNNNC0X0tBEvUZumImKghsIyrx/f/DjjMdh+5iIyuv5eJzH43Dmc858zmfmPbxm5pw5BhEREBERESmwq+oOEBER0Z2HAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgugOM2HCBERFRcFisdy0bY4cORIGgwFZWVk3bZu3gzZt2qBNmzblttu4cSMMBgM2btxY6X26U5w8eRJPP/00vL29YTAY8Mknn9yV47R69Wq4ubnh9OnTVd2VOw4DxB3g4MGDePHFF1GnTh04OTnBw8MDLVq0wKRJk5CXl1fV3VO2cuVKGAwGBAYGlvhP8K+//sLIkSOxa9cum9vmz5+PTz755Kb3acuWLRg5ciRycnJu+rZvpvPnz2P8+PF46623YGdXVL65ubkYOXLkXfWiTlXvtddew5o1azB8+HDMmTMHjz766E2/jxt97h48eBA9e/aEr68vnJ2dERERgXfeeafU9leuXEH9+vVhMBjw4Ycf6m579NFHUbduXSQmJt7ILlRrDlXdASrb999/j27dusFkMuG5555Dw4YNUVBQgJ9++glvvPEG9u7di+nTp1d1N5XMmzcPoaGhOHLkCJKTkxEXF6e7/a+//sKoUaMQGhqKxo0b626bP38+0tLSMHjw4Jvapy1btmDUqFHo06cPzGbzTd32zfTFF1/g6tWrePbZZ7Vlubm5GDVqFABU6N12dbJ27dqq7sIdKzk5GZ07d8bQoUO1ZZGRkcjLy4PRaLwp93Ejz91du3ahTZs2CAoKwpAhQ+Dt7Y2MjAwcO3as1HUmT56MjIyMUm9/8cUXMXToUIwaNQru7u5K+1CdMUDcxg4fPoxnnnkGISEhSE5ORkBAgHZbQkIC/vjjD3z//felrm+xWFBQUAAnJ6db0d0KuXTpEpYtW4bExEQkJSVh3rx5NgHiTlRYWIgDBw6gfv36lXo/SUlJ6NSp0231mN7ObtY/uuro1KlTNmHazs6uQs+93NxcuLi43PQ+WSwW/Otf/0JUVBQ2bNgAZ2fnctc5deoURo8ejbfeegvvv/9+iW26du2KV155BUuWLMHzzz9/s7t99xK6bQ0YMEAAyM8//1yh9gAkISFB5s6dK/Xr1xcHBwdZunSpiIj8+uuv8uijj4q7u7u4urrKww8/LFu3btWtX1BQICNHjpS6deuKyWSSGjVqSIsWLWTt2rVamxMnTkifPn0kKChIjEaj+Pv7S6dOneTw4cMV6uOcOXPEzs5OTpw4IePHjxcPDw/Jy8vTbt+wYYMAsJmSkpKkdevWNstDQkJ06y1atEg++OADCQoKEpPJJA8//LCkp6eX2acRI0aUeJ8V2af09HQZPny4BAQESOfOnctsO3HiRAEgR44csblt2LBh4ujoKGfPni11/UOHDgkA+fLLL7Vlhw8fLrHvI0aM0NqsX79eWrZsKS4uLuLp6SmdOnWSffv2lTgGp0+f1pYdOXJEwsPDpUGDBpKZmSkiItnZ2TJo0CCpVauWGI1GCQ8Pl3HjxklhYaFNnyZOnCiff/651KlTR4xGo8TGxkpKSkqZY1QRCQkJ4urqKpcuXbK57ZlnnhE/Pz+5evWqiIi0bt1aWrdurWtz7Ngx6dy5s7i4uEjNmjVl8ODBsnr1agEgGzZs0LXdtm2btG/fXjw8PMTZ2VlatWolP/30k839VqS+KmLt2rXSokUL8fT0FFdXV4mMjJThw4fr2ly+fFnef/99CQ8PF6PRKLVq1ZI33nhDLl++bNNu8ODB4uPjI25ubvLEE0/IsWPHbJ4f10tKSirxOSVirbNrx6l169bSoEED2bFjhzz44IPi7OwsgwYNEhGRX375RR555BHx9vYWJycnCQ0Nlfj4eBGp2HP3eqtWrRIAsnLlShERuXTpkvZYlyY+Pl6aNGmi1c/EiRNLbBcdHS2dOnUqc1ukxwBxGwsKCpI6depUuD0AqVevntSsWVNGjRolU6ZMkdTUVElLSxNXV1cJCAiQf//73zJu3DgJCwsTk8kk27Zt09Z/++23xWAwSL9+/WTGjBny0UcfybPPPivjxo3T2jRv3lw8PT3l3XfflZkzZ8rYsWPloYcekh9//LFCfXz00Uelbdu2IiJy9OhRMRgMsnjxYu32zMxMGT16tACQ/v37y5w5c2TOnDly8OBBWbt2rTRu3Fh8fHy05cUBqfiFLTo6WmJiYuTjjz+WkSNHiouLizRp0qTMPu3evVueffZZASAff/yxtu2LFy+W2D43N1fmzJmjBRqTySQ9evQoN+gV7++ECRNsbqtTp4507NixzPXnzp0rAOS3337Tll28eFGmTp0qAOTJJ5/U+r57924REVm3bp04ODhIZGSkTJgwQUaNGiU+Pj7i5eWlC0jXB4g//vhDgoODpXHjxtqyS5cuSaNGjcTb21vefvttmTZtmjz33HNiMBi0fxgi1n8M0dHRUrduXRk/frxMmDBBfHx8pFatWlJQUGCzb6+99prMmTOnzP0vtmnTJgGge94U98/V1VUSEhK0ZdcHiNzcXImMjBQnJyd588035ZNPPpGYmBhp1KiRzT/G9evXi9FolGbNmslHH30kH3/8sTRq1EiMRqNs375da1fR+ipPWlqaFrQmTZok06ZNk6FDh0qrVq20NoWFhfLII4+Ii4uLDB48WD7//HN5+eWXxcHBwSbA/vOf/xQA0rNnT/nss8/kqaee0vazrH/SBw8elDlz5ggAadeunfacEik9QPj7+0vNmjXllVdekc8//1y+/fZbOXnypHh5eUlkZKRMnDhRZsyYIe+8847Uq1dPRMp/7pZkyJAhAkDWr18vMTExAkCMRqP06NFDzpw5Y9N++/btYmdnJ1u2bNEF25L07dtXfHx8Sr1vssUAcZs6d+6cACj3Xe21AIidnZ3s3btXt7xLly5iNBrl4MGD2rK//vpL3N3ddS9O//jHP8r8J5adnV1mAZbn5MmT4uDgIDNmzNCWNW/e3GYff/nlF+1Th+t17NhR+9ThWsUvbPXq1ZP8/Hxt+aRJkwSA7Nmzp8y+FX86UNanDjt27JCBAweKp6enAJCYmBj57LPPyvzU4HrNmjWTmJgY3bKUlBQBILNnzy5z3XfffVcAyIULF3TLT58+Xeo/hcaNG4uvr6/uxXX37t1iZ2cnzz33nLbs2gCxf/9+CQwMlPvvv1+3b//+97/F1dVVfv/9d919DBs2TOzt7SUjI0NErAHC29tbt/6yZcsEgHz33Xe69YcOHSoA5LPPPitz/4tZLBYJCgqSrl276pYvXrxYAMimTZu0ZdcHiE8++cQmfFy6dEnq1q2r+8dosVgkIiJC2rdvLxaLRWubm5srYWFh0q5dO21ZReurPB9//LHNp0DXK/4Eb/Pmzbrl06ZN031auWvXLgEgL730kq5dz549yw0QxYo/0bxWaQECgEybNk3XdunSpQJAfvnll1Lvo6znbkk6deqkPbd69eolX331lbz33nvi4OAgzZs31z1WFotFmjRpIs8++6yISLkBYuzYsQJATp48WaG+kAjPwrhNnT9/HgCUD+hp3bq17nv4wsJCrF27Fl26dEGdOnW05QEBAejZsyd++ukn7b7MZjP27t2L9PT0Erft7OwMo9GIjRs3Ijs7W3WXsHDhQtjZ2aFr167asmeffRarVq26oe2VJD4+Xve994MPPggAOHTo0A1vc/78+YiOjkZsbCyWLFmC+Ph47N69Gzt27EBCQgK8vLwqvK0ePXpg586dOHjwoLZs0aJFMJlM6Ny5c5nrnjlzBg4ODnBzc6vQfZ04cQK7du1Cnz59UKNGDW15o0aN0K5dO6xcudJmnbS0NLRu3RqhoaH44YcfdPu2ZMkSPPjgg/Dy8kJWVpY2xcXFobCwEJs2bbLZ12vXL+mxePfdd/Hhhx9i7NixeOGFF3D58uVSp/z8fACAwWBAt27dsHLlSly8eFHb1qJFixAUFISWLVuWOiYrV65EQEAAnn76aW2Zi4sL+vfvr2u3a9cupKeno2fPnjhz5oy2r5cuXULbtm2xadMmWCwWpfoqT/HxBsuWLSv1FN0lS5agXr16iIqK0j0GDz/8MABgw4YN2n4CwKuvvqpb/2YffFzMZDIhPj5et6x4f1asWIErV67clPspfrzvv/9+zJ07F127dsXo0aPx73//G1u2bMH69eu1tl9++SX27NmD8ePHV2jbxc/Vu+1U5srEAHGb8vDwAABcuHBBab2wsDDd36dPn0Zubi7uuecem7b16tWDxWLRjl4ePXo0cnJyEBkZiXvvvRdvvPEGfvvtN629yWTC+PHjsWrVKvj5+aFVq1aYMGECMjMztTbnzp1DZmamNp09e1a7be7cuWjSpAnOnDmDP/74A3/88Qeio6NRUFCAJUuWKO1naYKDg3V/F78o/J2AMn36dOzatQv33XcfNm/ejI8//hiNGjUqc52zZ8/qxuHcuXMAgG7dusHOzg6LFi0CAIgIlixZgg4dOmiP+c1y9OhRACj1sS/+h3itJ554Au7u7lizZo1Nf9LT07F69WrUrFlTNxUfBHvq1Cld+/Ieiw0bNmDMmDEAgLfffhvOzs5lTtfuR48ePZCXl4fly5cDKPrHsnLlSnTr1g0Gg6HMMalbt65Nm+vHqDhE9+7d22Z/Z86cifz8fJw7d06pvsrTo0cPtGjRAn379oWfnx+eeeYZLF68WBcm0tPTsXfvXps+RUZGArA+BkePHoWdnR3Cw8PL3M+bJSgoyOaA1datW6Nr164YNWoUfHx80LlzZyQlJWlB8EYUHzR57VlIANCzZ08ARWdTAUVvwIYPH4433ngDtWvXrtC2RQQAynz+kB7PwrhNeXh4IDAwEGlpaUrrVeSo5NK0atUKBw8exLJly7B27VrMnDkTH3/8MaZNm4a+ffsCKHoH88QTT+Dbb7/FmjVr8N577yExMRHJycmIjo7GoEGDMGvWLG2brVu3xsaNG5Geno5ffvkFABAREWFz3/PmzbN5F3gj7O3tS1xe/OJwIz788ENMnToVixcvRv369dG6dWvEx8eja9eucHV1LXGdp556Cj/++KP2d+/evfHll18iMDAQDz74IBYvXoy3334b27ZtQ0ZGRoXeJXl7e+Pq1au4cOFCpZ1q1rVrV8yaNQvz5s3Diy++qLvNYrGgXbt2ePPNN0tct/ifWLHyHov77rsPsbGx2LFjB1577bVyQ9m1n7w88MADCA0NxeLFi9GzZ0989913yMvLQ48ePcrdx4oo/qc9ceJEm1OJr+3P3/lneD1nZ2ds2rQJGzZswPfff4/Vq1dj0aJFePjhh7F27VrY29vDYrHg3nvvxf/93/+VuI2K/rO82Up63TEYDPjqq6+wbds2fPfdd1izZg2ef/55fPTRR9i2bVuFP0m7VmBgIADAz89Pt9zX1xeANZx++OGHKCgoQI8ePXDkyBEAwJ9//qm1OXLkCAIDA3Whp3hdHx8f5X5VVwwQt7HHH38c06dPx9atW9GsWbMb2kbNmjXh4uKCAwcO2Nz2v//9D3Z2droXnRo1aiA+Ph7x8fG4ePEiWrVqhZEjR2oBAgDCw8MxZMgQDBkyBOnp6WjcuDE++ugjzJ07F2+++Sb++c9/am2L33XOmzcPjo6OmDNnjs0/lp9++gmffvopMjIyEBwcXOY7gMp6d1DWdmNjY/Hf//4XkyZNwsKFCzFz5kz07t0bL7/8Mrp37474+Hi0aNFCt85HH32k+9Sj+IUPKHqn+dJLL+HAgQNYtGgRXFxc8MQTT5Tbx6ioKABFp/de+8+2tL6HhIQAQKmPvY+Pj00AmjhxIhwcHPDSSy/B3d1de2cHFD3uFy9evGmn3Xp6emLt2rV4+OGHMXfuXGzcuFHpNNju3btj0qRJOH/+PBYtWoTQ0FA88MADZa4TEhKCtLQ0iIhu3K4fo+J37h4eHmXur2p9lcfOzg5t27ZF27Zt8X//938YO3Ys3nnnHWzYsAFxcXEIDw/H7t270bZt2zKfsyEhIbBYLDh48KDuU4eS+lnZHnjgATzwwAMYM2YM5s+fj169emHhwoXo27evcj3HxMRgxowZOH78uG75X3/9BaDo8QCAjIwMZGdno0GDBjbbGDt2LMaOHYvU1FRdODx8+DB8fHy0bVD5+BXGbezNN9+Eq6sr+vbti5MnT9rcfvDgQUyaNKnMbdjb2+ORRx7BsmXLtCQOFP1M7fz589GyZUvto+ozZ87o1nVzc0PdunW1d1m5ubm4fPmyrk14eDjc3d21NvXr10dcXJw2xcTEACgKEA8++CB69OiBp59+Wje98cYbAIAFCxYAgPZPraRfhXR1ddW+DriZyrrPYm5ubujbty+2bduGtLQ0vPDCC/j222/RsmVLREZGYvbs2VrbmJgY3Thc+4+xa9eusLe3x4IFC7BkyRI8/vjjpX6Sca3iELljxw7d8uLz7a/ve0BAABo3boxZs2bpbktLS8PatWvx2GOP2dyHwWDA9OnT8fTTT6N3797aVwRA0T/srVu3Ys2aNTbr5eTk4OrVq+Xuw/W8vLywbt06+Pn5YfLkyUrr9ujRA/n5+Zg1axZWr16N7t27l7vOY489hr/++gtfffWVtiw3N9fmx9hiYmIQHh6ODz/8UHecRbHinz1Wqa/yXPt1X7Hif3DF9dW9e3ccP34cM2bMsGmbl5enfSXVoUMHAMCnn36qa1MZv+JamuzsbJtP/q7fn9Keu6Xp3LkzTCYTkpKSdF/tzJw5EwDQrl07AEXHfixdulQ3ff755wCAPn36YOnSpTZf9+7cufOG36hVW1V5BCeVb9myZeLk5CReXl4yaNAgmTFjhkyZMkV69eolRqNR+vfvr7VFCUdNi1hPMwsKCpIxY8bI+PHjpU6dOjanmfn6+kr37t1l/PjxMmPGDHnxxRfFYDDIK6+8IiIiqampUqNGDRkwYIB8+umn8p///EfatWsnAOSrr74qdR+2bdsmAOSTTz4ptU1MTIzce++9IlL0exRms1nuuecemTlzpixYsEAOHTokIiITJkwQAPLaa6/J/PnzZfny5SJiPTp8yZIluu0WH3ld0hkd1yo+E+Kxxx6T2bNny4IFC0o9jfNa+fn5snDhQmnXrp089dRT5bYvFhcXJ+7u7gJAvv766wqv17BhQ+2o8mvVr19f/P39ZcqUKbJgwQLtrJPi0zijoqJk4sSJMnr0aKlZs6Z4eXlpYypiexpnQUGBPPbYY2IymWT9+vUiUnS2wn333ScODg7St29fmTp1qnz44YfSu3dvcXV11dYt62h3lHLEfVZWVomnd5anbt262jju3LnT5vbrz8IoPuPCyclJ3nrrrTJP49ywYYM4OTlJcHCwjBgxQqZPny4jRoyQVq1ayeOPP661q2h9lWfQoEESHR0t7777rsyYMUPGjBkjQUFBUqtWLcnJyRGRotM4H3vsMTEYDPLMM8/I5MmT5ZNPPpEBAwZIjRo1dGc8FJ+a3KtXL5kyZUqFT+MsVtLrSVm/A3G9jz/+WCIiIuTNN9+Uzz//XD788EO55557xMPDQ/fcK+25W5ri07zbtWsnU6ZMkf79+4vBYCixLq5V1vPy5MmTYm9vLzNnzixzG6THAHEH+P3336Vfv34SGhoqRqNR3N3dpUWLFjJ58mTdj8eUFiBEin7opn379uLm5iYuLi7y0EMPyZYtW3RtPvjgA2nSpImYzWZxdnaWqKgoGTNmjPbCnpWVJQkJCRIVFSWurq7i6ekpTZs2tTkf/3qvvPKKANCd5na9kSNHCgDtHPBly5ZpP4Z1bQC4ePGi9OzZU8xmc4k/JHWjAUKk6DTFoKAgsbOzq/APSV2rIoGj2IwZMwSAuLu7635Iqzz/93//J25ubpKbm6tbvmXLFomJiRGj0WjzD+KHH36QFi1aiLOzs3h4eMgTTzxRoR+Sys3NldatW4ubm5v2j/DChQsyfPhwqVu3rhiNRvHx8ZHmzZvLhx9+qD1PbiRA3Kh33nlHAEjdunVLvL2kH5I6evSodOrUSVxcXMTHx0cGDRpU6g9JpaamylNPPSXe3t5iMpkkJCREunfvroWqYhWpr/KsX79eOnfuLIGBgWI0GiUwMFCeffZZm9NmCwoKZPz48dKgQQMxmUzi5eUlMTExMmrUKDl37pzWLi8vT1599VXx9vYWV1fXCv+QVLG/GyB+/fVXefbZZyU4OFhMJpP4+vrK448/Ljt27NC1K+u5WxKLxSKTJ0+WyMhIcXR0lNq1a8u7775bbgAt63k5depUcXFxkfPnz5e5DdIziPyNo8uI6JY6d+4c6tSpgwkTJuCFF16o6u7QHchgMGDEiBEYOXJkVXflthEdHY02bdrg448/ruqu3FF4DATRHcTT0xNvvvkmJk6ceFMv501UXa1evRrp6ekYPnx4VXfljsNPIIiIKtm1v5VSEmdnZ3h6et6SvvATCLpZeBonEVElu/ZKuiUp/p0QojsJAwQRUSVbt25dmbdf+zshlY0fOtPNwq8wiIiISBkPoiQiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBCkGTlyJAwGA7Kysqq6K5o+ffogNDS0qrtBdNdi3dONYoCgu8b+/fvx6KOPws3NDTVq1MC//vUvnD59uqq7RUSVJCUlBS+99BJiYmLg6OgIg8FQ1V2qVhgg6K7w559/olWrVvjjjz8wduxYDB06FN9//z3atWuHgoKCqu4eEVWClStXYubMmTAYDKhTp05Vd6faYYCgu8LYsWNx6dIlJCcn49VXX8Xbb7+NxYsXY/fu3fjyyy+runtEVAkGDhyIc+fOYceOHWjXrl1Vd6faYYAgGzk5OejTpw/MZjM8PT0RHx+P3Nxcm3Zz585FTEwMnJ2dUaNGDTzzzDM4duyYrs3mzZvRrVs3BAcHw2QyoXbt2njttdeQl5dns71vv/0WDRs2hJOTExo2bIilS5dWuM9ff/01Hn/8cQQHB2vL4uLiEBkZicWLFyvsPVH1dCfWvZ+fH5ydndV3lm4Kh6ruAN1+unfvjrCwMCQmJuLXX3/FzJkz4evri/Hjx2ttxowZg/feew/du3dH3759cfr0aUyePBmtWrVCamoqzGYzAGDJkiXIzc3FwIED4e3tjZSUFEyePBl//vknlixZom1v7dq16Nq1K+rXr4/ExEScOXMG8fHxqFWrVrn9PX78OE6dOoXY2Fib25o0aYKVK1f+/UEhusvdaXVPtwEh+v9GjBghAOT555/XLX/yySfF29tb+/vIkSNib28vY8aM0bXbs2ePODg46Jbn5uba3E9iYqIYDAY5evSotqxx48YSEBAgOTk52rK1a9cKAAkJCSmz37/88osAkNmzZ9vc9sYbbwgAuXz5cpnbIKqu7tS6v15CQoLwX9qtxa8wyMaAAQN0fz/44IM4c+YMzp8/DwD45ptvYLFY0L17d2RlZWmTv78/IiIisGHDBm3daz9evHTpErKystC8eXOICFJTUwEAJ06cwK5du9C7d294enpq7du1a4f69euX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iJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBgjSjBw5EgaDAVlZWVXdFU2fPn0QGhpa1d0gumux7ulGMUDQHc9iseDLL79Ep06dULt2bbi6uqJhw4b44IMPcPny5aruHhFVkhkzZqB169bw8/ODyWRCWFgY4uPjceTIkaruWrXgUNUdIPq7cnNzER8fjwceeAADBgyAr68vtm7dihEjRmD9+vVITk6GwWCo6m4S0U2WmpqKsLAwdOrUCV5eXjh8+DBmzJiBFStWYPfu3QgMDKzqLt7VGCDojmc0GvHzzz+jefPm2rJ+/fohNDRUCxFxcXFV2EMiqgz/+c9/bJZ16dIFsbGxmD17NoYNG1YFvao++BUG2cjJyUGfPn1gNpvh6emJ+Ph45Obm2rSbO3cuYmJi4OzsjBo1auCZZ57BsWPHdG02b96Mbt26ITg4GCaTCbVr18Zrr72GvLw8m+19++23aNiwIZycnNCwYUMsXbq0Qv01Go268FDsySefBADs37+/Qtshqs7utLovTfGxEzk5OX9rO1Q+fgJBNrp3746wsDAkJibi119/xcyZM+Hr64vx48drbcaMGYP33nsP3bt3R9++fXH69GlMnjwZrVq1QmpqKsxmMwBgyZIlyM3NxcCBA+Ht7Y2UlBRMnjwZf/75J5YsWaJtb+3atejatSvq16+PxMREnDlzBvHx8ahVq9YN70dmZiYAwMfH54a3QVRd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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "[MoE Routing Clusters @ temporal_attn]\n", + " - Cluster 0: size=1, dominant_expert=6, mean_dist=[0. 0. 0.427 0. 0. 0. 0.455 0.118]\n", + " - Cluster 1: size=3, dominant_expert=6, mean_dist=[0. 0. 0.437 0. 0. 0. 0.492 0.07 ]\n", + " - Cluster 2: size=3, dominant_expert=6, mean_dist=[0. 0. 0.37 0. 0. 0. 0.538 0.092]\n", + " - Cluster 3: size=1, dominant_expert=6, mean_dist=[0. 0. 0.364 0. 0.003 0. 0.51 0.123]\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "# -*- coding: utf-8 -*-\n", + "import math, os\n", + "from typing import Optional, Tuple, List\n", + "import numpy as np\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# ============ 基本设置 ============\n", + "os.makedirs(\"viz_out\", exist_ok=True)\n", + "\n", + "# ============ 工具:正弦位置编码 ============\n", + "class SinusoidalPositionalEncoding(nn.Layer):\n", + " def __init__(self, d_model: int, max_len: int = 4096):\n", + " super().__init__()\n", + " pe = np.zeros((max_len, d_model), dtype=\"float32\")\n", + " position = np.arange(0, max_len, dtype=\"float32\")[:, None]\n", + " div_term = np.exp(np.arange(0, d_model, 2, dtype=\"float32\") * (-math.log(10000.0) / d_model))\n", + " pe[:, 0::2] = np.sin(position * div_term)\n", + " pe[:, 1::2] = np.cos(position * div_term)\n", + " self.register_buffer(\"pe\", paddle.to_tensor(pe), persistable=False)\n", + " def forward(self, x): # (B,T,D)\n", + " T = x.shape[1]\n", + " return x + self.pe[:T, :]\n", + "\n", + "# ============ TabM(占位,可替换为你的实现) ============\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " def __init__(self, num_features: int, d_hidden: int = 512, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(num_features, d_hidden), nn.ReLU(), nn.Dropout(dropout),\n", + " nn.Linear(d_hidden, d_hidden), nn.ReLU(),\n", + " )\n", + " self.d_hidden = d_hidden\n", + " def forward(self, x_num: paddle.Tensor):\n", + " return self.net(x_num)\n", + "\n", + "# ============ 3D ResNet18 ============\n", + "class BasicBlock3D(nn.Layer):\n", + " expansion = 1\n", + " def __init__(self, in_planes, planes, stride=(1,1,1), downsample=None):\n", + " super().__init__()\n", + " self.conv1 = nn.Conv3D(in_planes, planes, 3, stride=stride, padding=1, bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(planes)\n", + " self.relu = nn.ReLU()\n", + " self.conv2 = nn.Conv3D(planes, planes, 3, stride=1, padding=1, bias_attr=False)\n", + " self.bn2 = nn.BatchNorm3D(planes)\n", + " self.downsample = downsample\n", + " def forward(self, x):\n", + " identity = x\n", + " out = self.relu(self.bn1(self.conv1(x)))\n", + " out = self.bn2(self.conv2(out))\n", + " if self.downsample is not None:\n", + " identity = self.downsample(x)\n", + " out = self.relu(out + identity)\n", + " return out\n", + "\n", + "class ResNet3D(nn.Layer):\n", + " def __init__(self, block, layers, in_channels=20, base_width=64):\n", + " super().__init__()\n", + " self.in_planes = base_width\n", + " self.conv1 = nn.Conv3D(in_channels, self.in_planes, kernel_size=(3,7,7),\n", + " stride=(1,2,2), padding=(1,3,3), bias_attr=False)\n", + " self.bn1 = nn.BatchNorm3D(self.in_planes)\n", + " self.relu = nn.ReLU()\n", + " self.maxpool = nn.MaxPool3D(kernel_size=(1,3,3), stride=(1,2,2), padding=(0,1,1))\n", + " self.layer1 = self._make_layer(block, base_width, layers[0], stride=(1,1,1))\n", + " self.layer2 = self._make_layer(block, base_width*2, layers[1], stride=(2,2,2))\n", + " self.layer3 = self._make_layer(block, base_width*4, layers[2], stride=(2,2,2))\n", + " self.layer4 = self._make_layer(block, base_width*8, layers[3], stride=(2,2,2))\n", + " self.out_dim = base_width*8 # 512\n", + " self.pool = nn.AdaptiveAvgPool3D(output_size=1)\n", + " def _make_layer(self, block, planes, blocks, stride=(1,1,1)):\n", + " downsample = None\n", + " if stride != (1,1,1) or self.in_planes != planes * block.expansion:\n", + " downsample = nn.Sequential(\n", + " nn.Conv3D(self.in_planes, planes * block.expansion, 1, stride=stride, bias_attr=False),\n", + " nn.BatchNorm3D(planes * block.expansion),\n", + " )\n", + " layers = [block(self.in_planes, planes, stride=stride, downsample=downsample)]\n", + " self.in_planes = planes * block.expansion\n", + " for _ in range(1, blocks):\n", + " layers.append(block(self.in_planes, planes))\n", + " return nn.Sequential(*layers)\n", + " def forward(self, x): # (B, C, D, H, W)\n", + " x = self.relu(self.bn1(self.conv1(x)))\n", + " x = self.maxpool(x)\n", + " x = self.layer1(x); x = self.layer2(x); x = self.layer3(x); x = self.layer4(x)\n", + " x = self.pool(x) # (B, 512, 1,1,1)\n", + " x = paddle.flatten(x, 1) # (B, 512)\n", + " return x\n", + "\n", + "class Volume3DEncoder(nn.Layer):\n", + " \"\"\"\n", + " 附带特征/梯度捕获,用于 3D Grad-CAM:\n", + " - forward_post_hook 里:先缓存 feat\n", + " - 若 out 可梯度,则注册 backward hook;否则跳过(避免 stop_gradient 报错)\n", + " \"\"\"\n", + " def __init__(self, in_channels: int = 20, base: int = 64, dropout: float = 0.0):\n", + " super().__init__()\n", + " self.backbone = ResNet3D(BasicBlock3D, [2,2,2,2], in_channels=in_channels, base_width=base)\n", + " self.drop = nn.Dropout(dropout)\n", + " self.out_dim = self.backbone.out_dim # 512\n", + " self._feat = None\n", + " self._grad = None\n", + "\n", + " def _save_feat_grad(layer, inp, out):\n", + " self._feat = out # (B, 512, D',H',W')\n", + " if getattr(out, \"stop_gradient\", False):\n", + " return\n", + " def _save_grad(grad):\n", + " self._grad = grad\n", + " out.register_hook(_save_grad)\n", + "\n", + " self.backbone.layer4.register_forward_post_hook(_save_feat_grad)\n", + "\n", + " def forward(self, x): # (B, C, D, H, W)\n", + " x = self.backbone(x)\n", + " x = self.drop(x)\n", + " return x\n", + "\n", + "# ============ MoE ============\n", + "class ExpertFFN(nn.Layer):\n", + " def __init__(self, d_model, d_ff, dropout=0.1):\n", + " super().__init__()\n", + " self.fc1 = nn.Linear(d_model, d_ff)\n", + " self.fc2 = nn.Linear(d_ff, d_model)\n", + " self.drop = nn.Dropout(dropout)\n", + " def forward(self, x):\n", + " return self.fc2(self.drop(F.relu(self.fc1(x))))\n", + "\n", + "class MoEConfig:\n", + " def __init__(self, n_experts=8, top_k=1, d_ff=2048, dropout=0.1,\n", + " router_temp=0.5, use_gumbel=False):\n", + " self.n_experts=n_experts; self.top_k=top_k; self.d_ff=d_ff; self.dropout=dropout\n", + " self.router_temp=router_temp; self.use_gumbel=use_gumbel\n", + "\n", + "class MoE(nn.Layer):\n", + " \"\"\"缓存最近一次路由概率/索引,便于可解释与聚类\"\"\"\n", + " def __init__(self, d_model: int, cfg: MoEConfig):\n", + " super().__init__()\n", + " self.cfg = cfg\n", + " self.router = nn.Linear(d_model, cfg.n_experts)\n", + " self.experts = nn.LayerList([ExpertFFN(d_model, cfg.d_ff, cfg.dropout) for _ in range(cfg.n_experts)])\n", + " self.ln = nn.LayerNorm(d_model); self.drop = nn.Dropout(cfg.dropout)\n", + " self.last_router_probs = None\n", + " self.last_topk_idx = None\n", + " def _router_probs(self, logits):\n", + " if self.cfg.use_gumbel and self.training:\n", + " u = paddle.uniform(logits.shape, min=1e-6, max=1-1e-6, dtype=logits.dtype)\n", + " g = -paddle.log(-paddle.log(u)); logits = logits + g\n", + " return F.softmax(logits / self.cfg.router_temp, axis=-1)\n", + " def forward(self, x):\n", + " orig_shape = x.shape\n", + " if len(orig_shape) == 3: B,T,D = orig_shape; X = x.reshape([B*T, D])\n", + " else: X = x\n", + " N,D = X.shape\n", + " logits = self.router(X); probs = self._router_probs(logits)\n", + " topk_val, topk_idx = paddle.topk(probs, k=self.cfg.top_k, axis=-1)\n", + " all_out = paddle.stack([e(X) for e in self.experts], axis=1) # (N,E,D)\n", + " arangeN = paddle.arange(N, dtype='int64')\n", + " picked_list=[]\n", + " for i in range(self.cfg.top_k):\n", + " idx_i = topk_idx[:, i].astype('int64')\n", + " idx_nd = paddle.stack([arangeN, idx_i], axis=1)\n", + " picked_i = paddle.gather_nd(all_out, idx_nd)\n", + " picked_list.append(picked_i)\n", + " picked = paddle.stack(picked_list, axis=1) # (N,k,D)\n", + " w = topk_val / (paddle.sum(topk_val, axis=-1, keepdim=True) + 1e-9)\n", + " Y = paddle.sum(picked * w.unsqueeze(-1), axis=1) # (N,D)\n", + " Y = self.drop(Y); Y = self.ln(Y + X)\n", + " self.last_router_probs = probs.detach()\n", + " self.last_topk_idx = topk_idx.detach()\n", + " if len(orig_shape)==3: Y = Y.reshape([B,T,D])\n", + " return Y\n", + "\n", + "class MoEHead(nn.Layer):\n", + " def __init__(self, d_model=512, cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.moe = MoE(d_model, cfg or MoEConfig())\n", + " self.last_router_probs = None\n", + " self.last_topk_idx = None\n", + " def forward(self, tok):\n", + " y = self.moe(tok.unsqueeze(1)).squeeze(1)\n", + " self.last_router_probs = self.moe.last_router_probs\n", + " self.last_topk_idx = self.moe.last_topk_idx\n", + " return y\n", + "\n", + "# ============ 原生 MHA + 手工回算注意力 ============\n", + "class _NativeMHAWithAttn(nn.Layer):\n", + " \"\"\"\n", + " 包装 nn.MultiHeadAttention:\n", + " - 正式输出用原生 MHA (性能/数值一致)\n", + " - 注意力矩阵用相同权重手工回算(兼容旧版不返回 attn 的情况)\n", + " \"\"\"\n", + " def __init__(self, d_model: int, nhead: int, dropout: float = 0.1):\n", + " super().__init__()\n", + " self.mha = nn.MultiHeadAttention(embed_dim=d_model, num_heads=nhead, dropout=dropout)\n", + " self.nhead = nhead\n", + " assert d_model % nhead == 0\n", + " self.d_head = d_model // nhead\n", + " self.last_attn = None # (B, H, T, T)\n", + "\n", + " def forward(self, x_tb: paddle.Tensor) -> paddle.Tensor:\n", + " \"\"\"\n", + " x_tb: (T,B,D)\n", + " return: (T,B,D)\n", + " \"\"\"\n", + " # 1) 原生前向(不同版本的返回值差异:此处统一只拿输出)\n", + " out_tb = self.mha(x_tb, x_tb, x_tb)\n", + "\n", + " # 2) 手工回算注意力:用同一组投影权重\n", + " q = self.mha.q_proj(x_tb) # (T,B,D)\n", + " k = self.mha.k_proj(x_tb)\n", + " v = self.mha.v_proj(x_tb)\n", + " T, B, D = q.shape\n", + " H, Dh = self.nhead, self.d_head\n", + "\n", + " def split(tb): # (T,B,D)->(B,H,T,Dh)\n", + " tb = tb.transpose([1, 0, 2]) # (B,T,D)\n", + " return tb.reshape([B, T, H, Dh]).transpose([0, 2, 1, 3])\n", + "\n", + " qh, kh, vh = split(q), split(k), split(v) # (B,H,T,Dh)\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(Dh) # (B,H,T,T)\n", + " attn = F.softmax(scores, axis=-1)\n", + " self.last_attn = attn.detach()\n", + "\n", + " return out_tb # (T,B,D)\n", + "\n", + "# ============ Self-Attention Transformer(记录注意力) ============\n", + "class TransformerEncoderLayerMoE(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, d_ff=1024, dropout=0.1,\n", + " use_moe: bool = True, moe_cfg: MoEConfig = None, capture_attn: bool = True):\n", + " super().__init__()\n", + " self.use_moe = use_moe; self.capture_attn = capture_attn\n", + " self.self_attn = _NativeMHAWithAttn(d_model, nhead, dropout)\n", + " self.ln1 = nn.LayerNorm(d_model); self.do1 = nn.Dropout(dropout)\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff), nn.ReLU(), nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model))\n", + " self.do2 = nn.Dropout(dropout)\n", + " self.last_attn = None # (B,H,T,T)\n", + " def forward(self, x): # (B,T,D)\n", + " h = self.ln1(x)\n", + " h_tb = paddle.transpose(h, [1,0,2]) # (T,B,D)\n", + " out_tb = self.self_attn(h_tb) # (T,B,D)\n", + " if self.capture_attn:\n", + " self.last_attn = self.self_attn.last_attn\n", + " out = paddle.transpose(out_tb, [1,0,2]) # (B,T,D)\n", + " x = x + self.do1(out)\n", + " if self.use_moe:\n", + " x = self.moe(x)\n", + " else:\n", + " x = x + self.do2(self.ffn(x))\n", + " return x\n", + "\n", + "class TemporalTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=4, num_layers=2, d_ff=1024, dropout=0.1,\n", + " max_len=4096, use_moe: bool = True, moe_cfg: MoEConfig = None, capture_attn=True):\n", + " super().__init__()\n", + " self.pos = SinusoidalPositionalEncoding(d_model, max_len=max_len)\n", + " self.layers = nn.LayerList([\n", + " TransformerEncoderLayerMoE(d_model, nhead, d_ff, dropout,\n", + " use_moe=use_moe, moe_cfg=moe_cfg, capture_attn=capture_attn)\n", + " for _ in range(num_layers)\n", + " ])\n", + " self.last_attn_all_layers: List[paddle.Tensor] = []\n", + " def forward(self, x):\n", + " x = self.pos(x)\n", + " self.last_attn_all_layers = []\n", + " for layer in self.layers:\n", + " x = layer(x)\n", + " if layer.last_attn is not None:\n", + " self.last_attn_all_layers.append(layer.last_attn) # (B,H,T,T)\n", + " return x\n", + "\n", + "# ============ AFNO(1D) + MoE FFN ============\n", + "class AFNO1DLayer(nn.Layer):\n", + " def __init__(self, d_model: int, modes: int = 32, num_blocks: int = 8, shrink: float = 0.01, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % num_blocks == 0\n", + " self.d_model=d_model; self.modes=modes; self.num_blocks=num_blocks; self.block=d_model//num_blocks\n", + " scale=1.0/math.sqrt(self.block); init = nn.initializer.Uniform(-scale, scale)\n", + " self.w1r = self.create_parameter([num_blocks, self.block, self.block], default_initializer=init)\n", + " self.w1i = self.create_parameter([num_blocks, self.block, self.block], default_initializer=init)\n", + " self.w2r = self.create_parameter([num_blocks, self.block, self.block], default_initializer=init)\n", + " self.w2i = self.create_parameter([num_blocks, self.block, self.block], default_initializer=init)\n", + " self.ln = nn.LayerNorm(d_model); self.drop = nn.Dropout(dropout); self.shrink = shrink\n", + " def _cl(self, xr, xi, Wr, Wi):\n", + " out_r = paddle.matmul(xr, Wr) - paddle.matmul(xi, Wi)\n", + " out_i = paddle.matmul(xr, Wi) + paddle.matmul(xi, Wr)\n", + " return out_r, out_i\n", + " def forward(self, x): # (B,T,D)\n", + " B,T,D = x.shape; Kmax=T//2+1; K=min(self.modes, Kmax)\n", + " h=self.ln(x); h_td=h.transpose([0,2,1]); h_ft=paddle.fft.rfft(h_td) # (B,D,F)\n", + " h_ft=h_ft.reshape([B, self.num_blocks, self.block, Kmax])\n", + " xk=h_ft[:,:,:, :K].transpose([0,1,3,2]) # (B,G,K,Cb)\n", + " xr, xi = paddle.real(xk), paddle.imag(xk)\n", + " yr, yi = self._cl(xr, xi, self.w1r, self.w1i)\n", + " yr = F.gelu(yr); yi = F.gelu(yi)\n", + " yr = F.softshrink(yr, threshold=self.shrink); yi = F.softshrink(yi, threshold=self.shrink)\n", + " yr, yi = self._cl(yr, yi, self.w2r, self.w2i)\n", + " yk = paddle.complex(yr, yi).transpose([0,1,3,2]).reshape([B,D,K])\n", + " out_ft = paddle.zeros([B,D,Kmax], dtype='complex64')\n", + " out_ft[:,:, :K] = yk\n", + " out_td = paddle.fft.irfft(out_ft, n=T)\n", + " out = out_td.transpose([0,2,1])\n", + " out = self.drop(out)\n", + " return x + out\n", + "\n", + "class AFNOTransformerFlexible(nn.Layer):\n", + " def __init__(self, d_model=512, num_layers=2, modes=32, dropout=0.1,\n", + " d_ff=1024, use_moe: bool = True, moe_cfg: MoEConfig = None):\n", + " super().__init__()\n", + " self.layers = nn.LayerList([AFNO1DLayer(d_model, modes, 8, 0.01, dropout) for _ in range(num_layers)])\n", + " self.use_moe = use_moe\n", + " if use_moe:\n", + " self.moe = MoE(d_model, moe_cfg or MoEConfig(d_ff=d_ff, dropout=dropout))\n", + " else:\n", + " self.ffn = nn.Sequential(nn.LayerNorm(d_model),\n", + " nn.Linear(d_model, d_ff), nn.ReLU(), nn.Dropout(dropout),\n", + " nn.Linear(d_ff, d_model))\n", + " self.do = nn.Dropout(dropout)\n", + " def forward(self, x):\n", + " for layer in self.layers:\n", + " x = layer(x)\n", + " if self.use_moe:\n", + " x = self.moe(x)\n", + " else:\n", + " x = x + self.do(self.ffn(x))\n", + " return x\n", + "\n", + "# ============ Cross-Attention(记录注意力) ============\n", + "class MultiHeadCrossAttention(nn.Layer):\n", + " def __init__(self, d_model: int, nhead: int = 8, dropout: float = 0.1):\n", + " super().__init__()\n", + " assert d_model % nhead == 0\n", + " self.d_head = d_model // nhead; self.nhead = nhead\n", + " self.Wq = nn.Linear(d_model, d_model); self.Wk = nn.Linear(d_model, d_model); self.Wv = nn.Linear(d_model, d_model)\n", + " self.proj = nn.Linear(d_model, d_model); self.drop = nn.Dropout(dropout); self.ln = nn.LayerNorm(d_model)\n", + " self.last_attn = None # (B, H, Nq, Nk)\n", + " def forward(self, q, kv):\n", + " B, Nq, D = q.shape; Nk = kv.shape[1]\n", + " def split(t): return t.reshape([B, -1, self.nhead, self.d_head]).transpose([0,2,1,3])\n", + " qh = split(self.Wq(q)); kh = split(self.Wk(kv)); vh = split(self.Wv(kv))\n", + " scores = paddle.matmul(qh, kh, transpose_y=True) / math.sqrt(self.d_head) # (B,H,Nq,Nk)\n", + " attn = F.softmax(scores, axis=-1)\n", + " self.last_attn = attn.detach()\n", + " ctx = paddle.matmul(attn, vh).transpose([0,2,1,3]).reshape([B,Nq,D])\n", + " out = self.drop(self.proj(ctx))\n", + " return self.ln(out + q)\n", + "\n", + "class BiModalCrossFusion(nn.Layer):\n", + " def __init__(self, d_model=512, nhead=8, dropout=0.1, fuse_hidden=512):\n", + " super().__init__()\n", + " self.ca_v_from_t = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.ca_t_from_v = MultiHeadCrossAttention(d_model, nhead, dropout)\n", + " self.fuse = nn.Sequential(nn.Linear(2*d_model, fuse_hidden), nn.ReLU(), nn.Dropout(dropout))\n", + " self.out_dim = fuse_hidden\n", + " self.last_attn_v_from_t = None # (B,H,1,1)\n", + " self.last_attn_t_from_v = None # (B,H,1,T)\n", + " def forward(self, video_seq, tabm_tok):\n", + " v_tok = video_seq.mean(axis=1, keepdim=True) # (B,1,D)\n", + " t_tok = tabm_tok.unsqueeze(1) # (B,1,D)\n", + " v_upd = self.ca_v_from_t(v_tok, t_tok)\n", + " t_upd = self.ca_t_from_v(t_tok, video_seq)\n", + " self.last_attn_v_from_t = self.ca_v_from_t.last_attn\n", + " self.last_attn_t_from_v = self.ca_t_from_v.last_attn\n", + " fused = paddle.concat([v_upd, t_upd], axis=-1).squeeze(1)\n", + " return self.fuse(fused)\n", + "\n", + "# ============ 总模型 ============\n", + "class TwoModalMultiLabelModel(nn.Layer):\n", + " def __init__(self, vid_channels=20, vid_frames=365, depth_n=24,\n", + " vec_dim=424, d_model=512, nhead=4, n_trans_layers=2, trans_ff=1024,\n", + " tabm_hidden=512, dropout=0.1, num_labels=4,\n", + " moe_temporal_attn=True, moe_temporal_afno=True, moe_fused=False, moe_tabm=False,\n", + " afno_modes=32):\n", + " super().__init__()\n", + " self.vol_encoder = Volume3DEncoder(in_channels=vid_channels, dropout=dropout)\n", + " self.trans_attn = TemporalTransformerFlexible(\n", + " d_model=d_model, nhead=nhead, num_layers=n_trans_layers, d_ff=trans_ff, dropout=dropout,\n", + " max_len=vid_frames, use_moe=moe_temporal_attn, moe_cfg=MoEConfig(d_ff=max(2048,trans_ff), n_experts=8),\n", + " capture_attn=True\n", + " )\n", + " self.trans_afno = AFNOTransformerFlexible(\n", + " d_model=d_model, num_layers=n_trans_layers, modes=afno_modes, dropout=dropout,\n", + " d_ff=trans_ff, use_moe=moe_temporal_afno, moe_cfg=MoEConfig(d_ff=max(2048,trans_ff), n_experts=8)\n", + " )\n", + " self.video_merge = nn.Linear(2*d_model, d_model)\n", + " self.tabm = TabMFeatureExtractor(vec_dim, d_hidden=tabm_hidden, dropout=dropout)\n", + " self.tabm_proj = nn.Linear(tabm_hidden, d_model)\n", + " self.moe_tabm = moe_tabm\n", + " if moe_tabm:\n", + " self.tabm_moe = MoEHead(d_model=d_model, cfg=MoEConfig(d_ff=1024, n_experts=6))\n", + " self.fusion = BiModalCrossFusion(d_model=d_model, nhead=nhead, dropout=dropout, fuse_hidden=d_model)\n", + " self.moe_fused = moe_fused\n", + " if moe_fused:\n", + " self.fused_moe = MoEHead(d_model=d_model, cfg=MoEConfig(d_ff=1024, n_experts=6))\n", + " self.head = nn.Linear(self.fusion.out_dim, num_labels)\n", + " self.depth_n = depth_n\n", + " def encode(self, x_video, x_vec):\n", + " B,T,C,H,W,N = x_video.shape\n", + " assert N == self.depth_n\n", + " xvt = x_video.transpose([0,1,2,5,3,4]).reshape([B*T, C, N, H, W])\n", + " f_frame = self.vol_encoder(xvt) # (B*T,512)\n", + " seq = f_frame.reshape([B, T, -1]) # (B,T,512)\n", + " z_attn = self.trans_attn(seq)\n", + " z_afno = self.trans_afno(seq)\n", + " z_vid = self.video_merge(paddle.concat([z_attn, z_afno], axis=-1))\n", + " z_tabm = self.tabm(x_vec); z_tabm = self.tabm_proj(z_tabm)\n", + " if self.moe_tabm:\n", + " z_tabm = self.tabm_moe(z_tabm)\n", + " fused = self.fusion(z_vid, z_tabm)\n", + " if self.moe_fused:\n", + " fused = self.fused_moe(fused)\n", + " return fused\n", + " def forward(self, x_video, x_vec):\n", + " fused = self.encode(x_video, x_vec)\n", + " logits = self.head(fused)\n", + " return logits\n", + "\n", + "# ============ 3D Grad-CAM ============\n", + "class GradCAM3D:\n", + " \"\"\"\n", + " CAM = ReLU( sum_c( w_c * A_c ) ), w_c = GAP(grad_c)\n", + " 输出 (N,H,W),若无 scipy 则返回特征尺度 (D',H',W')\n", + " \"\"\"\n", + " def __init__(self, model: TwoModalMultiLabelModel):\n", + " self.model = model\n", + " @paddle.no_grad()\n", + " def _trilinear_upsample(self, vol, out_shape):\n", + " try:\n", + " from scipy.ndimage import zoom\n", + " Dz = out_shape[0] / vol.shape[0]\n", + " Dy = out_shape[1] / vol.shape[1]\n", + " Dx = out_shape[2] / vol.shape[2]\n", + " return zoom(vol, (Dz, Dy, Dx), order=1)\n", + " except Exception:\n", + " return vol\n", + " def generate(self, x_video, x_vec, target_class: int = 0, time_index: int = 0):\n", + " assert x_video.shape[0] == 1, \"Grad-CAM 演示请用单样本 B=1\"\n", + " self.model.eval()\n", + " B,T,C,H,W,N = x_video.shape\n", + " self.model.clear_gradients()\n", + " logits = self.model(x_video.astype('float32'), x_vec.astype('float32')) # (1,num_labels)\n", + " cls = logits[0, target_class]\n", + " cls.backward()\n", + " feat = self.model.vol_encoder._feat # (1,512,D',H',W')\n", + " grad = self.model.vol_encoder._grad\n", + " assert (feat is not None) and (grad is not None), \"未捕获到特征/梯度(检查 hook & 是否有梯度前向)\"\n", + " feat_np = feat.numpy()[0]; grad_np = grad.numpy()[0]\n", + " w = grad_np.mean(axis=(1,2,3)) # (512,)\n", + " cam = np.maximum(0, np.tensordot(w, feat_np, axes=(0,0))) # (D',H',W')\n", + " cam = cam - cam.min(); cam = cam / (cam.max() + 1e-8)\n", + " cam_up = self._trilinear_upsample(cam, (N, H, W))\n", + " return cam_up # (N,H,W) or (D',H',W')\n", + "\n", + "# ============ MoE 路由聚类工具 ============\n", + "def kmeans_numpy(X: np.ndarray, K: int = 4, iters: int = 50, seed: int = 0):\n", + " rng = np.random.default_rng(seed)\n", + " N,D = X.shape\n", + " cent = X[rng.choice(N, K, replace=False)]\n", + " for _ in range(iters):\n", + " dist2 = ((X[:,None,:]-cent[None,:,:])**2).sum(axis=2) # (N,K)\n", + " idx = dist2.argmin(axis=1)\n", + " new_cent = np.stack([X[idx==k].mean(axis=0) if np.any(idx==k) else cent[k] for k in range(K)], 0)\n", + " if np.allclose(new_cent, cent): break\n", + " cent = new_cent\n", + " return idx, cent\n", + "\n", + "def collect_moe_routing_vectors(model: TwoModalMultiLabelModel, loader: DataLoader,\n", + " branch: str = \"temporal_attn\", topk_hist: bool = True):\n", + " model.eval()\n", + " vecs = []\n", + " for x_vid, x_vec, y in loader:\n", + " _ = model(x_vid.astype('float32'), x_vec.astype('float32'))\n", + " if branch == \"temporal_attn\":\n", + " moe = None\n", + " for lyr in model.trans_attn.layers[::-1]:\n", + " if hasattr(lyr, \"moe\"):\n", + " moe = lyr.moe; break\n", + " elif branch == \"temporal_afno\":\n", + " moe = model.trans_afno.moe if hasattr(model.trans_afno, \"moe\") else None\n", + " elif branch == \"tabm\":\n", + " moe = model.tabm_moe.moe if getattr(model, \"moe_tabm\", False) else None\n", + " else:\n", + " moe = model.fused_moe.moe if getattr(model, \"moe_fused\", False) else None\n", + " if moe is None or moe.last_router_probs is None:\n", + " continue\n", + " probs = moe.last_router_probs.numpy() # (N_tokens, E)\n", + " if topk_hist:\n", + " top1 = moe.last_topk_idx.numpy()[:,0] # (N_tokens,)\n", + " E = probs.shape[1]\n", + " hist = np.bincount(top1, minlength=E).astype(\"float32\")\n", + " hist = hist / (hist.sum() + 1e-9)\n", + " vecs.append(hist)\n", + " else:\n", + " vecs.append(probs.mean(axis=0))\n", + " return np.stack(vecs, 0) if len(vecs)>0 else None\n", + "\n", + "# ============ Toy 数据集 ============\n", + "class ToyTwoModalDataset(Dataset):\n", + " \"\"\"\n", + " 返回:\n", + " x_video: (T=365, C=20, H=20, W=20, N=24)\n", + " x_vec: (424,)\n", + " y: (4,) 0/1\n", + " \"\"\"\n", + " def __init__(self, n: int, seed: int = 0, T: int = 365, C: int = 20, H: int = 20, W: int = 20, N: int = 24):\n", + " super().__init__()\n", + " rng = np.random.default_rng(seed)\n", + " self.video = rng.normal(size=(n, T, C, H, W, N)).astype('float32')\n", + " self.vec = rng.normal(size=(n, 424)).astype('float32')\n", + " # 造标签:体素均值 → (n,C) → 线性到 4 类\n", + " vid_hwn = self.video.mean(axis=(3,4,5)) # (n,T,C)\n", + " vid_avg = vid_hwn.mean(axis=1) # (n,C)\n", + " Wv = rng.normal(size=(C,4)); Wt = rng.normal(size=(424,4))\n", + " logits = vid_avg @ Wv + self.vec @ Wt + rng.normal(scale=0.5, size=(n,4))\n", + " probs = 1.0 / (1.0 + np.exp(-logits))\n", + " self.y = (probs > 0.5).astype('float32')\n", + " def __getitem__(self, idx: int):\n", + " return self.video[idx], self.vec[idx], self.y[idx]\n", + " def __len__(self): return len(self.y)\n", + "\n", + "# ============ 小工具:绘图 ============\n", + "def show_heatmap_2d(arr2d: np.ndarray, title: str, save_path: Optional[str] = None):\n", + " plt.figure(); plt.imshow(arr2d, interpolation='nearest'); plt.title(title); plt.colorbar()\n", + " if save_path: plt.savefig(save_path, bbox_inches='tight');\n", + " plt.show(); plt.close()\n", + "\n", + "def show_attention_matrix(attn: np.ndarray, title: str, save_path: Optional[str] = None):\n", + " # attn: (B,H,T,T) 或 (B,H,1,T) 或 (B,H,1,1)\n", + " if attn.ndim == 4 and attn.shape[2] == 1 and attn.shape[3] == 1:\n", + " attn = attn[0,:,0,0][:,None] # (H,1)\n", + " elif attn.ndim == 4 and attn.shape[2] == 1:\n", + " attn = attn[0] # (H,1,T)\n", + " elif attn.ndim == 4:\n", + " attn = attn[0] # (H,T,T)\n", + " plt.figure(figsize=(5,4))\n", + " if attn.ndim == 2: # (H,1)\n", + " plt.imshow(attn, aspect='auto', interpolation='nearest')\n", + " elif attn.ndim == 3: # 多头\n", + " H = attn.shape[0]\n", + " cols = int(np.ceil(np.sqrt(H))); rows = int(np.ceil(H/cols))\n", + " fig, axes = plt.subplots(rows, cols, figsize=(3*cols, 3*rows))\n", + " axes = axes.flatten()\n", + " for h in range(H):\n", + " axes[h].imshow(attn[h], interpolation='nearest'); axes[h].set_title(f\"head {h}\")\n", + " for k in range(H, len(axes)): axes[k].axis('off')\n", + " fig.suptitle(title)\n", + " if save_path: fig.savefig(save_path, bbox_inches='tight')\n", + " plt.show(); plt.close(fig); return\n", + " plt.title(title); plt.colorbar()\n", + " if save_path: plt.savefig(save_path, bbox_inches='tight')\n", + " plt.show(); plt.close()\n", + "\n", + "# ============ Demo:可解释可视化 ============\n", + "if __name__ == \"__main__\":\n", + " # 1) 构造“已训练好”的模型(这里随机权重示意)\n", + " model = TwoModalMultiLabelModel(\n", + " vid_channels=20, vid_frames=365, depth_n=24,\n", + " vec_dim=424, d_model=512, nhead=4, n_trans_layers=2, trans_ff=512,\n", + " tabm_hidden=256, dropout=0.1, num_labels=4,\n", + " moe_temporal_attn=True, moe_temporal_afno=True,\n", + " moe_fused=False, moe_tabm=False, afno_modes=32\n", + " )\n", + " model.eval()\n", + "\n", + " # 2) 取一个样本\n", + " toy = ToyTwoModalDataset(n=8, seed=123, T=365, C=20, H=20, W=20, N=24)\n", + " x_video, x_vec, y = toy[0]\n", + " x_video = paddle.to_tensor(x_video[None, ...]) # (1,T,C,H,W,N)\n", + " x_vec = paddle.to_tensor(x_vec[None, ...]) # (1,424)\n", + "\n", + " # 3) 3D Grad-CAM:一次“有梯度”的前向 + 反传\n", + " model.clear_gradients()\n", + " logits = model(x_video.astype('float32'), x_vec.astype('float32'))\n", + " target_class = int(paddle.argmax(logits, axis=-1)[0])\n", + " cam3d = GradCAM3D(model).generate(\n", + " x_video.astype('float32'), x_vec.astype('float32'),\n", + " target_class=target_class, time_index=0\n", + " ) # (N,H,W) or (D',H',W')\n", + "\n", + " # 展示几个深度切片\n", + " Nz = cam3d.shape[0]\n", + " for z in [0, Nz//3, 2*Nz//3, Nz-1]:\n", + " show_heatmap_2d(cam3d[z], f\"Grad-CAM depth={z}\", save_path=f\"viz_out/gradcam_z{z}.png\")\n", + "\n", + " # 4) Self-Attention & Cross-Attention 注意力矩阵\n", + " with paddle.no_grad():\n", + " _ = model.encode(x_video.astype('float32'), x_vec.astype('float32'))\n", + " # Self-Attn(最后一层)\n", + " last_attn_list = model.trans_attn.last_attn_all_layers\n", + " if len(last_attn_list) > 0:\n", + " attn = last_attn_list[-1].numpy() # (B,H,T,T)\n", + " attn_crop = attn[:, :, :64, :64]\n", + " show_attention_matrix(attn_crop, \"Self-Attention (last layer, first 64 tokens)\",\n", + " save_path=\"viz_out/self_attn_lastlayer_64.png\")\n", + " print(\"Self-Attn matrix shape:\", attn.shape)\n", + " else:\n", + " print(\"Self-Attn not captured.\")\n", + " # Cross-Attn\n", + " if model.fusion.last_attn_v_from_t is not None:\n", + " show_attention_matrix(model.fusion.last_attn_v_from_t.numpy(),\n", + " \"Cross-Attn v<-t (token→token)\",\n", + " save_path=\"viz_out/cross_attn_v_from_t.png\")\n", + " if model.fusion.last_attn_t_from_v is not None:\n", + " attn_tv = model.fusion.last_attn_t_from_v.numpy()\n", + " attn_tv_crop = attn_tv[:,:,:, :64]\n", + " show_attention_matrix(attn_tv_crop,\n", + " \"Cross-Attn t<-v (token←video_seq first 64)\",\n", + " save_path=\"viz_out/cross_attn_t_from_v_64.png\")\n", + "\n", + " # 5) MoE 路由聚类(示例用 toy 数据)\n", + " def collate_fn(batch):\n", + " vids, vecs, ys = zip(*batch)\n", + " return (paddle.to_tensor(np.stack(vids, 0)),\n", + " paddle.to_tensor(np.stack(vecs, 0)),\n", + " paddle.to_tensor(np.stack(ys, 0)))\n", + " train_loader = DataLoader(toy, batch_size=1, shuffle=False, collate_fn=collate_fn)\n", + " moe_vecs = collect_moe_routing_vectors(model, train_loader, branch=\"temporal_attn\", topk_hist=True)\n", + " if moe_vecs is not None:\n", + " idx, cent = kmeans_numpy(moe_vecs, K=4, iters=100, seed=0)\n", + " print(\"\\n[MoE Routing Clusters @ temporal_attn]\")\n", + " for k in range(4):\n", + " sel = (idx==k)\n", + " if np.any(sel):\n", + " mean_vec = moe_vecs[sel].mean(axis=0)\n", + " dom = int(mean_vec.argmax())\n", + " print(f\" - Cluster {k}: size={int(sel.sum())}, dominant_expert={dom}, mean_dist={np.round(mean_vec,3)}\")\n", + " # 保存热图\n", + " plt.figure(figsize=(6,4))\n", + " plt.imshow(moe_vecs, aspect='auto', interpolation='nearest')\n", + " plt.title(\"Samples × Experts (routing histogram)\"); plt.xlabel(\"Expert\"); plt.ylabel(\"Sample\")\n", + " plt.colorbar(); plt.savefig(\"viz_out/moe_routing_heatmap.png\", bbox_inches='tight')\n", + " plt.show(); plt.close()\n", + " else:\n", + " print(\"MoE routing not available on selected branch.\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "j6NZgsBmZk7u", + "outputId": "2834b1eb-d29b-4095-ccb8-35e72eba8ec5" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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69atQ1VVFVxcXBASEoIVK1bIit3kiULv3r1RUFDQ6Phf/vIXnRtNJCUlISwsTHJMrVajurra1KEREREBRk494D7a+vv7Q2hip6Z7d11saHP27Fn9YTSz85OLiwuysrIMjlEfkycK33zzDerr68XP58+fx9NPP43p06frbWNjYyPZdlKlUtY+2kRE1HL4mml5TJ4o2NvbSz6/9dZbcHd3x5gxY/S2UalURu0aRUREROZh1p0Za2trsW3bNoSHhzc5SlBZWYlevXrBxcUFwcHB+P7775vst6amptGOWERERIYwbldGI6ct2iCzJgopKSkoKyvD3Llz9dYZMGAAtm7din379mHbtm3QarUYNWoUrly5ordNfHw8bG1txXLv7lhERER6CSrji4KYNVHYsmULgoKC4OzsrLeOn58f5syZA29vb4wZMwZ79uyBvb09PvzwQ71tYmJiUF5eLpaioiJzhE9ERKR4Zns8sqCgAOnp6bL2kwaADh06YNiwYZLnTe+lVqtbdatMIiJqu7iYUR6zjSgkJiaie/fumDRpkqx29fX1+O6772TtGkVERGQwwQRFQcySKGi1WiQmJiI0NBTt20sHLebMmYOYmBjx86pVq/Cvf/0LP//8M86cOYM//vGPKCgowPz5880RGhEREclglqmH9PR0FBYWIjw8vNG5wsJCWFj8Lz/59ddfERERgZKSEjzyyCPw8fHBsWPHMGjQIHOERkRECtcW3vXwIDFLojB+/Hi9O0ZlZmZKPq9duxZr1641RxhERES6KWz6wBhmfeqBiIiI2ja+FIqIiBSFUw/yMFEgIiJlaYW3R7ZlTBSIiEhhVP8txrRXDq5RICIiIr04okBERMrCqQdZmCgQEZGyMFGQhVMPREREpBdHFIiISFmMfVU0H48kIiJ6ePHtkfJw6oGIiIj04ogCEREpCxczysJEgYiIlIVrFGTh1AMRERHpxREFIiJSFJXwezGmvZIwUSAiImXhGgVZmCgQEZGycI2CLFyjQERERHpxRIGIiJSFUw+yMFEgIiJlYaIgC6ceiIiISC+OKBARkbJwREEWJgpERKQsfOpBFk49EBERkV4cUSAiIkXhzozycESBiIiURTBBkenIkSOYPHkynJ2doVKpkJKS0mybzMxMDB8+HGq1Gn379kVSUlKjOps2bULv3r2h0Wjg6+uLkydPSs5XV1cj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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgEAAAGzCAYAAAC2DMSCAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASz5JREFUeJzt3XtcVGX+B/DPDMIMIhcV5WIoAipeoUBZzBQTBZbNS62S6waSaXkpazZT1/KS+ptcSy0laXe95T1fobbmUjqJl8BcL6SW4SUUSEGxBKEEd+b5/dFycGJAhpkBnPN57+t5vZpznufMd46w8+W5HYUQQoCIiIhkR9nUARAREVHTYBJAREQkU0wCiIiIZIpJABERkUwxCSAiIpIpJgFEREQyxSSAiIhIppgEEBERyRSTACIiIpliEkCyNn78ePj7+zd1GI0iKioKUVFRTfb+CoUC06ZNa7L3J6KamARQk8jNzcW0adPQtWtXtGzZEi1btkSPHj0wdepUnD59uqnDq1VpaSkWLFiAkJAQtGrVCs7OzujVqxdmzpyJq1evmmwzZswYKBQKzJw50+T5jIwMKBQKKBQKbNq0yWSdRx99FAqFAr169bLaZ7GFzMxMzJ8/H7du3WqS9z9x4gT+8Ic/wNvbG61atUKfPn3w3nvvQa/XN0k8RM0dkwBqdHv27EGvXr2wceNGREdHY/ny5Xj33XcRFxeHvXv3IjQ0FFeuXGnqMGv4/vvvERoaioULF6JHjx5YsmQJ3nvvPQwePBhr1qwx+Vd2aWkp/vWvf8Hf3x9bt25FXY/qUKvV2LJlS43jly9fRmZmJtRqtTU/jk1kZmZiwYIFTZIEnDhxAv3798fly5cxc+ZMvPPOOwgICMD06dOh0WgaPR6iB0GLpg6A5OXSpUt4+umn0alTJ+h0Ovj4+BidX7JkCd5//30olXXnp+Xl5XBxcbFlqEb++9//4sknn0RRUREyMjIwYMAAo/OLFy/GkiVLarT7+OOPodfrsXbtWjz++OM4dOgQBg0aZPI9fv/73+OTTz5BcXExPD09peNbtmyBl5cXunTpgp9++sm6H8yOfPDBBwCAQ4cOoU2bNgCA559/HoMGDcL69evx7rvvNmV4RM0SewKoUf3tb39DeXk51q1bVyMBAIAWLVrgpZdegp+fn3Rs/PjxaNWqFS5duoTf//73cHV1xbhx4wAAhw8fxujRo9GxY0eoVCr4+fnhlVdewS+//FLj2rt27UKvXr2gVqvRq1cv7Ny5s95xf/zxx/j6668xZ86cGgkAALi5uWHx4sU1jm/evBlDhw7F4MGD0b17d2zevLnW9xgxYgRUKhV27NhhdHzLli0YM2YMHBwc6h3v3//+dwQGBsLZ2Rn9+vXD4cOHTdarqKjAvHnzEBQUJN2/1157DRUVFUb1qsbzN2/ejG7dukGtViMsLAyHDh2S6syfPx8zZswAAHTu3Fka4rh8+bLRtar+HVQqFXr27In09PR6f666lJaWQq1Ww8PDw+i4j48PnJ2drfIeRPaGPQHUqPbs2YOgoCBERESY1e6///0vYmJiMGDAALz99tto2bIlAGDHjh34+eefMXnyZLRt2xbHjh3DypUrUVBQYPRl+vnnn+Opp55Cjx49oNVqcfPmTSQnJ+Ohhx6q1/t/8sknAIBnnnmm3jFfvXoVBw4cwIYNGwAAY8eOxfLly7Fq1So4OTnVqN+yZUuMGDECW7duxeTJkwEAX3/9Nb755hv885//rPdciTVr1uD5559H//798fLLL+P777/H8OHD0aZNG6PkymAwYPjw4Thy5AgmTZqE7t2748yZM1i+fDnOnz+PXbt2GV334MGD2L59O1566SWoVCq8//77iI2NxbFjx9CrVy88+eSTOH/+PLZu3Yrly5dLvRnt2rWTrnHkyBGkpaVhypQpcHV1xXvvvYennnoKeXl5aNu2LQDg7t27KCkpqddnbdOmjdRrFBUVhe3bt+P555+HRqNBy5Yt8e9//xtpaWlYunRpva5HJDuCqJGUlJQIAGLkyJE1zv3000/ixo0bUvn555+lc0lJSQKAmDVrVo1299arotVqhUKhEFeuXJGOhYaGCh8fH3Hr1i3p2Oeffy4AiE6dOt039ocffli4u7vft9693n77beHs7CxKS0uFEEKcP39eABA7d+40qnfgwAEBQOzYsUPs2bNHKBQKkZeXJ4QQYsaMGSIgIEAIIcSgQYNEz54963zPyspK0b59exEaGioqKiqk43//+98FADFo0CDp2MaNG4VSqRSHDx82ukZqaqoAIL788kvpGAABQBw/flw6duXKFaFWq8WoUaOkY0uXLhUARG5ubo3YAAgnJydx8eJF6djXX38tAIiVK1fWuB/1Kfe+z3//+18xbdo04ejo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iIjo/oQVip0wOwkoLy9HSEgIUlJSTJ7/29/+hvfeew+pqan46quv4OLigpiYGNy5c6fWa27fvh0ajQbz5s3DyZMnERISgpiYGFy/ft3c8IiIiKiezE4C4uLisGjRIowaNarGOSEEVqxYgddffx0jRoxAnz598OGHH+Lq1as1egzutWzZMkycOBHJycno0aMHUlNT0bJlS6xdu9bc8IiIiOrGngCJVScG5ubmorCwENHR0dIxd3d3REREICsry2SbyspKnDhxwqiNUqlEdHR0rW0qKipQWlpqVIiIiOqjak6AJcVeWDUJKCwsBAB4eXkZHffy8pLO/VZxcTH0er1ZbbRaLdzd3aXi5+dnheiJiIjk5YFcIjh79myUlJRIJT8/v6lDIiKiB0XVtsGWFDth1SWC3t7eAICioiL4+PhIx4uKihAaGmqyjaenJxwcHFBUVGR0vKioSLreb6lUKqhUKusETURE8sLNgiRW7Qno3LkzvL29odPppGOlpaX46quvEBkZabKNk5MTwsLCjNoYDAbodLpa2xARETUU5wRUM7snoKysDBcvXpRe5+bmIjs7G23atEHHjh3x8ssvY9GiRejSpQs6d+6MN954A76+vhg5cqTUZsiQIRg1ahSmTZsGANBoNEhKSkJ4eDj69euHFStWoLy8HMnJyZZ/QiIiIjLJ7CTg+PHjGDx4sPRao9EAAJKSkrB+/Xq89tprKC8vx6RJk3Dr1i0MGDAA6enpUKvVUptLly6huLhYep2QkIAbN25g7ty5KCwsRGhoKNLT02tMFiQiIrIYhwMkCiHEA/9xSktL4e7ujo5vLYLynmSDiIgeDIY7d5A363WUlJTAzc3NJu9R9V0R8Mb/wcGC7wr9nTv4fuFfbRprY3kgVwcQERGR5fgAISIikhcOB0iYBBARkbwwCZBwOICIiEim2BNARESyYulaf3vaJ4A9AURERDLFJICIiEimOBxARETywomBEiYBREQkK5wTUI1JABERyY8dfZFbgnMCiIiIZIo9AUREJC+cEyBhEkBERLLCOQHVOBxAREQkU+wJICIieeFwgIRJABERyQqHA6pxOICIiEim2BNARETywuEACZMAIiKSFyYBEg4HEBERNYKUlBT4+/tDrVYjIiICx44dq7VuWloawsPD4eHhARcXF4SGhmLjxo1GdcaPHw+FQmFUYmNjzYqJ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B2Po0KFYuXKlWde9desWOnXqhGXLlmHChAk1zpvqCfDz8+M+AURED6jG3CcguvOLaKG0YJ8AQwX25660aayNxWY9AYcPH0ZOTg62b99udlsPDw907doVFy9eNHlepVJBpWr4PyARERHZcJ+ANWvWICwszKxNC6qUlZXh0qVL8PHxsUFkREQkawZhebETZicBZWVlyM7ORnZ2NgAgNzcX2dnZyMvLk+qUlpZix44deO6550xeY8iQIdLWiQDw6quv4uDBg7h8+TIyMzMxatQoODg4YOzYseaGR0REVDdhsLzYCbOHA44fP47BgwdLrzUaDQAgKSkJ69evBwBs27YNQohav8QvXbqE4uJi6XVBQQHGjh2Lmzdvol27dhgwYACOHj2Kdu3amRseERER1ZPZSUBUVBTuN5dw0qRJmDRpUq3nL1++bPR627Zt5oZBRETUMI28T0Bzxm35iIhIXgwCDVnmZ9zePjAJICIieWFPgIRPESQiIpIp9gQQEZG8CFjYE2C1SJockwAiIpIXDgdIOBxAREQkU+wJICIieTEYAFiw4Y9BxpsFERERPdA4HCDhcAAREZFMsSeAiIjkhT0BEiYBREQkL9wxUMLhACIiIpliTwAREcmKEAYICx4HbEnb5oZJABERyYsQlnXpc04AERHRA0pYOCfAjpIAzgkgIiKSKfYEEBGRvBgMgMKCcX3OCSAiInpAcThAwuEAIiIimWJPABERyYowGCAsGA7gEkEiIqIHFYcDJBwOICIikin2BBARkbwYBKBgTwDAJICIiORGCACWLBG0nySAwwFEREQyxZ4AIiKSFWEQEBYMBwg76glgEkBERPIiDLBsOIBLBImIiB5I7AmoxjkBREREMmUXPQFVWZnhzp0mjoSIiBqi6v+/G+Ov7P+KCou69P+Lu1aMpmkphB30axQUFMDPz6+pwyAiIgvl5+fjoYcessm179y5g86dO6OwsNDia3l7eyM3NxdqtdoKkTUdu0gCDAYDrl69CldXVygUilrrlZaWws/PD/n5+XBzc2vECC3DuBvXgxo38ODGzrgbV3OMWwiB27dvw9fXF0ql7Uaq79y5g8rKSouv4+Tk9MAnAICdDAcolUqzMkc3N7dm84NvDsbduB7UuIEHN3bG3biaW9zu7u42fw+1Wm0XX97WwomBREREMsUkgIiISKZklQSoVCrMmzcP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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgoAAAGzCAYAAABO7D91AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASIZJREFUeJzt3XtcVGX+B/DPcJvxAnhBGTDwFoIIQmKykP28UUCsgbVqrKtIpulK2VJkmIllLZnlJTWpLS+liLEptuZSiuIlMBPQ0krFUPAyoJaAmKAzz+8Pl8mJGeQ4Mwiez7vX83o153yfM985QfPleZ5zjkIIIUBERERkhM2dToCIiIhaLhYKREREZBILBSIiIjKJhQIRERGZxEKBiIiITGKhQERERCaxUCAiIiKTWCgQERGRSSwUiIiIyCQWCiQLEydORI8ePe50Gs1i6NChGDp06B17f4VCgYSEhDv2/kRkWSwUyKpKSkqQkJCAPn36oG3btmjbti18fX0xffp0fPfdd3c6PZOqqqrw6quvIiAgAO3bt0ebNm3g5+eHmTNn4uzZs0b7jBkzBgqFAjNnzjS6Pzc3FwqFAgqFAmvXrjUa88ADD0ChUMDPz89in8Ua8vLyMHfuXFy6dKnZ3/vcuXN46aWXMGzYMDg6OkKhUCA3N9dkfF1dHf75z3/Cx8cHKpUKrq6uiIqKwunTp5svaaJWjIUCWc2WLVvg5+eHTz75BGFhYVi0aBGWLFmCyMhIbN26FYGBgTh16tSdTrOBn3/+GYGBgZg3bx58fX0xf/58vPvuuxg2bBg++ugjo3+tV1VV4T//+Q969OiB9evXo7FHqKhUKqSnpzfYfvLkSeTl5UGlUlny41hFXl4eXn311TtSKBw9ehTz58/HmTNn4O/v32jstWvXEBUVhTfeeAMRERF477338OKLL6Jdu3aorKxspoyJWje7O50A3Z1OnDiBJ554At27d0dOTg7c3NwM9s+fPx/vvfcebGwar1VramrQrl07a6Zq4Pr163jsscdQXl6O3NxcDB482GD/G2+8gfnz5zfo99lnn0Gr1WLlypUYPnw4du/ejSFDhhh9j0ceeQSff/45Lly4ABcXF/329PR0uLq6wsvLC7/++qtlP9hdJCgoCBcvXkSnTp3w73//G6NHjzYZu2jRIuzatQt79+7FoEGDmjFLorsHRxTIKt566y3U1NRg1apVDYoEALCzs8Ozzz4LDw8P/baJEyeiffv2OHHiBB555BE4Ojpi3LhxAIA9e/Zg9OjR8PT0hFKphIeHB/7xj3/gt99+a3DsrKws+Pn5QaVSwc/PD5s2bWpy3p999hkOHTqEl19+uUGRAABOTk544403Gmxft24dHnroIQwbNgx9+/bFunXrTL5HdHQ0lEolMjMzDbanp6djzJgxsLW1bXK+H3zwAXr37o02bdpg0KBB2LNnj9G42tpapKSk4N5779WfvxdffBG1tbUGcfXrC9atWwdvb2+oVCoEBQVh9+7d+pi5c+ciKSkJANCzZ0/9dMrJkycNjlX/30GpVKJfv37Izs5u8udqjKOjIzp16nTLOJ1OhyVLlmDUqFEYNGgQrl+/jitXrlgkByI54YgCWcWWLVtw7733Ijg4WFK/69evIzw8HIMHD8bbb7+Ntm3bAgAyMzNx5coVTJs2DZ07d8b+/fuxdOlSnD592uAL96uvvsLjjz8OX19fpKam4uLFi4iPj8c999zTpPf//PPPAQDjx49vcs5nz57Fzp07sWbNGgBAbGwsFi1ahGXLlsHBwaFBfNu2bREdHY3169dj2rRpAIBDhw7hyJEj+PDDD5u8duOjjz7C008/jdDQUDz33HP4+eef8eijj6JTp04GBZhOp8Ojjz6KvXv3YsqUKejbty++//57LFq0CMeOHUNWVpbBcXft2oUNGzbg2WefhVKpxHvvvYeIiAjs378ffn5+eOyxx3Ds2DGsX78eixYt0o+KdOnSRX+MvXv3YuPGjfj73/8OR0dHvPvuu3j88cdRWlqKzp07A7gxLdDU4f9OnTrdcvTpj3744QecPXsW/fv3x5QpU7BmzRrU1dXB398fS5YswbBhwyQdj0i2BJGFVVZWCgAiJiamwb5ff/1VnD9/Xt+uXLmi3xcXFycAiJdeeqlBv5vj6qWmpgqFQiFOnTql3xYYGCjc3NzEpUuX9Nu++uorAUB07979lrnfd999wtnZ+ZZxN3v77bdFmzZtRFVVlRBCiGPHjgkAYtOmTQZxO3fuFABEZmam2LJli1AoFKK0tFQIIURSUpLo1auXEEKIIUOGiH79+jX6nnV1daJr164iMDBQ1NbW6rd/8MEHAoAYMmSIftsnn3wibGxsxJ49ewyOkZaWJgCIr7/+Wr8NgAAgDhw4oN926tQpoVKpxKhRo/TbFixYIACIkpKSBrkBEA4ODqK4uFi/7dChQwKAWLp0aYPz0ZRm7H2EECIzM1MAEDt37mywb+PGjQKA6Ny5s/Dy8hKrVq0Sq1atEl5eXsLBwUEcOnTI6DGJyBBHFMjiqqqqAADt27dvsG/o0KE4dOiQ/vWCBQvwwgsvGMTU/5V9szZt2uj/vaamBr/99htCQ0MhhEBRURE8PT1x7tw5HDx4EC+99BKcnZ318Q899BB8fX1RU1PTpNwdHR1v/SFvsm7dOkRFRen7eXl5ISgoCOvWrUNMTIzRPg8//DA6deqEjIwMvPDCC8jIyMCECROa/J4HDhxARUUFXnvtNYNRi4kTJ+qnBeplZmaib9++8PHxwYULF/Tbhw8fDgDYuXMnQkND9dtDQkIQFBSkf+3p6Yno6Gj85z//gVarbdLUSFhYGHr37q1/3b9/fzg5OeHnn3/WbwsICMC2bdua9HnVanWT4m52+fJlAEB1dTWKior0oyzDhw/Hvffei7feesvk1SdE9DsWCmRx9V+Y9f+jvtn777+P6upqlJeX429/+1uD/XZ2dkanCUpLSzFnzhx8/vnnDRb61Q9f119B4eXl1aC/t7c3CgsL9a/Pnz8PrVarf92+fXu0b9++wZfZrfz4448oKirChAkTUFxcrN8+dOhQLF++HFVVVXBycmrQz97eHqNHj0Z6ejoGDRqEsrIy/PWvf23y+5r6rPb29ujVq5fBtuPHj+PHH380mBq4WUVFhcFrY+evT58+uHLlCs6fP9+kL21PT88G2zp27Gjw365jx44ICwu75bFuV31x+cADDxhMxXh6emLw4MHIy8uz2nsT3U1YKJDFOTs7w83NDYcPH26wr37Nwh8XvtVTKpUN5qK1Wi0eeugh/PLLL5g5cyZ8fHzQrl07nDlzBhMnToROp5Oc4/33329waWZKSgrmzp0LHx8fFBUVoayszODLxZT6v0j/8Y9/4B//+EeD/Z999hni4+ON9v3rX/+KtLQ0zJ07FwEBAfD19ZX8OZpCp9PB398fCxcuNLq/KZ9TKlOjDuKmy0br6urwyy+/NOl4Xbp0kbTIEwDc3d0BAK6urg32de3aFUVFRZKORyRXLBTIKqKiovDhhx9i//79Zl+W9v333+PYsWNYs2aNwfD8H4etu3fvDuDGX9B/dPToUYPX69atM7hiov6v8JEjR2L9+vVYu3YtkpOTG81LCIH09HQMGzYMf//73xvsnzdvHtatW2eyUBg8eDA8PT2Rm5tr9JLLxtz8WeunEIAbCwRLSkoQEBCg39a7d28cOnQII0aMgEKhuOWxjZ2/Y8eOoW3btvpRiaYc51by8vKavKCwpKRE8p01/f39YW9vjzNnzjTYd/bsWZMjLERkiIUCWcWLL76I9PR0PPnkk8jJyWnwV51o5IZEf1T/l+TNfYQQWLJkiUGcm5sbAgMDsWbNGoN1Ctu2bcMPP/yg/3IFbgxHG/OXv/wFqampeOONNzB06FCEhIQY7K+ursabb76JN954A19//TVOnjyJ1157DX/5y18aHOvYsWN45ZVXcPbsWf1ftzdTKBR49913UVRUJOkqCwAYOHAgunTpgrS0NMTHx+vXKaxevbrBTZDGjBmDrVu34l//+hemTJlisO+3336DTqczuFdFfn4+CgsLMWDAAABAWVkZNm/ejIiICP1/i/p4c264ZO01Co6OjnjkkUewZcsW/PTTT/Dx8QFwY7ooLy8PTz/9tORjEskRCwWyCi8vL6SnpyM2Nhbe3t4YN24cAgICIIRASUkJ0tPTYWNj06TLFn18fNC7d2+88MILOHPmDJycnPDZZ58ZvSlRamoqoqKiMHjwYDz55JP45ZdfsHTpUvTr18/omok/sre3x8aNGxEWFob/+7//w5gxY/DAAw/A3t4eR44cQXp6Ojp27Ig33ngD69atg62tLaKioowe69FHH8XLL7+MjIwMJCYmGo2Jjo5GdHT0LfMylufrr7+Op59+GsOHD8fYsWNRUlKCVatWNVijMH78eHz66aeYOnUqdu7ciQceeABarRY//fQTPv30U3z55ZcYOHCgPt7Pzw/h4eEGl0cCwKuvvqqPqV/s+PLLL+OJJ56Avb09Ro4cKenmWOasUXj99dcBAEeOHAEAfPLJJ9i7dy8AYPbs2fq4f/7zn8jJycHw4cPx7LPPAgDeffdddOrUCbNmzbqt9yaSnTt4xQXJQHFxsZg2bZq49957hUqlEm3atBE+Pj5i6tSp4uDBgwaxcXFxol27dkaP88MPP4iwsDDRvn174eLiIiZPnqy/5G7VqlUGsZ999pno27evUCqVwtfXV2zcuFHExcU16fLIer/++quYM2eO8Pf3F23bthUqlUr4+fmJ5ORkce7cOVFXVyc6d+4sHnzwwUaP07NnT3HfffcJIQwvj2xMUy6PrPfee++Jnj17CqVSKQYOHCh2794thgwZYnB5pBA3LqecP3++6Nevn1AqlaJjx44iKChIvPrqq6KyslIfB0BMnz5drF27Vnh5eQmlUinuu+8+o5cfzps3T3Tr1k3Y2NgYXMJYf4w/6t69u4iLi2vS57oVNHIp5R8VFBSIsLAw0a5dO+Ho6Ciio6PFsWPHLJIHkRwohJAwBkxEdzWFQoHp06dj2bJldzoVImoheAtnIiIiMomFAhEREZnEQoGIiIhM4lUPRKTHJUtE9EccUSAiIiKTWCgQERGRSXfF1INOp8PZs2fh6OhokVvLEhFR8xJCoLq6Gu7u7g2e92JJV69eRV1dndnHcXBwgEqlskBGLd9dUSicPXvWKg+2ISKi5lVWVtakO7bejqtXr6Jn9/bQVGhvHXwLarUaJSUlsigW7opCof6xxvekzIaNDP6jERHdbXRXr+L0q6/r/39uDXV1ddBUaFFS0B1Ojrc/alFVrUPPoFOoq6tjodBa1E832KhULBSIiFqx5pg+dnK0MatQkJu7olAgIiJqKq3QQWvGlcBaobNcMq0ACwUiIpIVHQR0uP1KwZy+rZHVxl6WL1+OHj16QKVSITg4GPv37280PjMzEz4+PlCpVPD398fWrVutlRoREcmYzgL/yIlVCoUNGzYgMTERKSkpKCwsREBAAMLDw1FRUWE0Pi8vD7GxsZg0aRKKiooQExODmJgYHD582BrpERERURNZpVBYuHAhJk+ejPj4ePj6+iItLQ1t27bFypUrjcYvWbIEERERSEpKQt++fTFv3jwMGDCAj7olIiKL0wphdpMTixcKdXV1KCgoQFhY2O9vYmODsLAw5OfnG+2Tn59vEA8A4eHhJuNra2tRVVVl0IiIiJqifo2COU1OLF4oXLhwAVqtFq6urgbbXV1dodFojPbRaDSS4lNTU+Hs7KxvvNkSERGRdbTKC0mTk5NRWVmpb2VlZXc6JSIiaiV0ENCa0eQ2omDxyyNdXFxga2uL8vJyg+3l5eVQq9VG+6jVaknxSqUSSqXSMgkTEZGs8PJIaSw+ouDg4ICgoCDk5OTot+l0OuTk5CAkJMRon5CQEIN4ANi2bZvJeCIiImoeVrnhUmJiIuLi4jBw4EAMGjQIixcvRk1NDeLj4wEAEyZMQLdu3ZCamgoAmDFjBoYMGYJ33nkHUVFRyMjIwIEDB/DBBx9YIz0iIpIxc69ckNtVD1YpFMaOHYvz589jzpw50Gg0CAwMRHZ2tn7BYmlpqcFjRENDQ5Geno7Zs2dj1qxZ8PLyQlZWFvz8/KyRHhERyZjuf82c/nKiEKL1l0ZVVVVwdnaGZ+rrfCgUEVErpLt6FaXJs1FZWQknJyervEf9d8VPP7rC0YyHQlVX6+DTt9yqubYkfNYDERHJSv3VC+b0lxMWCkREJCtaATOfHmm5XFoDFgpERCQrXKMgTau84RIRERE1D44oEBGRrOiggBYKs/rLCQsFIiKSFZ240czpLyeceiAiIiKTOKJARESyojVz6sGcvq0RCwUiIpIVFgrScOqBiIiITOKIAhERyYpOKKATZlz1YEbf1oiFAhERyQqnHqTh1AMRERGZxBEFIiKSFS1soDXj72StBXNpDVgoEBGRrAgz1ygIrlEgIiK6e3GNgjRco0BEREQmcUSBiIhkRStsoBVmrFGQ2bMeWCgQEZGs6KCAzowBdR3kVSlw6oGIiIhM4ogCERHJChczSsNCgYiIZMX8NQqceiAiIiICwBEFIiKSmRuLGc14KBSnHoiIiO5eOjNv4cyrHoiIiIj+hyMKREQkK1zMKA0LBSIikhUdbHjDJQlYKBARkaxohQJaM54AaU7f1ohrFIiIiMgkjigQEZGsaM286kErs6kHjigQEZGs6ISN2e12LF++HD169IBKpUJwcDD279/faHxmZiZ8fHygUqng7++PrVu3GuyfOHEiFAqFQYuIiDCI+eWXXzBu3Dg4OTmhQ4cOmDRpEi5fviwpbxYKREREVrZhwwYkJiYiJSUFhYWFCAgIQHh4OCoqKozG5+XlITY2FpMmTUJRURFiYmIQExODw4cPG8RFRETg3Llz+rZ+/XqD/ePGjcORI0ewbds2bNmyBbt378aUKVMk5c5CgYiIZKV+6sGcJtXChQsxefJkxMfHw9fXF2lpaWjbti1WrlxpNH7JkiWIiIhAUlIS+vbti3nz5mHAgAFYtmyZQZxSqYRarda3jh076vf9+OOPyM7Oxocffojg4GAMHjwYS5cuRUZGBs6ePdvk3FkoEBGRrOjw+5UPt9N0/ztOVVWVQautrTX6fnV1dSgoKEBYWJh+m42NDcLCwpCfn2+0T35+vkE8AISHhzeIz83NRdeuXeHt7Y1p06bh4sWLBsfo0KEDBg4cqN8WFhYGGxsbfPPNN00+XxYvFFJTU3H//ffD0dERXbt2RUxMDI4ePdpon9WrVzeYZ1GpVJZOjYiIyGI8PDzg7Oysb6mpqUbjLly4AK1WC1dXV4Ptrq6u0Gg0RvtoNJpbxkdERODjjz9GTk4O5s+fj127diEyMhJarVZ/jK5duxocw87ODp06dTL5vsZY/KqHXbt2Yfr06bj//vtx/fp1zJo1Cw8//DB++OEHtGvXzmQ/Jycng4JCoZDXdapERNQ8zL/h0o2+ZWVlcHJy0m9XKpVm5ybFE088of93f39/9O/fH71790Zubi5GjBhhsfexeKGQnZ1t8Hr16tXo2rUrCgoK8H//938m+ykUCqjVakunQ0REZMD8Wzjf6Ovk5GRQKJji4uICW1tblJeXG2wvLy83+b2nVqslxQNAr1694OLiguLiYowYMQJqtbrBYsnr16/jl19+kfR9a/U1CpWVlQCATp06NRp3+fJldO/eHR4eHoiOjsaRI0dMxtbW1jaYGyIiImqJHBwcEBQUhJycHP02nU6HnJwchISEGO0TEhJiEA8A27ZtMxkPAKdPn8bFixfh5uamP8alS5dQUFCgj9mxYwd0Oh2Cg4ObnL9VCwWdTofnnnsODzzwAPz8/EzGeXt7Y+XKldi8eTPWrl0LnU6H0NBQnD592mh8amqqwbyQh4eHtT4CERHdZXRQmN2kSkxMxL/+9S+sWbMGP/74I6ZNm4aamhrEx8cDACZMmIDk5GR9/IwZM5CdnY133nkHP/30E+bOnYsDBw4gISEBwI0/rpOSkrBv3z6cPHkSOTk5iI6Oxr333ovw8HAAQN++fREREYHJkydj//79+Prrr5GQkIAnnngC7u7uTc7dqndmnD59Og4fPoy9e/c2GhcSEmJQJYWGhqJv3754//33MW/evAbxycnJSExM1L+uqqpisUBERE1iqakHKcaOHYvz589jzpw50Gg0CAwMRHZ2tn7BYmlpKWxsfj9uaGgo0tPTMXv2bMyaNQteXl7IysrS/9Fta2uL7777DmvWrMGlS5fg7u6Ohx9+GPPmzTNYK7Fu3TokJCRgxIgRsLGxweOPP453331XUu4KIazzvMyEhARs3rwZu3fvRs+ePSX3Hz16NOzs7BrcPMKYqqoqODs7wzP1ddjwagkiolZHd/UqSpNno7Kysknz/rej/rvi7QOD0ab97f+d/Nvl63hh4F6r5tqSWHzqQQiBhIQEbNq0CTt27LitIkGr1eL777/Xz7MQERHRnWHxqYfp06cjPT0dmzdvhqOjo/5aTWdnZ7Rp0wbAjbmYbt266a85fe211/CnP/0J9957Ly5duoQFCxbg1KlTeOqppyydHhERyZxOKKAz41HR5vRtjSxeKKxYsQIAMHToUIPtq1atwsSJEwE0nIv59ddfMXnyZGg0GnTs2BFBQUHIy8uDr6+vpdMjIiKZ05n59Ehz7sHQGlm8UGjKkofc3FyD14sWLcKiRYssnQoRERGZyapXPRAREbU05jwqur6/nLBQICIiWdFCAe1t3Avh5v5yIq+yiIiIiCThiAIREckKpx6kYaFARESyooV50wday6XSKsirLCIiIiJJOKJARESywqkHaVgoEBGRrNyJh0K1ZiwUiIhIVsRtPir65v5yIq+yiIiIiCThiAIREckKpx6kYaFARESywqdHSiOvsoiIiIgk4YgCERHJitbMx0yb07c1YqFARESywqkHaeRVFhEREZEkHFEgIiJZ0cEGOjP+Tjanb2vEQoGIiGRFKxTQmjF9YE7f1kheZRERERFJwhEFIiKSFS5mlIaFAhERyYow8+mRgndmJCIiuntpoYDWjAc7mdO3NZJXWURERESScESBiIhkRSfMW2egExZMphVgoUBERLKiM3ONgjl9WyN5fVoiIiKShCMKREQkKzoooDNjQaI5fVsjFgpERCQrvDOjNJx6ICIiIpM4okBERLLCxYzSsFAgIiJZ0cHMWzjLbI2CvMoiIiIikoQjCkREJCvCzKsehMxGFFgoEBGRrPDpkdKwUCAiIlnhYkZpLP5p586dC4VCYdB8fHwa7ZOZmQkfHx+oVCr4+/tj69atlk6LiIiIboNVyqJ+/frh3Llz+rZ3716TsXl5eYiNjcWkSZNQVFSEmJgYxMTE4PDhw9ZIjYiIZK5+6sGcJidWKRTs7OygVqv1zcXFxWTskiVLEBERgaSkJPTt2xfz5s3DgAEDsGzZMmukRkREMld/C2dzmpxYpVA4fvw43N3d0atXL4wbNw6lpaUmY/Pz8xEWFmawLTw8HPn5+Sb71NbWoqqqyqARERGR5Vm8UAgODsbq1auRnZ2NFStWoKSkBA8++CCqq6uNxms0Gri6uhpsc3V1hUajMfkeqampcHZ21jcPDw+LfgYiIrp7cepBGosXCpGRkRg9ejT69++P8PBwbN26FZcuXcKnn35qsfdITk5GZWWlvpWVlVns2EREdHdjoSCN1S+P7NChA/r06YPi4mKj+9VqNcrLyw22lZeXQ61WmzymUqmEUqm0aJ5ERETUkNUvBr18+TJOnDgBNzc3o/tDQkKQk5NjsG3btm0ICQmxdmpERCRDHFGQxuKFwgsvvIBdu3bh5MmTyMvLw6hRo2Bra4vY2FgAwIQJE5CcnKyPnzFjBrKzs/HOO+/gp59+wty5c3HgwAEkJCRYOjUiIiIWChJZfOrh9OnTiI2NxcWLF9GlSxcMHjwY+/btQ5cuXQAApaWlsLH5vT4JDQ1Feno6Zs+ejVmzZsHLywtZWVnw8/OzdGpEREQkkcULhYyMjEb35+bmNtg2evRojB492tKpEBERNSBg3qOiheVSaRX4rAciIpIVPhRKGhYKREQkKywUpJHXI7CIiIhIEo4oEBGRrHBEQRoWCkREJCssFKTh1AMRERGZxBEFIiKSFSEUEGaMCpjTtzVioUBERLKig8Ks+yiY07c14tQDERERmcQRBSIikhUuZpSGhQIREckK1yhIw6kHIiIiMokjCkREJCucepCGhQIREckKpx6kYaFARESyIswcUZBbocA1CkRERGQSRxSIiEhWBAAhzOsvJywUiIhIVnRQQME7MzYZpx6IiIiawfLly9GjRw+oVCoEBwdj//79jcZnZmbCx8cHKpUK/v7+2Lp1q8nYqVOnQqFQYPHixQbbjx07hujoaLi4uMDJyQmDBw/Gzp07JeXNQoGIiGSl/qoHc5pUGzZsQGJiIlJSUlBYWIiAgACEh4ejoqLCaHxeXh5iY2MxadIkFBUVISYmBjExMTh8+HCD2E2bNmHfvn1wd3dvsO/Pf/4zrl+/jh07dqCgoAABAQH485//DI1G0+TcWSgQEZGs1N9HwZwm1cKFCzF58mTEx8fD19cXaWlpaNu2LVauXGk0fsmSJYiIiEBSUhL69u2LefPmYcCAAVi2bJlB3JkzZ/DMM89g3bp1sLe3N9h34cIFHD9+HC+99BL69+8PLy8vvPnmm7hy5YrRgsMUFgpERES3oaqqyqDV1tYajaurq0NBQQHCwsL022xsbBAWFob8/HyjffLz8w3iASA8PNwgXqfTYfz48UhKSkK/fv0aHKNz587w9vbGxx9/jJqaGly/fh3vv/8+unbtiqCgoCZ/ThYKREQkK0KY3wDAw8MDzs7O+paammr0/S5cuACtVgtXV1eD7a6urianADQazS3j58+fDzs7Ozz77LNGj6FQKLB9+3YUFRXB0dERKpUKCxcuRHZ2Njp27NjU08WrHoiISF4sdWfGsrIyODk56bcrlUqzc2uqgoICLFmyBIWFhVAojH8WIQSmT5+Orl27Ys+ePWjTpg0+/PBDjBw5Et9++y3c3Nya9F4cUSAiIroNTk5OBs1UoeDi4gJbW1uUl5cbbC8vL4darTbaR61WNxq/Z88eVFRUwNPTE3Z2drCzs8OpU6fw/PPPo0ePHgCAHTt2YMuWLcjIyMADDzyAAQMG4L333kObNm2wZs2aJn9OFgpERCQrzX3Vg4ODA4KCgpCTk6PfptPpkJOTg5CQEKN9QkJCDOIBYNu2bfr48ePH47vvvsPBgwf1zd3dHUlJSfjyyy8BAFeuXAFwYz3EzWxsbKDT6ZqcP6ceiIhIVnRCAUUzPz0yMTERcXFxGDhwIAYNGoTFixejpqYG8fHxAIAJEyagW7du+nUOM2bMwJAhQ/DOO+8gKioKGRkZOHDgAD744AMANxYqdu7c2eA97O3toVar4e3tDeBGsdGxY0fExcVhzpw5aNOmDf71r3+hpKQEUVFRTc6dhQIREcnKzQsSb7e/VGPHjsX58+cxZ84caDQaBAYGIjs7W79gsbS01OAv/9DQUKSnp2P27NmYNWsWvLy8kJWVBT8/vya/p4uLC7Kzs/Hyyy9j+PDhuHbtGvr164fNmzcjICCgycdRCGHO6WoZqqqq4OzsDM/U12GjUt3pdIiISCLd1asoTZ6NyspKgwWCllT/XdFn3UuwbXv7Cw+1V2pxbNybVs21JeGIAhERycqNEQVzrnqwYDKtAAsFIiKSFUtdHikXvOqBiIiITOKIAhERyYr4XzOnv5ywUCAiIlnh1IM0nHogIiIikziiQERE8sK5B0ksPqLQo0cPKBSKBm369OlG41evXt0gVsV7IRARkbWYe/tmmU09WHxE4dtvv4VWq9W/Pnz4MB566CGMHj3aZB8nJyccPXpU/9rUk7CIiIjMdSfuzNiaWbxQ6NKli8HrN998E71798aQIUNM9lEoFCafoEVERER3jlUXM9bV1WHt2rV48sknGx0luHz5Mrp37w4PDw9ER0fjyJEjjR63trYWVVVVBo2IiKgpmvvpka2dVQuFrKwsXLp0CRMnTjQZ4+3tjZUrV2Lz5s1Yu3YtdDodQkNDcfr0aZN9UlNT4ezsrG8eHh5WyJ6IiO5K9esMzGkyYtVC4aOPPkJkZCTc3d1NxoSEhGDChAkIDAzEkCFDsHHjRnTp0gXvv/++yT7JycmorKzUt7KyMmukT0REJHtWuzzy1KlT2L59OzZu3Cipn729Pe677z4UFxebjFEqlVAqb//JX0REJF9czCiN1UYUVq1aha5duyIqKkpSP61Wi++//x5ubm5WyoyIiGRNWKDJiFUKBZ1Oh1WrViEuLg52doaDFhMmTEBycrL+9WuvvYavvvoKP//8MwoLC/G3v/0Np06dwlNPPWWN1IiIiEgCq0w9bN++HaWlpXjyyScb7CstLYWNze/1ya+//orJkydDo9GgY8eOCAoKQl5eHnx9fa2RGhERyRyf9SCNVQqFhx9+GMLEJE5ubq7B60WLFmHRokXWSIOIiMg4mU0fmIMPhSIiIiKT+FAoIiKSFU49SMNCgYiI5IVPj5SEhQIREcmM4n/NnP7ywTUKREREZBJHFIiISF449SAJCwUiIpIXFgqScOqBiIiITOKIAhERyYu5j4rm5ZFERER3Lz49UhpOPRAREZFJHFEgIiJ54WJGSVgoEBGRvHCNgiSceiAiIiKTOKJARESyohA3mjn95YSFAhERyQvXKEjCQoGIiOSFaxQk4RoFIiIiMokjCkREJC+cepCEhQIREckLCwVJOPVAREREJnFEgYiI5IUjCpKwUCAiInnhVQ+ScOqBiIiITOKIAhERyQrvzCgNCwUiIpIXrlGQhFMPREREZBILBSIiIjKJUw9ERCQrCpi5RsFimbQOLBSIiEheeHmkJJx6ICIiIpM4okBERPLCqx4kYaFARETywkJBEk49EBERkUkcUSAiIlnhnRmlkTyisHv3bowcORLu7u5QKBTIysoy2C+EwJw5c+Dm5oY2bdogLCwMx48fv+Vxly9fjh49ekClUiE4OBj79++XmhoREdGtCQs0GZFcKNTU1CAgIADLly83uv+tt97Cu+++i7S0NHzzzTdo164dwsPDcfXqVZPH3LBhAxITE5GSkoLCwkIEBAQgPDwcFRUVUtMjIiIiC5JcKERGRuL111/HqFGjGuwTQmDx4sWYPXs2oqOj0b9/f3z88cc4e/Zsg5GHmy1cuBCTJ09GfHw8fH19kZaWhrZt22LlypVS0yMiImocRxQksehixpKSEmg0GoSFhem3OTs7Izg4GPn5+Ub71NXVoaCgwKCPjY0NwsLCTPapra1FVVWVQSMiImqK+jUK5jQ5sWihoNFoAACurq4G211dXfX7/ujChQvQarWS+qSmpsLZ2VnfPDw8LJA9ERER/VGrvDwyOTkZlZWV+lZWVnanUyIiotai/hbO5jQZsejlkWq1GgBQXl4ONzc3/fby8nIEBgYa7ePi4gJbW1uUl5cbbC8vL9cf74+USiWUSqVlkiYiInnhDZckseiIQs+ePaFWq5GTk6PfVlVVhW+++QYhISFG+zg4OCAoKMigj06nQ05Ojsk+REREt4trFKSRPKJw+fJlFBcX61+XlJTg4MGD6NSpEzw9PfHcc8/h9ddfh5eXF3r27IlXXnkF7u7uiImJ0fcZMWIERo0ahYSEBABAYmIi4uLiMHDgQAwaNAiLFy9GTU0N4uPjzf+EREREdNskFwoHDhzAsGHD9K8TExMBAHFxcVi9ejVefPFF1NTUYMqUKbh06RIGDx6M7OxsqFQqfZ8TJ07gwoUL+tdjx47F+fPnMWfOHGg0GgQGBiI7O7vBAkciIiKzcepBEoUQotV/5KqqKjg7O8Mz9XXY3FSQEBFR66C7ehWlybNRWVkJJycnq7xH/XdFr1f+CVszviu0V6/i53mzrJprS9Iqr3ogIiKi5sGHQhERkbxw6kESFgpERCQvLBQk4dQDERERmcRCgYiIZOVO3Udh+fLl6NGjB1QqFYKDg7F///5G4zMzM+Hj4wOVSgV/f39s3brVZOzUqVOhUCiwePHiBvu++OILBAcHo02bNujYsaPB7QqagoUCERGRlW3YsAGJiYlISUlBYWEhAgICEB4ejoqKCqPxeXl5iI2NxaRJk1BUVISYmBjExMTg8OHDDWI3bdqEffv2wd3dvcG+zz77DOPHj0d8fDwOHTqEr7/+Gn/9618l5c5CgYiIyMoWLlyIyZMnIz4+Hr6+vkhLS0Pbtm2xcuVKo/FLlixBREQEkpKS0LdvX8ybNw8DBgzAsmXLDOLOnDmDZ555BuvWrYO9vb3BvuvXr2PGjBlYsGABpk6dij59+sDX1xdjxoyRlDsLBSIikhdhgYYb92W4udXW1hp9u7q6OhQUFCAsLEy/zcbGBmFhYcjPzzfaJz8/3yAeAMLDww3idTodxo8fj6SkJPTr16/BMQoLC3HmzBnY2Njgvvvug5ubGyIjI42OSjSGhQIREcmKpdYoeHh4wNnZWd9SU1ONvt+FCxeg1Wob3G3Y1dUVGo3GaB+NRnPL+Pnz58POzg7PPvus0WP8/PPPAIC5c+di9uzZ2LJlCzp27IihQ4fil19+adK5Anh5JBERyZEFLnEsKyszuDNjcz7VuKCgAEuWLEFhYSEUCuOPvdbpdACAl19+GY8//jgAYNWqVbjnnnuQmZmJp59+uknvxREFIiKi2+Dk5GTQTBUKLi4usLW1RXl5ucH28vJyqNVqo33UanWj8Xv27EFFRQU8PT1hZ2cHOzs7nDp1Cs8//zx69OgBAHBzcwMA+Pr66o+hVCrRq1cvlJaWNvlzslAgIiJ5sdAahaZycHBAUFAQcnJy9Nt0Oh1ycnIQEhJitE9ISIhBPABs27ZNHz9+/Hh89913OHjwoL65u7sjKSkJX375JQAgKCgISqUSR48e1R/j2rVrOHnyJLp3797k/Dn1QEREsmLOvRDq+0uVmJiIuLg4DBw4EIMGDcLixYtRU1OD+Ph4AMCECRPQrVs3/TqHGTNmYMiQIXjnnXcQFRWFjIwMHDhwAB988AEAoHPnzujcubPBe9jb20OtVsPb2xvAjRGPqVOnIiUlBR4eHujevTsWLFgAABg9enSTc2ehQEREZGVjx47F+fPnMWfOHGg0GgQGBiI7O1u/YLG0tBQ2Nr8P8oeGhiI9PR2zZ8/GrFmz4OXlhaysLPj5+Ul63wULFsDOzg7jx4/Hb7/9huDgYOzYsQMdO3Zs8jH4mGkiIrrjmvMx015J/4St0ozHTNdexfEF8nnMNEcUiIhIVu7E1ENrxsWMREREZBJHFIiISF74mGlJWCgQEZG8sFCQhFMPREREZBJHFIiISFa4mFEaFgpERCQvnHqQhIUCERHJCwsFSbhGgYiIiEziiAIREckK1yhIw0KBiIjkhVMPknDqgYiIiEziiAIREckKpx6kYaFARETywqkHSTj1QERERCZxRIGIiOSFIwqSsFAgIiJZUfyvmdNfTjj1QERERCZxRIGIiOSFUw+SsFAgIiJZ4eWR0kieeti9ezdGjhwJd3d3KBQKZGVl6fddu3YNM2fOhL+/P9q1awd3d3dMmDABZ8+ebfSYc+fOhUKhMGg+Pj6SPwwREdEtCQs0GZFcKNTU1CAgIADLly9vsO/KlSsoLCzEK6+8gsLCQmzcuBFHjx7Fo48+esvj9uvXD+fOndO3vXv3Sk2NiIiILEzy1ENkZCQiIyON7nN2dsa2bdsMti1btgyDBg1CaWkpPD09TSdiZwe1Wi01HSIiIulkNipgDqtf9VBZWQmFQoEOHTo0Gnf8+HG4u7ujV69eGDduHEpLS03G1tbWoqqqyqARERE1Rf0aBXOanFi1ULh69SpmzpyJ2NhYODk5mYwLDg7G6tWrkZ2djRUrVqCkpAQPPvggqqurjcanpqbC2dlZ3zw8PKz1EYiIiGTNaoXCtWvXMGbMGAghsGLFikZjIyMjMXr0aPTv3x/h4eHYunUrLl26hE8//dRofHJyMiorK/WtrKzMGh+BiIjuRlzMKIlVLo+sLxJOnTqFHTt2NDqaYEyHDh3Qp08fFBcXG92vVCqhVCotkSoREckML4+UxuIjCvVFwvHjx7F9+3Z07txZ8jEuX76MEydOwM3NzdLpERERkQSSC4XLly/j4MGDOHjwIACgpKQEBw8eRGlpKa5du4a//OUvOHDgANatWwetVguNRgONRoO6ujr9MUaMGIFly5bpX7/wwgvYtWsXTp48iby8PIwaNQq2traIjY01/xMSERHdjFMPkkieejhw4ACGDRumf52YmAgAiIuLw9y5c/H5558DAAIDAw367dy5E0OHDgUAnDhxAhcuXNDvO336NGJjY3Hx4kV06dIFgwcPxr59+9ClSxep6RERETWKUw/SSC4Uhg4dCiFMn6XG9tU7efKkweuMjAypaRAREVEz4LMeiIhIXvhQKElYKBARkbywUJCEhQIREckK1yhIY/VbOBMREVHrxREFIiKSF049SMJCgYiIZEUhBBRNuEKvsf5ywqkHIiIiMokjCkREJC+cepCEhQIREckKr3qQhlMPREREZBJHFIiISF449SAJCwUiIpIVTj1Iw6kHIiIiMokjCkREJC+cepCEhQIREckKpx6kYaFARETywhEFSbhGgYiIiEziiAIREcmO3KYPzMFCgYiI5EWIG82c/jLCqQciIiIyiSMKREQkK7zqQRoWCkREJC+86kESTj0QERGRSRxRICIiWVHobjRz+ssJCwUiIpIXTj1IwqkHIiIiMokjCkREJCu86kEaFgpERCQvvOGSJCwUiIhIVjiiIA3XKBAREZFJHFEgIiJ54VUPkrBQICIiWeHUgzSceiAiIiKTOKJARETywqseJGGhQEREssKpB2kkTz3s3r0bI0eOhLu7OxQKBbKysgz2T5w4EQqFwqBFRETc8rjLly9Hjx49oFKpEBwcjP3790tNjYiIiCxMcqFQU1ODgIAALF++3GRMREQEzp07p2/r169v9JgbNmxAYmIiUlJSUFhYiICAAISHh6OiokJqekRERI0TFmgyInnqITIyEpGRkY3GKJVKqNXqJh9z4cKFmDx5MuLj4wEAaWlp+OKLL7By5Uq89NJLUlMkIiIyiVMP0ljlqofc3Fx07doV3t7emDZtGi5evGgytq6uDgUFBQgLC/s9KRsbhIWFIT8/32if2tpaVFVVGTQiIqKWTOoUe2ZmJnx8fKBSqeDv74+tW7eajJ06dSoUCgUWL15sdH9tbS0CAwOhUChw8OBBSXlbvFCIiIjAxx9/jJycHMyfPx+7du1CZGQktFqt0fgLFy5Aq9XC1dXVYLurqys0Go3RPqmpqXB2dtY3Dw8PS38MIiK6W+mE+U0iqVPseXl5iI2NxaRJk1BUVISYmBjExMTg8OHDDWI3bdqEffv2wd3d3eT7v/jii43ub4zFC4UnnngCjz76KPz9/RETE4MtW7bg22+/RW5ursXeIzk5GZWVlfpWVlZmsWMTEdFdzkJrFP44sl1bW2vyLW+eYvf19UVaWhratm2LlStXGo1fsmQJIiIikJSUhL59+2LevHkYMGAAli1bZhB35swZPPPMM1i3bh3s7e2NHuu///0vvvrqK7z99ttNOz9/YPUbLvXq1QsuLi4oLi42ut/FxQW2trYoLy832F5eXm5ynYNSqYSTk5NBIyIiagoFfl+ncFvtf8fx8PAwGN1OTU01+n63M8Wen59vEA8A4eHhBvE6nQ7jx49HUlIS+vXrZ/Q45eXlmDx5Mj755BO0bdu26SfpJlYvFE6fPo2LFy/Czc3N6H4HBwcEBQUhJydHv02n0yEnJwchISHWTo+IiOi2lJWVGYxuJycnG427nSl2jUZzy/j58+fDzs4Ozz77rNFjCCEwceJETJ06FQMHDpTy0QxIvurh8uXLBqMDJSUlOHjwIDp16oROnTrh1VdfxeOPPw61Wo0TJ07gxRdfxL333ovw8HB9nxEjRmDUqFFISEgAACQmJiIuLg4DBw7EoEGDsHjxYtTU1OivgiAiIrIYC92Z8U6OaBcUFGDJkiUoLCyEQqEwGrN06VJUV1ebLGCaSnKhcODAAQwbNkz/OjExEQAQFxeHFStW4LvvvsOaNWtw6dIluLu74+GHH8a8efOgVCr1fU6cOIELFy7oX48dOxbnz5/HnDlzoNFoEBgYiOzs7AbVFBERkbma+/LI25liV6vVjcbv2bMHFRUV8PT01O/XarV4/vnnsXjxYpw8eRI7duxAfn6+wfcvAAwcOBDjxo3DmjVrmpS/QojWf9PqqqoqODs7wzP1ddioVHc6HSIikkh39SpKk2ejsrLSan+l139XDB4+F3Z2t/9dcf36VezdMVdSrsHBwRg0aBCWLl0K4MYUu6enJxISEozeL2js2LG4cuUK/vOf/+i3hYaGon///khLS8PFixdx7tw5gz7h4eEYP3484uPj4e3tjdLSUoPbB5w9exbh4eH497//jeDgYNxzzz1Nyp3PeiAiInkx9+6Kt9H3VlPsEyZMQLdu3fQLImfMmIEhQ4bgnXfeQVRUFDIyMnDgwAF88MEHAIDOnTujc+fOBu9hb28PtVoNb29vADAYbQCA9u3bAwB69+7d5CIBYKFAREQyoxACCjMG02+n762m2EtLS2Fj8/v1BaGhoUhPT8fs2bMxa9YseHl5ISsrC35+fred9+3i1AMREd1xzTn18ODQFLOnHvbkvmrVXFsSjigQEZG86P7XzOkvIywUiIhIVu7E1ENrZvUbLhEREVHrxREFIiKSlztw1UNrxkKBiIjkxUJ3ZpQLFgpERCQrzX1nxtaOaxSIiIjIJI4oEBGRvHDqQRIWCkREJCsK3Y1mTn854dQDERERmcQRBSIikhdOPUjCQoGIiOSF91GQhFMPREREZBJHFIiISFb4rAdpWCgQEZG8cI2CJJx6ICIiIpM4okBERPIiAJhzLwR5DSiwUCAiInnhGgVpWCgQEZG8CJi5RsFimbQKXKNAREREJnFEgYiI5IVXPUjCQoGIiORFB0BhZn8Z4dQDERERmcQRBSIikhVe9SANCwUiIpIXrlGQhFMPREREZBJHFIiISF44oiAJCwUiIpIXFgqScOqBiIiITOKIAhERyQvvoyAJCwUiIpIVXh4pDQsFIiKSF65RkETyGoXdu3dj5MiRcHd3h0KhQFZWlsF+hUJhtC1YsMDkMefOndsg3sfHR/KHISIiIsuSPKJQU1ODgIAAPPnkk3jsscca7D937pzB6//+97+YNGkSHn/88UaP269fP2zfvv33xOw42EFERFagE4DCjFEBnbxGFCR/G0dGRiIyMtLkfrVabfB68+bNGDZsGHr16tV4InZ2DfoSERFZHKceJLHq5ZHl5eX44osvMGnSpFvGHj9+HO7u7ujVqxfGjRuH0tJSk7G1tbWoqqoyaERERGR5Vi0U1qxZA0dHR6NTFDcLDg7G6tWrkZ2djRUrVqCkpAQPPvggqqurjcanpqbC2dlZ3zw8PKyRPhER3ZXE76MKt9PAEQWLWblyJcaNGweVStVoXGRkJEaPHo3+/fsjPDwcW7duxaVLl/Dpp58ajU9OTkZlZaW+lZWVWSN9IiK6G5lTJJg7bdEKWW3F4J49e3D06FFs2LBBct8OHTqgT58+KC4uNrpfqVRCqVSamyIRERHdgtVGFD766CMEBQUhICBAct/Lly/jxIkTcHNzs0JmREQkazphfpMRyYXC5cuXcfDgQRw8eBAAUFJSgoMHDxosPqyqqkJmZiaeeuopo8cYMWIEli1bpn/9wgsvYNeuXTh58iTy8vIwatQo2NraIjY2Vmp6REREjRM685uMSJ56OHDgAIYNG6Z/nZiYCACIi4vD6tWrAQAZGRkQQpj8oj9x4gQuXLigf3369GnExsbi4sWL6NKlCwYPHox9+/ahS5cuUtMjIiIiC5JcKAwdOhTiFgs5pkyZgilTppjcf/LkSYPXGRkZUtMgIiK6PbyPgiS8/SEREcmLzsxLHGW2RoGFAhERyQtHFCSx6n0UiIiIqHXjiAIREcmLgJkjChbLpFVgoUBERPLCqQdJOPVAREREJnFEgYiI5EWnA2DGTZN0vOESERHR3YtTD5Jw6oGIiIhM4ogCERHJC0cUJGGhQERE8sI7M0rCqQciIiIyiSMKREQkK0LoIMx4VLQ5fVsjFgpERCQvQpg3fcA1CkRERHcxYeYaBZkVClyjQERERCZxRIGIiORFpwMUZqwz4BoFIiKiuxinHiTh1AMRERGZxBEFIiKSFaHTQZgx9cDLI4mIiO5mnHqQhFMPREREZBJHFIiISF50AlBwRKGpWCgQEZG8CAHAnMsj5VUocOqBiIiITGKhQEREsiJ0wux2O5YvX44ePXpApVIhODgY+/fvbzQ+MzMTPj4+UKlU8Pf3x9atW03GTp06FQqFAosXL9ZvO3nyJCZNmoSePXuiTZs26N27N1JSUlBXVycpbxYKREQkL0JnfpNow4YNSExMREpKCgoLCxEQEIDw8HBUVFQYjc/Ly0NsbCwmTZqEoqIixMTEICYmBocPH24Qu2nTJuzbtw/u7u4G23/66SfodDq8//77OHLkCBYtWoS0tDTMmjVLUu4KIVr/ZEtVVRWcnZ3hmfo6bFSqO50OERFJpLt6FaXJs1FZWQknJyervEf9d8VQxSjYKexv+zjXxTXkik2Scg0ODsb999+PZcuWAQB0Oh08PDzwzDPP4KWXXmoQP3bsWNTU1GDLli36bX/6058QGBiItLQ0/bYzZ84gODgYX375JaKiovDcc8/hueeeM5nHggULsGLFCvz8889N/LQcUSAiIrotVVVVBq22ttZoXF1dHQoKChAWFqbfZmNjg7CwMOTn5xvtk5+fbxAPAOHh4QbxOp0O48ePR1JSEvr169eknCsrK9GpU6cmxda7K656qB8U0V29eoczISKi21H//+/mGOS+LmrNerDTdVwDAHh4eBhsT0lJwdy5cxvEX7hwAVqtFq6urgbbXV1d8dNPPxl9D41GYzReo9HoX8+fPx92dnZ49tlnm5R3cXExli5dirfffrtJ8fXuikKhuroaAHD61dfvcCZERGSO6upqODs7W+XYDg4OUKvV2KsxvSiwqdRqNQ4dOgTVTdPdSqXS7OM2VUFBAZYsWYLCwkIoFIpbxp85cwYREREYPXo0Jk+eLOm97opCwd3dHWVlZXB0dGz0hFVVVcHDwwNlZWVWmwOzBubdvFpr3kDrzZ15N6+WmLcQAtXV1Q0W5FmSSqVCSUmJ5FX/xjg4OBgUCY1xcXGBra0tysvLDbaXl5dDrVYb7aNWqxuN37NnDyoqKuDp6anfr9Vq8fzzz2Px4sU4efKkfvvZs2cxbNgwhIaG4oMPPmhSzje7KwoFGxsb3HPPPU2Od3JyajG/HFIw7+bVWvMGWm/uzLt5tbS8rTWScDOVStXkL3hLcXBwQFBQEHJychATEwPgxvqCnJwcJCQkGO0TEhKCnJwcg4WJ27ZtQ0hICABg/PjxRtcwjB8/HvHx8fptZ86cwbBhwxAUFIRVq1bBxkb60sS7olAgIiJqyRITExEXF4eBAwdi0KBBWLx4MWpqavRf6hMmTEC3bt2QmpoKAJgxYwaGDBmCd955B1FRUcjIyMCBAwf0IwKdO3dG586dDd7D3t4earUa3t7eAG4UCUOHDkX37t3x9ttv4/z58/pYUyMZxrBQICIisrKxY8fi/PnzmDNnDjQaDQIDA5Gdna1fsFhaWmrw135oaCjS09Mxe/ZszJo1C15eXsjKyoKfn1+T33Pbtm0oLi5GcXFxg1F3KYtGZVUoKJVKpKSkNOuCE0tg3s2rteYNtN7cmXfzaq15t3YJCQkmpxpyc3MbbBs9ejRGjx7d5OPfvC4BACZOnIiJEydKyNC4u+KGS0RERGQdvOESERERmcRCgYiIiExioUBEREQmsVAgIiIik1goEBERkUl3XaGwfPly9OjRAyqVCsHBwdi/f3+j8ZmZmfDx8YFKpYK/vz+2bjX/HuBSpKam4v7774ejoyO6du2KmJgYHD16tNE+q1evhkKhMGjNfaexuXPnNsjBx8en0T53+lwDQI8ePRrkrVAoMH36dKPxd/Jc7969GyNHjoS7uzsUCgWysrIM9gshMGfOHLi5uaFNmzYICwvD8ePHb3lcqb8jlsz72rVrmDlzJvz9/dGuXTu4u7tjwoQJOHv2bKPHvJ2fN0vmDdy41OyPOURERNzyuHfyfAMw+vOuUCiwYMECk8dsjvNNrcddVShs2LABiYmJSElJQWFhIQICAhAeHo6Kigqj8Xl5eYiNjcWkSZNQVFSEmJgYxMTE4PDhw82W865duzB9+nTs27cP27Ztw7Vr1/Dwww+jpqam0X5OTk44d+6cvp06daqZMv5dv379DHLYu3evydiWcK4B4NtvvzXIedu2bQDQ6LXKd+pc19TUICAgAMuXLze6/6233sK7776LtLQ0fPPNN2jXrh3Cw8NxtZGnqEr9HbF03leuXEFhYSFeeeUVFBYWYuPGjTh69CgeffTRWx5Xys+bpfOuFxERYZDD+vXrGz3mnT7fAAzyPXfuHFauXAmFQoHHH3+80eNa+3xTKyLuIoMGDRLTp0/Xv9ZqtcLd3V2kpqYajR8zZoyIiooy2BYcHCyefvppq+bZmIqKCgFA7Nq1y2TMqlWrhLOzc/MlZURKSooICAhocnxLPNdCCDFjxgzRu3dvodPpjO5vCedaCCEAiE2bNulf63Q6oVarxYIFC/TbLl26JJRKpVi/fr3J40j9HbF03sbs379fABCnTp0yGSP1581cxvKOi4sT0dHRko7TEs93dHS0GD58eKMxzX2+qWW7a0YU6urqUFBQYPCQDBsbG4SFhSE/P99on/z8fKMP1TAV3xwqKysBAJ06dWo07vLly+jevTs8PDwQHR2NI0eONEd6Bo4fPw53d3f06tUL48aNQ2lpqcnYlniu6+rqsHbtWjz55JONPnW0JZzrPyopKYFGozE4p87OzggODjZ5Tm/nd6Q5VFZWQqFQoEOHDo3GSfl5s5bc3Fx07doV3t7emDZtGi5evGgytiWe7/LycnzxxReYNGnSLWNbwvmmluGuKRQuXLgArVarv292PVdXV2g0GqN9NBqNpHhr0+l0eO655/DAAw80ej9vb29vrFy5Eps3b8batWuh0+kQGhqK06dPN1uuwcHBWL16NbKzs7FixQqUlJTgwQcfRHV1tdH4lnauASArKwuXLl1q9BanLeFcG1N/3qSc09v5HbG2q1evYubMmYiNjW30KYZSf96sISIiAh9//DFycnIwf/587Nq1C5GRkdBqtUbjW+L5XrNmDRwdHfHYY481GtcSzje1HLJ61kNLN336dBw+fPiWc4EhISH6R40CNx4e0rdvX7z//vuYN2+etdMEAERGRur/vX///ggODkb37t3x6aefNumvlZbgo48+QmRkJNzd3U3GtIRzfbe6du0axowZAyEEVqxY0WhsS/h5e+KJJ/T/7u/vj/79+6N3797Izc3FiBEjmiUHc61cuRLjxo275YLclnC+qeW4a0YUXFxcYGtri/LycoPt5eXlJh+nqVarJcVbU0JCArZs2YKdO3c2eMrXrdjb2+O+++5DcXGxlbK7tQ4dOqBPnz4mc2hJ5xoATp06he3bt+Opp56S1K8lnGvg90fESjmnt/M7Yi31RcKpU6ewbdu2RkcTjLnVz1tz6NWrF1xcXEzm0JLONwDs2bMHR48elfwzD7SM8013zl1TKDg4OCAoKAg5OTn6bTqdDjk5OQZ/Ed4sJCTEIB648VhOU/HWIIRAQkICNm3ahB07dqBnz56Sj6HVavH999/Dzc3NChk2zeXLl3HixAmTObSEc32zVatWoWvXroiKipLUryWcawDo2bMn1Gq1wTmtqqrCN998Y/Kc3s7viDXUFwnHjx/H9u3b0blzZ8nHuNXPW3M4ffo0Ll68aDKHlnK+63300UcICgpCQECA5L4t4XzTHXSnV1NaUkZGhlAqlWL16tXihx9+EFOmTBEdOnQQGo1GCCHE+PHjxUsvvaSP//rrr4WdnZ14++23xY8//ihSUlKEvb29+P7775st52nTpglnZ2eRm5srzp07p29XrlzRx/wx71dffVV8+eWX4sSJE6KgoEA88cQTQqVSiSNHjjRb3s8//7zIzc0VJSUl4uuvvxZhYWHCxcVFVFRUGM25JZzrelqtVnh6eoqZM2c22NeSznV1dbUoKioSRUVFAoBYuHChKCoq0l8d8Oabb4oOHTqIzZs3i++++05ER0eLnj17it9++01/jOHDh4ulS5fqX9/qd8TaedfV1YlHH31U3HPPPeLgwYMGP/O1tbUm877Vz5u1866urhYvvPCCyM/PFyUlJWL79u1iwIABwsvLS1y9etVk3nf6fNerrKwUbdu2FStWrDB6jDtxvqn1uKsKBSGEWLp0qfD09BQODg5i0KBBYt++ffp9Q4YMEXFxcQbxn376qejTp49wcHAQ/fr1E1988UWz5gvAaFu1apXJvJ977jn9Z3R1dRWPPPKIKCwsbNa8x44dK9zc3ISDg4Po1q2bGDt2rCguLjaZsxB3/lzX+/LLLwUAcfTo0Qb7WtK53rlzp9Gfjfr8dDqdeOWVV4Srq6tQKpVixIgRDT5T9+7dRUpKisG2xn5HrJ13SUmJyZ/5nTt3msz7Vj9v1s77ypUr4uGHHxZdunQR9vb2onv37mLy5MkNvvBb2vmu9/7774s2bdqIS5cuGT3GnTjf1HoohBDCqkMWRERE1GrdNWsUiIiIyPJYKBAREZFJLBSIiIjIJBYKREREZBILBSIiIjKJhQIRERGZxEKBiIiITGKhQERERCaxUCAiIiKTWCgQERGRSSwUiIiIyKT/BzXA9huXFxRaAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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q6srtm7dysCCSAIMLEgSI0eOxKeffopjx46hb9++FtX1888/49dff8XmzZt1hgvu70av2Q/j7NmzenXk5OTofN66davOipKav/Kff/55fP7559iyZQvmzp1rsl2CICA+Ph5DhgzBX//6V73zCxcuxNatW40GFgMGDED79u2RmppqcAmrKffe673d/1VVVcjNzYWPj494rFOnTjh58iQCAwON7q1xL0PP79dff0WLFi3EXo+61FObtLQ0DBkypE55c3NzdXZOvXHjBoYNG4aKigqDy5lrU15eXueJo0RkHgYWJIm3334b8fHxmDJlClJSUuDi4qJz/t6/XGtT85fqvWUEQcDHH3+sk8/V1RW+vr7YvHmzzjyL5ORk/PLLLzobcT399NMGr/XSSy8hNjYWH330EQYPHoyAgACd87du3cKiRYvw0Ucf4fDhw7hw4QI++OADvPTSS3p1/frrr3jvvfdw5coVuLm56Z1XKBT45z//iRMnTpi1CgUA+vTpAycnJ8TFxWHy5MniPItNmzbpLaMcO3Ys9u7di3//+9+IiorSOffHH39Aq9Xq7BWSnp6OzMxM9O7dG8DdnoGvvvoKISEh4n+LmvyWLNms7xyLsrIyjBgxApcvX8aBAwcMDt3U5FMoFOLKoho7duzA77//jj59+tS77URkHAMLkkTnzp0RHx+P8PBwdOnSRdx5UxAE5ObmIj4+HjY2NnVaBurl5YVOnTrhzTffxOXLl6FSqcQvh/vFxsZi5MiRGDBgAKZMmYKbN29i1apV6NatW50m7DVr1gw7d+5EUFAQBg4ciLFjx+Lpp59Gs2bNcPr0acTHx6NNmzb46KOPsHXrVjRp0gQjR440WNcLL7yAv/3tb0hISEBMTIzBPKNGjcKoUaNqbZehdn744Yd49dVXMXToUIwbNw65ubnYuHGj3hyLP//5z9i+fTv+8pe/4MCBA3j66adRXV2NM2fOYPv27fj22291vmS7d++O4OBgneWmAPD++++LeWomd/7tb3/D+PHj0axZMzz//PNmbWZW3zkWEREROHbsGKZMmYLs7GydvStatWolTpg9e/YsgoKCMG7cOHh5ecHGxgbHjx/Hli1b4OHhgRkzZph9bSKqgwZckUIycO7cOeG1114TnnjiCcHOzk5o3ry54OXlJfzlL38RsrKydPJOnDhRaNmypcF6fvnlFyEo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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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jjqKXnzxxUFfOURE++67L91111108cUX04QJE+hrX/saERHV19cPe59CoUD33XdfpexnPvMZWrhwIbW2tlJTUxMREZ1++un05ptv0q9+9Su64YYbqK6urnLdu+66i77whS/QYYcdRl/60peIiGjatGlERNTW1kaHH354xYCovr6eHn74YTr33HMplUoNMjq87rrryLZtuvTSS6m3t5euv/56+uxnP0vPPvssERF985vfpN7eXlq/fj3dcMMNRERb1EOfeOIJOv7442nq1Kl05ZVXUi6Xo5tuuomOOOIIeuGFFwYZRZ5xxhk0ZcoUWrx4Mb3wwgv0s5/9jBoaGui73/3usPcg6rd/qK2tpUmTJm2xHBHRkiVLKJvN0vnnn0+1tbW0fPlyuummm2j9+vW0ZMmSSrn58+fTv//9b7rwwgtp8uTJtHnzZnr88cdp7dq1NHnyZLrxxhvpwgsvpFgsRt/85jeJiKixsfE974/45z//Sf/4xz/ozDPPpAkTJtDq1avp1ltvpWOOOYZee+01ikQiNHXqVDriiCPo7rvvposvvlicf/fdd1M8HqdTTjmFiEbe39/5zncoEAjQpZdeSoVCYau+1Adw44030i9+8Qu6//776dZbb6VYLEYHHnjgFs8Z6n5XXnklLV68uDKGU6kUPffcc/TCCy/QcccdR//5n/9JGzdupMcff5zuuuuu96xXKpWi5cuX05e//GX67//+b7rpppsonU7TlClT6LrrrqMzzjhj0DkXXXQRfeQjH6ETTjiB7r333q16/i3VSylFJ598Mj355JN07rnn0kEHHUSPPvoo/dd//Rdt2LChMneGwv/8z//QtddeSz/+8Y8rhqp33XUXLViwgObNm0ff/e53KZvN0q233kpHHnkkvfjii2Ieua5L8+bNo9mzZ9P/+3//j5544gn6/ve/T9OmTaPzzz+fiIgef/xx+sxnPkMf/ehHK3Pr9ddfp7///e/01a9+VdRn1qxZhgHZXtjVvzzGKh577DHlOI5yHEfNmTNHff3rX1ePPvqoKhaLotzq1auV4zjqmmuuEftfeeUV5fP5xP6hNP5JkyapE088cavq9Nvf/lbopKlUSoVCIXXDDTeIctui8Z977rlq3LhxqqOjQ+w/88wzVSKRqHzlDnyR7bvvvkKb/cEPfqCISL3yyiuVfcNp/EN98R900EGqoaFBdXZ2Vva9/PLLyrZtddZZZ1X2DXzxn3POOeKap512mqqtrR10Lx1HHnmkmjVr1qD9Q33x61/2Sim1ePFiZVmWWrNmjVJKqe7ubkVE6nvf+94W7/t+Nf6h6rJs2TJFROoXv/hFZd+Pf/xjRUTq9ddfr+wrFouqrq5O9PtI+3vq1KlD1mFrMdBv7e3tYv9wX/xD3e8DH/jAe86VkWjpL7zwgiIiVVtbqxobG9Utt9yi7r77bnXYYYcpy7LUww8/LMr/8Y9/VD6fT/373/9WSqmt/uLfUr0eeOABRUTq6quvFvs/+clPKsuy1FtvvVXZR/DF/7WvfU3Ztq3uuOOOyvG+vj6VTCbVF7/4RXGt1tZWlUgkxP4BFuKqq64SZQ8++GAxP7761a+qqqqqrbLHufbaaxURqba2tvcsa7BlGKv+XYTjjjuOli1bRieffDK9/PLLdP3119O8efNo/Pjx9Pvf/75S7ne/+x15nkdnnHEGdXR0VP41NTXR9OnT6cknn9xudbr77rvpkEMOob322ouIiOLxOJ144ol09913v6/rKqXovvvuo5NOOomUUuI55s2bR729vfTCCy+IcxYuXCi++j784Q8TEdE777wz4vtv2rSJXnrpJTr77LOppqamsv/AAw+k4447jh566KFB55x33nni7w9/+MPU2dlJqVRqi/fq7Oyk6urqrapXOByubGcyGero6KAPfehDpJSiF198sVImEAjQU089Rd3d3Vt13W0B1qVUKlFnZyfttddelEwmRd+cccYZFAqFxJh49NFHqaOjgz73uc8R0bb194IFC0QddjSGul8ymaR///vftHLlyu1yj3Q6TUT9Y+LBBx+k888/n/7jP/6Dli5dSrW1tXT11VdXyhaLRbr44ovpvPPOG5FNznvhoYceIsdx6Ctf+YrY/7WvfY2UUvTwww+L/UopuuCCC+gHP/gB/fKXvxT2PY8//jj19PTQZz7zGdGnjuPQ7Nmzh1yLhppHOIeTySRlMhl6/PHH3/NZBuZVR0fHez+4wRZhXvy7EIceeij97ne/o+7ublq+fDlddtll1NfXR5/85CfptddeIyKilStXklKKpk+fTvX19eLf66+/PmJDwPb2dmptba38G1icenp66KGHHqKjjz6a3nrrrcq/I444gp577jl68803t/k529vbqaenh37yk58MeoaFCxcS0WCDxokTJ4q/Byb9trz81qxZQ0RE++yzz6Bj++67L3V0dFAmk9lu91dKbVW91q5dW/kxEovFqL6+no4++mgiIurt7SUiomAwSN/97nfp4YcfpsbGRjrqqKPo+uuvp9bW1q26x9Yil8vRt771LWppaaFgMEh1dXVUX19PPT09lboQ9S/UJ510Et1zzz2VfXfffTeNHz+ejj32WCLatv6eMmXKdn2e98JQ97vqqquop6eH9t57bzrggAPov/7rv+hf//rXNt9j4IfFlClTaPbs2ZX9sViMTjrpJFq+fDmVy2UiIrrhhhuoo6ODvv3tb2/z/YbCmjVrqLm5meLxuNi/7777Vo4jfvGLX9DNN99MN910E33mM58RxwZ+EB177LGD+vWxxx4b1KehUGiQtFhdXS3m0Je//GXae++96fjjj6cJEybQOeecQ4888siQzzIwryzL2trHNxgGRuMfBQgEAnTooYfSoYceSnvvvTctXLiQlixZQldccQV5nkeWZdHDDz9MjuMMOndr/XwHcOihh4rJfsUVV9CVV15JS5YsoUKhQN///vfp+9///qDz7r777m1elDzPIyKiz33uc8N6COia7FDPSrT1L9X3i229f21t7Vb9OHBdl4477jjq6uqib3zjGzRjxgyKRqO0YcMGOvvssyttRtSv+5500kn0wAMP0KOPPkqXX345LV68mP785z/TwQcfPLIHGwYXXngh3X777XTRRRfRnDlzKJFIkGVZdOaZZ4q6EBGdddZZtGTJEvrHP/5BBxxwAP3+97+nL3/5yxWr+G3p7535tT/c/Y466ih6++236cEHH6THHnuMfvazn9ENN9xAt912G33hC18Y8T2am5uJaGh7i4aGBiqVSpUfnFdffTV9+ctfplQqVWGV0uk0KaVo9erVFIlEqKGhYcR1GCmOOOIIeumll+hHP/oRnXHGGYIhG+jXu+66q2Lzg/D55OtkuDmEaGhooJdeeokeffRRevjhh+nhhx+m22+/nc466yy68847RdmBeTVgV2Sw7TAv/lGGQw45hIj66WmifuM4pRRNmTKF9t577/d9/bvvvptyuVzl76lTp1b277///nTFFVcMOufHP/4x3XPPPZUX/5Z+cQ91rL6+nuLxOLmuS3Pnzn2/j7DFew2FAUO7FStWDDr2xhtvUF1dHUWj0e1SpxkzZtB99933nuVeeeUVevPNN+nOO++ks846q7J/OMpz2rRp9LWvfY2+9rWv0cqVK+mggw6i73//+/TLX/6SiN7/V9Bvf/tbWrBggfjRl8/nhwzS9PGPf5zq6+vp7rvvptmzZ1M2mxWBoXZUf+8M1NTU0MKFC2nhwoWUTqfpqKOOoiuvvLLy4h9JOzc3N1NTUxNt2LBh0LGNGzdSKBSieDxOa9eupXQ6Tddffz1df/31g8pOmTKFTjnllC0atg1Xr0mTJtETTzxBfX194qv/jTfeqBxH7LXXXnT99dfTMcccQx//+Mdp6dKllfMGDHUbGhq2a78GAgE66aST6KSTTiLP8+jLX/4y/fjHP6bLL7+8IjsSEa1atarCRBm8PxiqfxfhySefHPLrcUBvHqClTz/9dHIch7797W8PKq+Uos7OzhHd94gjjqC5c+dW/k2dOpXWrVtHf/nLX+iMM86gT37yk4P+LVy4kN56662KRf3AS3Kol0I0Gh2033Ecmj9/Pt1333306quvDjpnW0NxRqNRQUMPh3HjxtFBBx1Ed955p6jbq6++So899hidcMIJ23T/oTBnzhzq7u5+T1uEga8h7FOlFP3gBz8Q5bLZLOXzebFv2rRpFI/HqVAoVPYN1e4jgeM4g8bXTTfdRK7rDirr8/noM5/5DN177710xx130AEHHCC+4HdUf+9o6HMpFovRXnvtNaidiYYe+0Ph05/+NK1bt078oOvo6KAHH3yQjj32WLJtmxoaGuj+++8f9O8jH/kIhUIhuv/+++myyy7b4n2Gq9cJJ5xAruvSj370I7H/hhtuIMuy6Pjjjx90rQMPPJAeeughev311+mkk06qfCjMmzePqqqq6Nprr6VSqTTovG3pV73NbduujCVsdyKi559/nubMmTPiexgMhvni30W48MILKZvN0mmnnUYzZsygYrFI//jHP+g3v/kNTZ48uaKFTps2ja6++mq67LLLaPXq1XTqqadSPB6nVatW0f33309f+tKX6NJLL31fdbnnnnsqbj9D4YQTTiCfz1f5wps1axYR9bvUnXnmmeT3++mkk06iaDRKs2bNoieeeIL+93//l5qbmyv65nXXXUdPPvkkzZ49m774xS/SzJkzqauri1544QV64oknqKura8T1njVrFv3mN7+hSy65hA499NCKdjoUvve979Hxxx9Pc+bMoXPPPbfizpdIJLZrqNMTTzyRfD4fPfHEExWXxqEwY8YMmjZtGl166aW0YcMGqqqqovvuu2+QTPDmm2/SRz/6UTrjjDNo5syZ5PP56P7776e2tjY688wzK+VmzZpFt956K1199dW01157UUNDQ0Vz3xp84hOfoLvuuosSiQTNnDmTli1bRk888QTV1tYOWf6ss86iH/7wh/Tkk08O6eK4vfp7wD1s9erVW/0s24qZM2fSMcccQ7NmzaKamhp67rnn6Le//a2IXz8w9r/yla/QvHnzyHEc0Q86LrvsMrr33ntp/vz5dMkll1AikaDbbruNSqUSXXvttUREFIlE6NRTTx107gMPPEDLly8f8piO4ep10kkn0Uc+8hH65je/SatXr6YPfOAD9Nhjj9GDDz5IF110UeUrXsfhhx9ODz74IJ1wwgn0yU9+kh544AGqqqqiW2+9lT7/+c/TBz/4QTrzzDOpvr6e1q5dS3/605/oiCOOGPQD473whS98gbq6uujYY4+lCRMm0Jo1a+imm26igw46qGKHQNRvE/Kvf/2LFi1aNKLrGwyDnepDYFDBww8/rM455xw1Y8YMFYvFKuF7L7zwwiHdVe677z515JFHVsJ4zpgxQy1atEitWLGiUmZb3fkOOOAANXHixC2WOeaYY1RDQ4MqlUpKqf7AHuPHj1e2bQvXvjfeeEMdddRRKhwODwrg09bWphYtWqRaWlqU3+9XTU1N6qMf/aj6yU9+Uikz4G61ZMkScf+hXPTS6bT6j//4D5VMJrcqgM8TTzyhjjjiCBUOh1VVVZU66aSThg3go7uF3X777VsVAEkppU4++WT10Y9+VOwbyp3vtddeU3PnzlWxWEzV1dWpL37xi+rll18Wde/o6FCLFi1SM2bMUNFoVCUSCTV79mx17733iuu3traqE088UcXj8W0K4NPd3a0WLlyo6urqVCwWU/PmzVNvvPGGmjRp0rAhmPfbbz9l27Zav379kMffT38PoK6uTh1++OFbfBalRu7ON9T9rr76anXYYYepZDKpwuGwmjFjhrrmmmuEi225XFYXXnihqq+vV5ZlbZVr39tvv61OO+00VVVVpcLhsDr22GPV8uXL3/O8kbjzbalefX196uKLL1bNzc3K7/er6dOnb3UAnwcffFD5fD716U9/Wrmuq5Tqb8N58+apRCKhQqGQmjZtmjr77LPVc8899551H+inAfz2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Vogy+XyeFi1aRLW1tRSLxWj+/PnU1ta2i2q843HdddeRZVl00UUXVfaNlTbYsGEDfe5zn6Pa2loKh8N0wAEH0HPPPVc5rpSib33rWzRu3DgKh8M0d+5cWrly5RauuHtgLM17M+eHhpn3O2neq1GGX//61yoQCKj/+7//U//+97/VF7/4RZVMJlVbW9uurtoOw7x589Ttt9+uXn31VfXSSy+pE044QU2cOFGl0+lKmfPOO0+1tLSopUuXqueee04dfvjh6kMf+tAurPWOw/Lly9XkyZPVgQceqL761a9W9o+FNujq6lKTJk1SZ599tnr22WfVO++8ox599FH11ltvVcpcd911KpFIqAceeEC9/PLL6uSTT1ZTpkxRuVxuF9b8/WGszXsz5wfDzPudN+9H3Yv/sMMOU4sWLar87bquam5uVosXL96Ftdq52Lx5syIi9fTTTyullOrp6VF+v18tWbKkUub1119XRKSWLVu2q6q5Q9DX16emT5+uHn/8cXX00UdXFoCx0gbf+MY31JFHHjnscc/zVFNTk/re975X2dfT06OCwaD61a9+tTOquEMw1uf9WJ7zSpl5v7Pn/aii+ovFIj3//PM0d+7cyj7btmnu3Lm0bNmyXViznYve3l4iIqqpqSEioueff55KpZJolxkzZtDEiRP3uHZZtGgRnXjiieJZicZOG/z+97+nQw45hD71qU9RQ0MDHXzwwfTTn/60cnzVqlXU2toq2iGRSNDs2bN323Yw835sz3kiM+939rwfVS/+jo4Ocl2XGhsbxf7GxkZqbW3dRbXaufA8jy666CI64ogjaP/99yciotbWVgoEApRMJkXZPa1dfv3rX9MLL7xAixcvHnRsrLTBO++8Q7feeitNnz6dHn30UTr//PPpK1/5Ct15551ERJVn3ZPmyFif92N5zhOZeU+08+f9qEvLO9axaNEievXVV+lvf/vbrq7KTsW6devoq1/9Kj3++OMUCoV2dXV2GTzPo0MOOYSuvfZaIiI6+OCD6dVXX6XbbruNFixYsItrZ7AjMFbnPJGZ9wPY2fN+VH3x19XVkeM4gyw229raqKmpaRfVaufhggsuoD/+8Y/05JNP0oQJEyr7m5qaqFgsUk9Pjyi/J7XL888/T5s3b6YPfvCD5PP5yOfz0dNPP00//OEPyefzUWNj4x7fBkRE48aNo5kzZ4p9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8n2bngbD8cBaXfP90Gw2qd1uv6g6DEeH2fjXId7xjneQ53n0iU98oveLYBlpmtKRI0eIiH9F4DlpmtJf/dVfiWs2btxIr3rVq+grX/lKjwokWtosfv7znx9Tm37xi1/QW97yFjrnnHPom9/8prAzGgyGF4e1tuajKFphRiAiuv/+++nhhx+mSy655NgfzrBq2E+qdYhzzz2XPvWpT9ENN9xATz31FL397W+nUqlETz75JH3ta1+j9773vfThD3+YduzYQeeeey59+MMfpmeffZbK5TL9/d//fd8Fu2fPHnrLW95CV1xxBf37f//vaWZmhv76r/+azj//fFpcXDxqexYWFujKK6+k2dlZ+o//8T/St771rRXtPZOUuAyGk421tuYXFxdpy5Yt9M53vpPOP/98KhQK9PDDD9Ott95KlUqFPvaxj52orjAQWTjfmYRBebtvvfXWlIhW5MD++7//+/SKK65IC4VCWigU0h07dqS7d+8Wwg8///nP0127dqXFYjEdHR1N//iP/zj96U9/ukJQZLm+8847Lw3DMH3FK16R/sM//MMx5e1+8sknB4qWEFF69dVXv4heMRjOXJyua77dbqcf/OAH0wsvvDAtl8tpJpNJzz777PSaa66xXP0nAU6aKt7HYDAYDAbDGQuz8RsMBoPBsI5gL36DwWAwGNYR7MVvMBgMBsM6gr34DQaDwWBYRzhhL/6bbrqJzjnnHMpms3TZZZfR/ffff6JuZTAY1gBszRsMpwdOiFf/3/7t39K73/1uuuWWW+iyyy6jz372s3THHXfQvn37aGxs7KjXJklCBw8epFKpRI7jHO+mGQzrAmma0sLCAm3atIlc98QTey9mzRPZujcYjgeOed2fiBjBSy+9NN29e3fv7ziO002bNqV79uz5tdceOHDgqDHd9s/+2b9j/3fgwIETscRX4MWs+TS1dW//7N/x/Pfr1v1xz9zX6XTowQcfpBtuuKH3meu6tGvXLrrnnntWnN9ut0Ve5vR5AmLbhz5Obpglv6UuSLmYveJIr7zw8HCv7NXlL4azXn+gV57++uZeOVhMxXlH3sTt+Oxr/lev/In//EeyzW/lFJXO96u9cuWJbq88f24GL6HK43ws+/1HeuXFt1wozis+zZKUj/+7Ij/DP8fivKDG9TndGK4p9MrbvzIvrjn8Wm7r8CONXnnmgrw4L5zj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5ubSTCaT3nHHHb1zfvGLX6RElN5zzz2nqpknBAsLC+n27dvT7373u+lv/dZv9TaA9dIHH/nIR9Irrrhi4PEkSdKJiYn0v/yX/9L7bG5uLg3DMP1f/+t/nYwmnhCs93W/ntd8mtq6P9nrfk1R/Z1Ohx588EHatWtX7zPXdWnXrl10zz33nMKWnVzMz88TEdHw8DARET344IPU7XZFv+zYsYO2bt16xvXL7t276S1veYt4VqL10wff+MY36JJLLqHf+73fo7GxMbrooovoi1/8Yu/4k08+SZOTk6IfKpUKXXbZZadtP9i6X99rnsjW/cle92vqxT89PU1xHNP4+Lj4fHx8nCYnJ09Rq04ukiSh6667ji6//HK64IILiIhocnKSgiCgarUqzj3T+uX222+nH//4x7Rnz54Vx9ZLHzzxxBN088030/bt2+muu+6i97///fQnf/In9JWvfIWIqPesZ9IaWe/rfj2veSJb90Qnf92vOVne9Y7du3fTI488Qj/84Q9PdVNOKg4cOEAf/OAH6bvf/S5ls9lT3ZxThiRJ6JJLLqFPf/rTRER00UUX0SOPPEK33HILXX311ae4dYYTgfW65ols3S/jZK/7NfWLf3R0lDzPW+GxOTU1RRMTE6eoVScP1157LX3zm9+kf/7nf6bNmzf3Pp+YmKBOp0Nzc3Pi/DOpXx588EE6dOgQvfrVrybf98n3fbr77rvpc5/7HPm+T+Pj42d8HxARbdy4kV7xileIz8477zzav38/EVHvWc+kNbKe1/16XvNEtu6XcbLX/Zp68QdBQBdffDHt3bu391mSJLR3717auXPnKWzZiUWapnTttdfS1772Nfre975H27ZtE8cvvvhiymQyol/27dtH+/fvP2P65Y1vfCM9/PDD9NBDD/X+XXLJJfSud72rVz7T+4CI6PLLL18R1vWrX/2Kzj77bCIi2rZtG01MTIh+qNVqdN999522/bAe172t+SXYul/CSV/3L8AB8YTi9ttvT8MwTL/85S+nP//5z9P3vve9abVaTScnJ091004Y3v/+96eVSiX9/ve/nz733HO9f41Go3fO+973vnTr1q3p9773vfSBBx5Id+7cme7cufMUtvrEA71703R99MH999+f+r6f/vmf/3n66KOPpl/96lfTfD6f/s//+T9759x4441ptVpN//Ef/zH92c9+lr7tbW87I8L51tO6tzU/GLbuT/y6X3Mv/jRN07/+679Ot27dmgZBkF566aXpvffee6qbdEJBRH3/3Xrrrb1zms1m+h/+w39Ih4aG0nw+n/7u7/5u+txzz526Rp8E6A1gvfTBnXfemV5wwQVpGIbpjh070i984QvieJIk6cc+9rF0fHw8DcMwfeMb35ju27fvFLX2+GE9rXtb84Nh6/7Er3snTdN09TyBwWAwGAyG0xFrysZvMBgMBoPhxMJe/AaDwWAwrCPYi99gMBgMhnUEe/EbDAaDwbCOYC9+g8FgMBjWEezFbzAYDAbDOoK9+A0Gg8FgWEewF7/BYDAYDOsI9uI3GAwGg2EdwV78BoPBYDCsI9iL32AwGAyGdYT/HzZaBjXsx7VQAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Self-Attn matrix shape: (1, 4, 365, 365)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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hw5isVi0tjk5ORISEiLt27fX5pW3vsrywQcf2OwFul7RHrytW7fq5s+aNUu3t3LPnj0CQF544QVdu969e5cZIIoU7dG8VkkBAoDMmjVL13blypUCQH7++ecSH6O0525xOnfurD23+vTpI59//rm8/fbb4uDgIM2bN9f9rywWizRp0kSefvppEZEyA8SECRMEgJw8ebJcfSERnoVxmzp//jwAKB/Q07p1a9338AUFBVi/fj26du2KOnXqaPP9/PzQu3dv/Pjjj9pjmc1m/Pbbb0hNTS123U5OTjAajdi8eTOysrJUNwlLly6FnZ0dunfvrs17+umn8d13393Q+ooTGxur+977wQcfBAAcPnz4hte5ePFiREZGIjo6GitWrEBsbCz27t2LXbt2IS4uDp6enuVeV69evbB7924cOnRIm7ds2TKYTCZ06dKl1GXPnj0LBwcHuLq6luuxTpw4gT179qBfv36oXr26Nr9Ro0Zo37491qxZY7NMSkoKWrdujeDgYHz//fe6bVuxYgUefPBBeHp64syZM9otJiYGBQUF+OGHH2y29drli/tfvPXWW3jvvfcwYcIEPPfcc7h8+XKJt7y8PACAwWBAjx49sGbNGly8eFFb17JlyxAQEICWLVuWOCZr1qyBn58fnnzySW2es7MzBg4cqGu3Z88epKamonfv3jh79qy2rZcuXUK7du3www8/wGKxKNVXWYqON1i1alWJp+iuWLEC9erVQ0REhO5/0LZtWwDApk2btO0EgJdfflm3/M0++LiIyWRCbGysbl7R9nzzzTe4cuXKTXmcov/3/fffj4ULF6J79+4YN24c/u///g/btm3Dxo0btbafffYZ9u3bh0mTJpVr3UXP1bvtVOaKxABxm3J3dwcAXLhwQWm5kJAQ3d+nT59GTk4O7rnnHpu29erVg8Vi0Y5eHjduHLKzsxEeHo57770Xr776Kn799VetvclkwqRJk/Ddd9+hZs2aaNWqFSZPnoyMjAytzblz55CRkaHdMjMztfsWLlyIJk2a4OzZs/jzzz/x559/IjIyEvn5+VixYoXSdpYkMDBQ93fRi8I/CSizZ8/Gnj17cN9992Hr1q344IMP0KhRo1KXyczM1I3DuXPnAAA9evSAnZ0dli1bBgAQEaxYsQIdO3bU/uc3y9GjRwGgxP990RvitR5//HG4ublh3bp1Nv1JTU3F2rVrUaNGDd2t6CDYU6dO6dqX9b/YtGkTxo8fDwB444034OTkVOrt2u3o1asXcnNzsXr1agCFbyxr1qxBjx49YDAYSh2TunXr2rS5foyKQnTfvn1ttnfu3LnIy8vDuXPnlOqrLL169UKLFi3Qv39/1KxZE0899RSWL1+uCxOpqan47bffbPoUHh4OwPo/OHr0KOzs7BAaGlrqdt4sAQEBNgestm7dGt27d8fYsWPh7e2NLl26ICEhQQuCN6LooMlrz0ICgN69ewMoPJsKKPwANmrUKLz66quoXbt2udYtIgBQ6vOH9HgWxm3K3d0d/v7+SElJUVquPEcll6RVq1Y4dOgQVq1ahfXr12Pu3Ln44IMPMGvWLPTv3x9A4SeYxx9/HF999RXWrVuHt99+G/Hx8UhMTERkZCSGDBmCefPmaets3bo1Nm/ejNTUVPz8888AgLCwMJvHXrRokc2nwBthb29f7PyiF4cb8d5772HmzJlYvnw56tevj9atWyM2Nhbdu3eHi4tLsct069YNW7Zs0f7u27cvPvvsM/j7++PBBx/E8uXL8cYbb2DHjh1IT08v16ckLy8vXL16FRcuXKiwU826d++OefPmYdGiRXj++ed191ksFrRv3x6vvfZascsWvYkVKet/cd999yE6Ohq7du3CsGHDygxl1+55eeCBBxAcHIzly5ejd+/e+Prrr5Gbm4tevXqVuY3lUfSmPWXKFJtTia/tzz95M7yek5MTfvjhB2zatAnffvst1q5di2XLlqFt27ZYv3497O3tYbFYcO+99+K///1vseso75vlzVbc647BYMDnn3+OHTt24Ouvv8a6devw7LPP4v3338eOHTvKvSftWv7+/gCAmjVr6ub7+PgAsIbT9957D/n5+ejVqxfS0tIAAH/99ZfWJi0tDf7+/rrQU7Sst7e3cr+qKgaI29hjjz2G2bNnY/v27WjWrNkNraNGjRpwdnbGwYMHbe77/fffYWdnp3vRqV69OmJjYxEbG4uLFy+iVatWGDNmjBYgACA0NBTDhw/H8OHDkZqaisaNG+P999/HwoUL8dprr+Hf//631rboU+eiRYtQrVo1LFiwwOaN5ccff8S0adOQnp6OwMDAUj8BVNSng9LWGx0djU8++QRTp07F0qVLMXfuXPTt2xcvvvgievbsidjYWLRo0UK3zPvvv6/b61H0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ubm58vLLL4uXl5e4uLiU+4ekivzTAPHLL7/I008/LYGBgWIymcTHx0cee+wx2bVrl65dac/d4lgsFpk+fbqEh4dLtWrVpHbt2vLWW2+VGUBLe17OnDlTnJ2d5fz586Wug/QMIv/g6DIiuqXOnTuHOnXqYPLkyXjuuecquzt0BzIYDBg9ejTGjBlT2V25bURGRqJNmzb44IMPKrsrdxQeA0F0B/Hw8MBrr72GKVOm3NTLeRNVVWvXrkVqaipGjRpV2V2543APBBFRBbv2t1KK4+TkBA8Pj1vSF+6BoJuFp3ESEVWwa6+kW5yi3wkhupMwQBARVbANGzaUev+1vxNS0bjTmW4WfoVBREREyngQJRERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhgg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pIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlDFAEBERkTIGCCIiIlLGAEFERETKGCCIiIhIGQMEERERKWOAICIiImUMEERERKSMAYKIiIiUMUAQERGRMgYIIiIiUsYAQURERMoYIIiIiEgZAwQREREpY4AgIiIiZQwQREREpIwBgjRjxoyBwWDAmTNnKrsrmn79+iE4OLiyu0F012Ld041igKA7nsViwWeffYbOnTujdu3acHFxQcOGDfHuu+/i8uXLld09Iqogc+bMQevWrVGzZk2YTCaEhIQgNjYWaWlpld21KsGhsjtA9E/l5OQgNjYWDzzwAAYNGgQfHx9s374do0ePxsaNG5GYmAiDwVDZ3SSimyw5ORkhISHo3LkzPD09ceTIEcyZMwfffPMN9u7dC39//8ru4l2NAYLueEajET/99BOaN2+uzRswYACCg4O1EBETE1OJPSSiivC///3PZl7Xrl0RHR2N+fPnY+TIkZXQq6qDX2GQjezsbPTr1w9msxkeHh6IjY1FTk6OTbuFCxciKioKTk5OqF69Op566ikcO3ZM12br1q3o0aMHAgMDYTKZULt2bQwbNgy5ubk26/vqq6/QsGFDODo6omHDhli5cmW5+ms0GnXhocgTTzwBADhw4EC51kNUld1pdV+SomMnsrOz/9F6qGzcA0E2evbsiZCQEMTHx+OXX37B3Llz4ePjg0mTJmltxo8fj7fffhs9e/ZE//79cfr0aUyfPh2tWrVCcnIyzGYzAGDFihXIycnB4MGD4eXlhaSkJEyfPh1//fUXVqxYoa1v/fr16N69O+rXr4/4+HicPXsWsbGxqFWr1g1vR0ZGBgDA29v7htdBVFXcyXV/9uxZFBQUID09HePGjQMAtGvX7p8PCpVOiP6/0aNHCwB59tlndfOfeOIJ8fLy0v5OS0sTe3t7GT9+vK7dvn37xMHBQTc/JyfH5nHi4+PFYDDI0aNHtXmNGzcWPz8/yc7O1uatX79eAEhQUNANbU9MTIy4u7tLVlbWDS1PVBXcDXVvMpkEgAAQLy8vmTZtWrmXpRvHrzDIxqBBg3R/P/jggzh79izOnz8PAPjyyy9hsVjQs2dPnDlzRrv5+voiLCwMmzZt0pZ1cnLSpi9duoQzZ86gefPmEBEkJycDAE6cOIE9e/agb9++8PDw0Nq3b98e9evXv6FtmDBhAr7//ntMnDhR+1RERCW7k+v+u+++w5o1a/D+++8jMDAQly5dUt5+UsevMMhGYGCg7m9PT08AQFZWFtzd3ZGamgoRQVhYWLHLV6tWTZtOT0/HO++8g9WrVyMrK0vX7ty5cwCAo0ePAkCx67vnnnvwyy+/KPV/2bJleOutt/Dcc89h8ODBSssSVVV3ct0/9NBDAICOHTuiS5cuaNiwIVxdXfHiiy+Wex2kjgGCbNjb2xc7X0QAFP7ugsFgwHfffVdsW1dXVwBAQUEB2rdvj8zMTLz++uuIiIiAi4sLjh8/jn79+sFisdz0vm/YsAHPPPMMOnXqhFmzZt309RPdre7kur9WaGgoIiMjsWjRIgaICsYAQcpCQ0MhIggJCUF4eHiJ7fbt24c//vgD8+bNwzPPPKPN37Bhg65dUFAQACA1NdVmHQcPHix3v3bu3IknnngC0dHRWL58ORwc+PQmullu17ovTm5uLvLy8v7ROqhsPAaClHXr1g329vYYO3as9umkiIjg7NmzAKyfaK5tIyKYOnWqbhk/Pz80btwY8+bN03ZvAoUvOPv37y9Xnw4cOIBOnTohODgY33zzje47WCL65263ur969arN1yMAkJSUhH379iE6Orr8G0c3hB/RSFloaCjeffddjBo1CmlpaejatSvc3Nxw5MgRrFy5EgMHDsSIESMQERGB0NBQjBgxAsePH4e7uzu++OKLYos+Pj4enTp1QsuWLfHss88iMzMT06dPR4MGDXDx4sVS+3PhwgV06NABWVlZePXVV/Htt9/a9LdZs2Y3dQyIqprbre4vXryI2rVro1evXmjQoAFcXFywb98+JCQkwMPDA2+//XZFDQUVufUnftDtquh0rtOnT+vmJyQkCAA5cuSIbv4XX3whLVu2FBcXF3FxcZGIiAiJi4uTgwcPam32798vMTEx4urqKt7e3jJgwADZu3evAJCEhASb9dWrV09MJpPUr19fvvzyS+nbt2+Zp3MdOXJEO4WruFvfvn3/wagQ3d3u1LrPy8uTIUOGSKNGjcTd3V2qVasmQUFB8txzz9n0mSqGQeS6fVFEREREZeAxEERERKSMAYKIiIiUMUAQERGRsgoLEJmZmejTpw/c3d1hNpvx3HPPlXlUbZs2bWAwGHS3639elYhuX6x7oqqjwgJEnz598Ntvv2HDhg149tlnMX/+fHh4eKBp06ZISkoqcbkBAwZg9uzZCA0NhclkwtatW7FmzZqK6iYR3URFdf/888/DyckJCQkJCA4OLrXmgcIrJxbVfEREBGJiYm5Rj4noRlVIgDhw4ADWrl2LuXPnIi0tDTNmzMBLL70Ei8WCsLAwdOjQAadOnSp22ezsbAwePBjPP/88kpOT0a1bN3Tt2hUpKSkV0VUiukmK6r5nz56YNm0aJkyYgJkzZ+Ls2bN4+OGHS6z5c+fOITExUav5J598Er1792bNE93mKuQ0zk8//RTDhw9HVlYWmjZtCkdHRxw9ehRHjx5F3bp1kZ2djeHDh2PkyJG65dq0aYMff/wRBQUF+k4aDBg4cGCx1zbIy8vT/WSpxWJBZmYmvLy8YDAYbvamEVUpIoILFy7A398fdnalf94oqvvw8HCt5jMyMpCXlwd3d3eMGjXKpuYBwN3dHRcuXNDNK63mAdY9UUVRqfkK+SGp8ePHS3h4uOTl5YnBYBAHBwf59NNPxdPTU1q0aCFGo1E6dOhgs9zHH38sbm5uYjQa5aOPPhJfX1/p2LGjvPLKK9KoUaNiH6voR1B44423irsdO3asXHUfFhamq/nffvtNHB0dxd7evtiaFxFxdnYWo9EoiYmJWt3XrVu3xJpn3fPGW8XfylPzSnsgRo4ciUmTJpXa5sCBA/jyyy8xb948bNq0CQEBAejevTs+//xz+Pj4YPTo0Rg5ciTMZjOOHTtms7yDgwNMJhMuXbqExMREtGvXDmPGjMH//vc/nDx50qb9+fPntevVF/3doEED1J7+GuycTHilsf4CLrM+6axN+83fp03LPUG6dke6uGnT3vdad736u1ofa//3+svQ1nrQuj15H/lq0xnN9L8Y3rdjojb95Yy22nTmffo9Lz3vt35vvGGu9aeY8930n7C2xM3Uppv80E+b7tVgt67d9jMh2vRfyf7atN01D2t/Sb/uex7+U5s+tiBUm86O0DWDwS9Xm647+qz1cbrW1rWr38V6kZyUNfdo0zmBV3XtXNKsY3bF3foU3f2fT3Tt7v+kvzad523dELt863ZUC9QfxGde6apNZ7S1Pq7BqL9KoO+31ssTu6zaZV23m6uunSHA+r8ucDNp0yeb6Nvl+FvXHzYnQ5v+u4O/rt2FMOt2tIj8XZv+cb/1AkbGU/rnVPD71ufysRcaadNBi4/q2uGaTxTiYr1eyPH23rpm7umFfSi4chm7vxuPshTV/SeffILDhw9rNQ8ANWrUwIULF1CjRo0yax6AVvdeXl44c+ZMsY9XUt2HzhkGe2cT7Le569pfvebSKAFbrM+Hvx7S/4/s/mVdpyHJug77y9Y2ct0FAGokW5/7DuetDXP99Ov+65FrPs1dU3Oh9f7WtTt0wPp8CF1hXbf9mLO6dhkXrP3zmOti7cNl/evIkSeM2nT4rExtOjPK+j9363Nct0zmVwHatM/2bG36i6++0LWLWvicNi3BOdr0lTz9INmftfZh25PW16un+8fq2l32tLY72fWaPUxZJl07Q4G1vuvUt/b90HEfbbrWSv2n52Mdrcs4/m3tn/GcrhnO32N9TYiYZH2+Xq6nr1P7XGu7Y+2s4x/8dbauXdrjZm3a+ZT1tcx7rv64oMOT7rfed81Lt+fGQ9p0ej/9e45vkvX5dmqwdbzcPnfTtTMnWcfo8Hhrfyxp+ueo7/YCXL16Gbu+n4Ds7Gx4eHigNErXwhg+fDj69etXaps6derA19cXp06dQn5+PgAgOjoaV69eRWZmJvz9/REUFITjx4+XuI7Lly8jKChI+yrj999/L7Ht5MmTMX582S9wRHTjkpKS4ObmVuL9RXV/+vRpANAuZFR0wSN/f3+brymuVVTzFosF//rXvwDA5qvMa7HuiW4DZe6juAH79+8XALJ69WoBIPHx8bJu3ToxGAxy/PhxadCggZjN5mKX9fHxkd69e0tycrJMnz5dAIjRaJSIiIhi27/55puVvquHN97u9lt5dmcW1T1QWPMiotV9eHh4uWp+8+bN0rx5cwEgISEhJT4W65433ir2dtO/wlDRsWNH/PXXX0hJSUGbNm1w/PhxREdHY+HChfDw8ICbmxvc3d0xf/58NGnSBIcOHcLixYuxdetWFBQUYMiQIRg2bBj8/f3x888/o0GDBti9e7fN45R0MFW1atUQGBiIY8eOwd3d3Wa5quL8+fOoXbs2x4HjAEB9HETlgCoADz30EDZv3oy2bdti3LhxiI2NRVRUFL755huYzWbs2LED7dq109V9165d4enpifnz5+PXX3/F0KFDkZaWhsjIyGJrHmDdl4XP90Ich0Iq46BS8xV2Oe9FixZh8ODBSElJwebNm9GyZUu88sorGDx4MPLy8nDffffhhx9+wFtvvYWoqCi88MIL+P7775GcnIwLFy5g79696NKlC3x8fPDTTz+hZs2axT6OyWSCyaT/fsxsNmvfj7q7u1fpJ04RjkMhjkMhlXEo63vQay1ZsgR+fn5ITEzEtm3b0LFjRzg5OSEvLw8NGjTAlStXcPDgQUydOhWLFi2C0WiEvb09tm7dirp16yIgIAC1atVCWlpaiTUPsO7Li+NQiONQqLzjUN6ar7AfkqpevTqWLVuGJk2aoFWrVkhPT0eLFi2QnJwMs9mMjh07QkSQn5+PEydOoHbt2tiyZQvOnz+P5cuXw8vLCwsXLsTq1asREBCAiIiIsh+UiCqVr6+vVvM+Pj749ttvkZKSArPZjDZt2iA4OBitW7dGtWqFB6jWrl0be/bswfLlyxEaGoqMjAxkZ2ez5onuABV+LYxXXnkFO3fuxLhx47Bnzx5ERkbiypUriI0tPPo2MDAQfn5+Wvtx48bBw8MD3333HbZv345GjRrhzJkz6N+/f0kPQUS3EdY8UdVQYV9hFOnVqxdOnz6Nd955BxkZGWjcuDHWrl2r7Z5MT0/Xfc+SlZWFAQMGICMjA56enoiKisK2bdtQv359pcc1mUwYPXq0zW7OqobjUIjjUOhWjENl1TzA/3MRjkMhjkOhihqHCjuIkoiIiO5evJw3ERERKWOAICIiImUMEERERKSMAYKIiIiU3ZUBYsaMGQgODoajoyOaNm2KpKSkshe6g8XHx+P++++Hm5sbfHx80LVrVxw8eFDX5vLly4iLi4OXlxdcXV3RvXv3Yi9OdjeZOHEiDAYDhg4dqs2rKuNw/Phx/Pvf/4aXlxecnJxw7733Ytcu6wXBRATvvPMO/Pz84OTkhJiYGKSmplZij/851j3rHmDd39K6L/PHru8wS5cuFaPRqF1KeMCAAWI2m+XkyZOV3bUK06FDB0lISJCUlBTZs2ePPProoxIYGCgXL17U2gwaNEhq164tGzdulF27dskDDzwgzZs3r8ReV6ykpCQJDg6WRo0ayZAhQ7T5VWEcMjMzJSgoSPr16yc7d+6Uw4cPy7p16+TPP//U2kycOFE8PDzkq6++kr1790rnzp0lJCREcnNzK7HnN451z7oXYd3f6rq/6wJEkyZNJC4uTvu7oKBA/P39tYv7VAWnTp0SALJlyxYREcnOzpZq1arJihUrtDYHDhwQALJ9+/bK6maFuXDhgoSFhcmGDRukdevW2gtJVRmH119/XVq2bFni/RaLRXx9fWXKlCnavOzsbDGZTLJkyZJb0cWbjnXPumfd3/q6v6u+wsjPz8fu3bsRExOjzbOzs0NMTAy2b99eiT27tc6dK7zAffXq1QEAu3fvxpUrV3TjEhERgcDAwLtyXOLi4tCpUyfd9gJVZxxWr16N6Oho9OjRAz4+PoiMjMScOXO0+48cOYKMjAzdOHh4eKBp06Z35Diw7gux7ln3t7ru76oAcebMGRQUFNhchKdmzZrIyMiopF7dWhaLBUOHDkWLFi3QsGFDAEBGRgaMRiPMZrOu7d04LkuXLsUvv/yC+Ph4m/uqyjgcPnwYM2fORFhYGNatW4fBgwfj5Zdfxrx58wBA29a7pU5Y96x71n3l1H2F/5Q13VpxcXFISUnBjz/+WNldueWOHTuGIUOGYMOGDXB0dKzs7lQai8WC6OhoTJgwAQAQGRmJlJQUzJo1C3379q3k3lFFYN2z7iuj7u+qPRDe3t6wt7e3Obr25MmT8PX1raRe3TovvvgivvnmG2zatAm1atXS5vv6+iI/Px/Z2dm69nfbuOzevRunTp3CfffdBwcHBzg4OGDLli2YNm0aHBwcULNmzSoxDn5+fjbXkahXrx7S09MBQNvWu6VOWPese9Z95dT9XRUgjEYjoqKisHHjRm2exWLBxo0b0axZs0rsWcUSEbz44otYuXIlEhMTERISors/KioK1apV043LwYMHkZ6efleNS7t27bBv3z7s2bNHu0VHR6NPnz7adFUYhxYtWticzvfHH38gKCgIABASEgJfX1/dOJw/fx47d+68I8eBdc+6Z91XUt3f0KGXt7GlS5eKyWSSzz77TPbv3y8DBw4Us9ksGRkZld21CjN48GDx8PCQzZs3y4kTJ7RbTk6O1mbQoEESGBgoiYmJsmvXLmnWrJk0a9asEnt9a1x7NLZI1RiHpKQkcXBwkPHjx0tqaqosWrRInJ2dZeHChVqbiRMnitlsllWrVsmvv/4qXbp0ueNP42Tds+6LsO5vTd3fdQFCRGT69OkSGBgoRqNRmjRpIjt27KjsLlUoAMXeEhIStDa5ubnywgsviKenpzg7O8sTTzwhJ06cqLxO3yLXv5BUlXH4+uuvpWHDhmIymSQiIkJmz56tu99iscjbb78tNWvWFJPJJO3atZODBw9WUm9vDtY9674I6/7W1D0v501ERETK7qpjIIiIiOjWYIAgIiIiZQwQREREpIwBgoiIiJQxQBAREZEyBggiIiJSxgBBREREyhggiIiISBkDBBERESljgCAiIiJlDBBERESkjAGCiIiIlP0/xKP8vbVtw4oAAAAASUVORK5CYII=\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "[MoE Routing Clusters @ temporal_attn]\n", + " - Cluster 0: size=1, dominant_expert=5, mean_dist=[0.14 0. 0. 0. 0. 0.86 0. 0. ]\n", + " - Cluster 1: size=1, dominant_expert=5, mean_dist=[0.134 0. 0. 0. 0. 0.86 0. 0.005]\n", + " - Cluster 2: size=4, dominant_expert=5, mean_dist=[0.17 0. 0. 0. 0. 0.826 0.001 0.003]\n", + " - Cluster 3: size=2, dominant_expert=5, mean_dist=[0.125 0. 0. 0. 0. 0.868 0.001 0.005]\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + } + ] + } + ] +} \ No newline at end of file From 8dd06e60d8170410d1ffc0b97b6861edfc624f87 Mon Sep 17 00:00:00 2001 From: gsy19971111 Date: Tue, 30 Sep 2025 22:57:14 +0800 Subject: [PATCH 3/5] Add files via upload --- .../demo_200000_impute_report.csv | 412 ++++++++++++++++++ 1 file changed, 412 insertions(+) create mode 100644 jointContribution/AI_Climate_disease/demo_200000_impute_report.csv diff --git a/jointContribution/AI_Climate_disease/demo_200000_impute_report.csv b/jointContribution/AI_Climate_disease/demo_200000_impute_report.csv new file mode 100644 index 000000000..812a7ec54 --- /dev/null +++ b/jointContribution/AI_Climate_disease/demo_200000_impute_report.csv @@ -0,0 +1,412 @@ +column,type,trained,metric_primary,metric_secondary,fallback +Ownsend_Deprivation_Index,regression,True,mse=3.03671,r2=0.6825,none +Number_of_Self-Reported_Cancers,regression,True,mse=0.01536,r2=0.8008,none +Operations,regression,True,mse=1.65087,r2=0.3075,none +Number_of_Treatments/Medications,regression,True,mse=2.40922,r2=0.6692,none +Number_of_Self-Reported_Non-Cancer_Illnesses,regression,True,mse=1.53121,r2=0.5638,none +Aidememoire_Completed,regression,False,mse=0.15893,r2=0.0430,median +Sexual_History,regression,True,mse=0.05077,r2=0.4014,none +Added_Salt,regression,True,mse=0.22884,r2=0.0754,none +Handedness,regression,True,mse=0.09320,r2=0.0545,none +Current_Tobacco_Smoking,regression,True,mse=0.00001,r2=0.9999,none +Accommodation_Type,regression,True,mse=0.05787,r2=0.4082,none +Alcohol_Intake_Frequency,regression,True,mse=0.00034,r2=0.9956,none +Milk_Type,regression,True,mse=0.19374,r2=0.1529,none +Insomnia,regression,True,mse=0.15658,r2=0.1454,none +Glasses_Wear,regression,True,mse=0.08702,r2=0.1445,none +Alcohol_Status,regression,True,mse=0.00001,r2=0.9999,none +Pacemaker,regression,True,mse=0.00194,r2=0.3678,none +Computer_Gaming,regression,True,mse=0.14589,r2=0.1162,none +Birth_Country,regression,True,mse=0.08208,r2=0.5226,none +Day_Napping,regression,True,mse=0.20236,r2=0.1787,none +Hair_Color,regression,True,mse=0.22422,r2=0.0561,none +Poultry,regression,True,mse=0.01650,r2=0.6699,none +Waist_Circumference,regression,True,mse=21.89398,r2=0.8808,none +Tea,regression,True,mse=6.09476,r2=0.2554,none +Hip_Circumference,regression,True,mse=13.19761,r2=0.8465,none +Processed_Meat_Intake,regression,True,mse=0.04308,r2=0.5001,none +Coffee,regression,True,mse=3.11790,r2=0.2826,none +Diet_Change,regression,True,mse=0.20395,r2=0.1449,none +Adopted,regression,False,mse=0.01467,r2=-0.0032,median +Standing_Height,regression,True,mse=0.92470,r2=0.9892,none +Diabetes_Diagnosis,regression,True,mse=0.01807,r2=0.6474,none +Eye_Problems,regression,True,mse=0.11966,r2=0.0556,none +Falls,regression,True,mse=0.14412,r2=0.0938,none +Current_Residence_Duration,regression,True,mse=111.30535,r2=0.2432,none +Cancer_Diagnosis,regression,True,mse=0.01289,r2=0.8208,none +Weight,regression,True,mse=0.38324,r2=0.9985,none +Ethnicity,regression,True,mse=0.05108,r2=0.4994,none +Smoked,regression,True,mse=0.19598,r2=0.1850,none +Smoking_Status,regression,True,mse=0.00003,r2=0.9996,none +Other_Prescription_Medications,regression,True,mse=0.11891,r2=0.5227,none +BMI,regression,True,mse=0.06996,r2=0.9969,none +Cereal,regression,True,mse=6.16983,r2=0.2266,none +Fresh_Fruit,regression,True,mse=2.10727,r2=0.2082,none +Hand_Grip_Strength_(Right),regression,True,mse=20.45542,r2=0.8401,none +Beef_Intake,regression,True,mse=0.04843,r2=0.5084,none +Hand_Grip_Strength_(Left),regression,True,mse=20.41612,r2=0.8406,none +Overall_Health_Rating,regression,True,mse=0.02892,r2=0.3373,none +Psychiatrist_Visits,regression,True,mse=0.07183,r2=0.2951,none +Non_Oily_Fish,regression,True,mse=0.02499,r2=0.4516,none +Fractures,regression,False,mse=0.08456,r2=0.0343,median +Daytime_Dozing,regression,True,mse=0.15195,r2=0.1684,none +Spirometry_Contraindications,regression,True,mse=0.00493,r2=0.9302,none +Oily_Fish,regression,True,mse=0.06648,r2=0.3064,none +Sleep_Duration,regression,True,mse=1.14679,r2=0.0885,none +Pork,regression,True,mse=0.08622,r2=0.4008,none +Lamb_Mutton,regression,True,mse=0.09012,r2=0.3838,none +Incorrect_Matches,regression,True,mse=3.19447,r2=0.1079,none +Willingness_for_Cognitive_Tests,regression,True,mse=0.00715,r2=0.6377,none +Water_Intake,regression,True,mse=4.02436,r2=0.2531,none +Water_300m,regression,True,mse=82.21683,r2=0.8698,none +Natural_Environment_(1000m_Buffer),regression,True,mse=20.10810,r2=0.9693,none +Natural_Environment_300m,regression,True,mse=24.21351,r2=0.9687,none +GP_Visits_for_Mental_Health,regression,True,mse=0.13707,r2=0.3873,none +Home_Area_Population_Density,regression,True,mse=0.01900,r2=0.8828,none +TV_Time,regression,True,mse=2.19738,r2=0.2620,none +Disability/Mobility_Allowance,regression,True,mse=0.03385,r2=0.4068,none +Wake_Up_Ease,regression,True,mse=0.03346,r2=0.1082,none +Spread_Type,regression,True,mse=0.08664,r2=0.1012,none +Match_Identification_Time,regression,True,mse=11765.66602,r2=0.1531,none +UV_Protection,regression,True,mse=0.07551,r2=0.1674,none +Seated_Height,regression,True,mse=9.22653,r2=0.8201,none +Seating_Box_Height,regression,True,mse=0.00028,r2=0.8925,none +Sitting_Height,regression,True,mse=1.85534,r2=0.9227,none +Hot_Drink_Temperature,regression,False,mse=0.12885,r2=0.0284,median +Chest_Pain_Discomfort,regression,True,mse=0.11280,r2=0.1704,none +Dried_Fruit,regression,True,mse=2.92822,r2=0.0881,none +Diet_Variation,regression,True,mse=0.20759,r2=0.0766,none +Major_Road_Traffic,regression,True,mse=0.00004,r2=0.8855,none +Nearest_Road_Distance,regression,True,mse=49187815.57922,r2=0.8913,none +PM10_Air_2007,regression,True,mse=0.00837,r2=0.9996,none +Nearest_Road_Traffic,regression,True,mse=0.00144,r2=0.7221,none +NO2_Air_Pollution_(2005),regression,True,mse=0.45550,r2=0.9955,none +NO2_Air_Pollution_(2006),regression,True,mse=0.37226,r2=0.9956,none +PM2.5_to_10_Air_2010,regression,True,mse=4921075.06406,r2=0.7997,none +Major_Road_Distance,regression,True,mse=89375062275.11403,r2=0.9296,none +NO2_Air_Pollution_(2010),regression,True,mse=0.68771,r2=0.9879,none +Road_Traffic_Load,regression,True,mse=558.05541,r2=0.9083,none +Trunk_Fat_Percentage,regression,True,mse=11.20265,r2=0.9531,none +Evening_Noise_Level,regression,True,mse=0.00841,r2=0.9996,none +Nighttime_Noise_Level,regression,True,mse=0.00860,r2=0.9995,none +Proximity_to_Major_Road,regression,True,mse=0.00491,r2=0.9277,none +Hour-16_Noise_Level,regression,True,mse=0.00856,r2=0.9995,none +Daytime_Noise_Level,regression,True,mse=0.00831,r2=0.9996,none +Road_Length,regression,True,mse=0.47892,r2=0.9958,none +Cooked_Vegetables,regression,True,mse=3.27094,r2=0.1751,none +Salad_Intake,regression,True,mse=3.73412,r2=0.2083,none +Social_Visits,regression,True,mse=0.01657,r2=0.0511,none +Recent_Stress_Events,regression,True,mse=0.22579,r2=0.0891,none +Phone_Use_Duration,regression,True,mse=0.11437,r2=0.1156,none +Skin_Color,regression,True,mse=0.19061,r2=0.1207,none +NO2_Air_2007,regression,True,mse=0.47331,r2=0.9427,none +Computer_Time,regression,True,mse=1.83010,r2=0.1338,none +Bowel_Screening,regression,True,mse=0.17538,r2=0.1949,none +Weight_Change_(1_Year),regression,True,mse=0.21421,r2=0.1316,none +Loneliness/Isolation,regression,True,mse=0.10941,r2=0.2875,none +Driving_Time,regression,True,mse=1.24548,r2=0.2583,none +Whole_Body_Water_Mass,regression,True,mse=0.02345,r2=0.9997,none +Basal_Metabolic_Rate,regression,True,mse=469.91901,r2=0.9997,none +Right_Leg_Impedance,regression,True,mse=21.39709,r2=0.9839,none +Left_Leg_Impedance,regression,True,mse=18.76451,r2=0.9853,none +Whole_Body_Fat-Free_Mass,regression,True,mse=0.02022,r2=0.9998,none +Right_Leg_Fat_Percentage,regression,True,mse=0.07534,r2=0.9993,none +Left_Arm_Impedance,regression,True,mse=30.00962,r2=0.9907,none +Right_Leg_Fat_Mass,regression,True,mse=0.00680,r2=0.9981,none +Right_Leg_Fat_Free_Mass,regression,True,mse=0.00192,r2=0.9995,none +Right_Leg_Predicted_Mass,regression,True,mse=0.00188,r2=0.9995,none +Whole_Body_Impedance,regression,True,mse=157.82494,r2=0.9803,none +Left_Leg_Fat_Percentage,regression,True,mse=0.07565,r2=0.9993,none +Right_Arm_Impedance,regression,True,mse=85.94955,r2=0.9723,none +Left_Leg_Fat_Mass,regression,True,mse=0.00534,r2=0.9985,none +Left_Leg_Fat-Free_Mass,regression,True,mse=0.00176,r2=0.9996,none +Left_Leg_Predicted_Mass,regression,True,mse=0.00150,r2=0.9996,none +Right_Arm_Fat_Percentage,regression,True,mse=0.16739,r2=0.9984,none +Right_Arm_Fat_Mass,regression,True,mse=0.00189,r2=0.9954,none +Right_Arm_Fat-Free_Mass,regression,True,mse=0.00138,r2=0.9980,none +Right_Arm_Predicted_Mass,regression,True,mse=0.00122,r2=0.9980,none +Left_Arm_Fat_Percentage,regression,True,mse=0.15265,r2=0.9986,none +Left_Arm_Fat_Mass,regression,True,mse=0.00200,r2=0.9961,none +Left_Arm_Fat-Free_Mass,regression,True,mse=0.00142,r2=0.9980,none +Height_At_10,regression,True,mse=0.11467,r2=0.2967,none +Left_Arm_Predicted_Mass,regression,True,mse=0.00128,r2=0.9980,none +Body_Fat_Percentage,regression,True,mse=0.04620,r2=0.9994,none +Reticulocyte_Percentage,regression,True,mse=0.07625,r2=0.9988,none +Trunk_Fat_Mass,regression,True,mse=0.03267,r2=0.9988,none +Trunk_Fat-Free_Mass,regression,True,mse=0.01580,r2=0.9996,none +Trunk_Predicted_Mass,regression,True,mse=0.00868,r2=0.9997,none +Miserableness,regression,True,mse=0.14343,r2=0.4137,none +Solarium_Use,regression,False,mse=18.99546,r2=-0.0101,median +Weekly_Walking_Days,regression,True,mse=0.00580,r2=0.7195,none +Other_Serious_Medical_Conditions,regression,True,mse=0.11604,r2=0.2884,none +Bread,regression,True,mse=60.18592,r2=0.2012,none +Whole_Body_Fat_Mass,regression,True,mse=0.06344,r2=0.9993,none +Body_Size_At_10,regression,True,mse=0.19814,r2=0.1080,none +Wheezing,regression,True,mse=0.11852,r2=0.2935,none +Fed-Up_Feelings,regression,True,mse=0.13092,r2=0.4578,none +Longstanding_Illness/Disability,regression,True,mse=0.12172,r2=0.4460,none +Mood_Swings,regression,True,mse=0.13213,r2=0.4663,none +Nervous_Feelings,regression,True,mse=0.10714,r2=0.4019,none +Worrier/Anxious_Feelings,regression,True,mse=0.15546,r2=0.3665,none +Guilty_Feelings,regression,True,mse=0.14841,r2=0.2760,none +Sensitivity_to_Hurt_Feelings,regression,True,mse=0.17205,r2=0.3037,none +Tiredness/Lethargy_Frequency,regression,True,mse=0.17287,r2=0.3053,none +Enzymatic_In_Urine,regression,True,mse=12236521.12770,r2=0.6405,none +Tanning_Ease,regression,True,mse=0.13398,r2=0.0575,none +Able_to_Confide,regression,True,mse=0.11438,r2=0.0904,none +Sodium_Urine,regression,True,mse=1092.01791,r2=0.4494,none +Potassium_Urine,regression,True,mse=462.58147,r2=0.5949,none +Unenthusiasm/Disinterest_Frequency,regression,True,mse=0.09237,r2=0.4486,none +Tense/Highly_Strung,regression,True,mse=0.09239,r2=0.3666,none +Risk-Taking_Behavior,regression,True,mse=0.16802,r2=0.1462,none +Suffering_from_Nerves,regression,True,mse=0.10314,r2=0.3780,none +Tenseness/Restlessness_Frequency,regression,True,mse=0.11827,r2=0.3879,none +Post-Embarrassment_Worry,regression,True,mse=0.16919,r2=0.3221,none +Depressed_Mood_Frequency,regression,True,mse=0.08407,r2=0.5371,none +WBC_Count,regression,True,mse=0.00073,r2=0.9958,none +RBC_Count,regression,True,mse=0.03964,r2=0.9969,none +Corpuscular_Haemoglobin_Concentration,regression,True,mse=0.51932,r2=0.4514,none +Haemoglobin_Concentration,regression,True,mse=0.00387,r2=0.9975,none +Mean_Corpuscular_Haemoglobin,regression,True,mse=0.13281,r2=0.9651,none +Haematocrit,regression,True,mse=0.27617,r2=0.9871,none +Mean_Corpuscular_Haemoglobin_Concentration,regression,True,mse=0.11281,r2=0.9101,none +Blood_Cell_Erythrocyte_Distribution_Width,regression,True,mse=31.01486,r2=0.9913,none +Platelet_Count,regression,True,mse=0.00003,r2=0.9858,none +Platelet_Crit,regression,True,mse=0.01272,r2=0.9890,none +Platelet_Thrombocyte_Volume,regression,True,mse=0.19092,r2=0.3061,none +Environment_Score,regression,True,mse=0.34719,r2=0.9291,none +Irritability,regression,True,mse=0.14319,r2=0.2874,none +Hearing_Difficulty,regression,True,mse=0.17787,r2=0.0649,none +Red_Blood_Cell_(Count),regression,True,mse=0.16398,r2=0.9785,none +Eosinophill_Percentage,regression,True,mse=0.02639,r2=0.9219,none +Lymphocyte_Percentage,regression,True,mse=0.17163,r2=0.9969,none +Neutrophill_Percentage,regression,True,mse=0.07561,r2=0.9781,none +Monocyte_Percentage,regression,True,mse=0.30818,r2=0.9958,none +Eosinophill_Count,regression,True,mse=0.00057,r2=0.9710,none +Platelet_Width,regression,True,mse=0.30995,r2=0.7349,none +Neutrophill_Count,regression,True,mse=0.00027,r2=0.8899,none +Lymphocyte_Count,regression,True,mse=0.00223,r2=0.9527,none +Monocyte_Count,regression,True,mse=0.04233,r2=0.9799,none +Basophill_Count,regression,True,mse=0.00009,r2=0.8739,none +Nucleated_Red_Blood_Cell_Percentage,regression,True,mse=0.01141,r2=0.9213,none +Weekly_Moderate_Activity_Days,regression,True,mse=0.01736,r2=0.8440,none +Weekly_Vigorous_Activity_Days,regression,True,mse=0.04184,r2=0.8211,none +Diastolic_BP,regression,True,mse=38.04323,r2=0.6319,none +Pulse_Rate,regression,True,mse=91.16690,r2=0.2794,none +Systolic_BP,regression,True,mse=133.03961,r2=0.6182,none +Basophill_Percentage,regression,True,mse=0.09672,r2=0.9015,none +Reticulocyte_Count,regression,True,mse=0.00004,r2=0.9773,none +High_Light_Scatter_Reticulocyte_Count,regression,True,mse=0.00000,r2=0.9821,none +Sphered_Cell_Volume,regression,True,mse=7.33223,r2=0.7418,none +Light_Scatter_Reticulocyte_Percentage,regression,True,mse=0.12540,r2=0.3288,none +Immature_Fraction,regression,True,mse=0.00002,r2=0.9941,none +Mean_Reticulocyte_Volume,regression,True,mse=19.21475,r2=0.6895,none +Alkaline_Phosphatase,regression,True,mse=507.44511,r2=0.2811,none +Cholesterol,regression,True,mse=0.02822,r2=0.9782,none +Cystatin_C,regression,True,mse=0.01332,r2=0.6313,none +Alanine_Aminotransferase,regression,True,mse=70.46189,r2=0.6845,none +Gamma_Glutamyltransferase,regression,True,mse=923.75392,r2=0.4866,none +Creatinine_Creatinine,regression,True,mse=112.35011,r2=0.6777,none +Urea_Urea,regression,True,mse=1.15129,r2=0.4171,none +Triglycerides_Triglycerides,regression,True,mse=0.27655,r2=0.7399,none +Urate_Urate,regression,True,mse=2878.89471,r2=0.5535,none +LDL_Cholesterol,regression,True,mse=0.01279,r2=0.9833,none +C_Protein,regression,True,mse=12.72532,r2=0.2974,none +Summer_Outdoors_Time,regression,True,mse=2.91764,r2=0.5099,none +Winter_Outdoors_Time,regression,True,mse=1.55315,r2=0.5726,none +Aspartate_Aminotransferase,regression,True,mse=42.55151,r2=0.6339,none +Total_Bilirubin,regression,True,mse=1.91629,r2=0.9018,none +Apolipoprotein_B,regression,True,mse=0.00312,r2=0.9448,none +Igf_1,regression,True,mse=24.56654,r2=0.2554,none +Haemoglobin_(Hba1C),regression,True,mse=16.14193,r2=0.6392,none +Snoring,regression,True,mse=0.20626,r2=0.1223,none +NOx_Air_2010,regression,True,mse=0.20355,r2=0.9439,none +PM2.5_Absorbance_2010,regression,True,mse=0.01840,r2=0.9772,none +PM10_Air_2010,regression,True,mse=0.02771,r2=0.9750,none +PM2.5_Air_2010,regression,True,mse=0.00660,r2=0.9099,none +Caffeine_Drink,regression,False,mse=0.02196,r2=0.0244,median +Inhaler_Use,regression,False,mse=0.00735,r2=0.0481,median +Facial_Ageing,regression,True,mse=0.18129,r2=0.0603,none +FVC,regression,True,mse=0.08923,r2=0.9174,none +PEF,regression,True,mse=4913.93520,r2=0.7044,none +FEV1,regression,True,mse=0.02576,r2=0.9588,none +Over_Speed_Driving,regression,True,mse=0.19525,r2=0.2133,none +Chronotype,regression,False,mse=0.22260,r2=0.0284,median +Garden_1000m,regression,True,mse=0.81392,r2=0.8715,none +Water_1000m,regression,True,mse=15.67364,r2=0.9709,none +Garden_300m,regression,True,mse=1.14739,r2=0.8690,none +Noise_Level,regression,True,mse=4.63175,r2=0.9901,none +Greenspace_300m,regression,True,mse=12.93868,r2=0.9407,none +Greenspace_1000m,regression,True,mse=5.34329,r2=0.9586,none +First_Sexual_Intercourse,regression,True,mse=11.86485,r2=0.1890,none +Crime_Score,regression,True,mse=26.45542,r2=0.8875,none +Education_Score,regression,True,mse=14.24937,r2=0.8606,none +Housing_Score,regression,True,mse=0.07317,r2=0.8805,none +Income_Score,regression,True,mse=0.00006,r2=0.9832,none +Coast_Distance,regression,True,mse=0.00019,r2=0.9801,none +Index_of_Multiple_Deprivation,regression,True,mse=0.52451,r2=0.9973,none +Employment_Score,regression,True,mse=15.87962,r2=0.9384,none +Albumin_Albumin,regression,True,mse=3.54718,r2=0.4850,none +Calcium_Calcium,regression,True,mse=0.00511,r2=0.4311,none +HDL_Cholesterol,regression,True,mse=0.00749,r2=0.9493,none +Total_Protein,regression,True,mse=9.22529,r2=0.4502,none +Glucose_Glucose,regression,True,mse=0.66192,r2=0.6126,none +Phosphate_Phosphate,regression,True,mse=0.01922,r2=0.2563,none +Apolipoprotein_A,regression,True,mse=0.00739,r2=0.8998,none +Shbg,regression,True,mse=360.79332,r2=0.5249,none +Testosterone,regression,True,mse=4.26155,r2=0.8839,none +Direct_Bilirubin,regression,True,mse=0.05971,r2=0.9132,none +MET_Moderate,regression,True,mse=5086.36089,r2=0.9965,none +Activity_Days,regression,True,mse=0.29166,r2=0.9875,none +Activity_Recommendation,regression,True,mse=0.00002,r2=0.9999,none +MET_Walking,regression,True,mse=5936.64890,r2=0.9948,none +MET_Vigorous,regression,True,mse=6285.74163,r2=0.9954,none +IPAQ_Activity_Group,regression,True,mse=0.00048,r2=0.9968,none +Activity_Minutes,regression,True,mse=104.87300,r2=0.9896,none +Walking_Recommendation_Compliance,regression,True,mse=0.00087,r2=0.9941,none +Total_MET_Minutes_per_Week,regression,True,mse=6335.64322,r2=0.9991,none +Breastfed_Baby,regression,True,mse=0.18390,r2=0.0789,none +FEV1_Z_Score,regression,True,mse=0.00375,r2=0.9970,none +FEV1_FVC_Ratio,regression,True,mse=0.00927,r2=0.9884,none +FVC_Z_Score,regression,True,mse=0.00535,r2=0.9952,none +Spirometry_Quality,regression,True,mse=0.08186,r2=0.0990,none +Sunburns,regression,True,mse=0.21410,r2=0.1374,none +Lipoprotein_A,regression,False,mse=2356.15944,r2=0.0215,median +FEV1_(Best_Measure),regression,True,mse=0.00642,r2=0.9895,none +FVC_(Best_Measure),regression,True,mse=0.01083,r2=0.9889,none +Email_Access,regression,False,mse=0.06467,r2=0.0258,median +Bowel_Open_Min,regression,True,mse=7295.04911,r2=0.2187,none +Bowel_Open_Max,regression,True,mse=1907.53442,r2=0.4941,none +Bowel_Open_Average,regression,True,mse=4068.44912,r2=0.3667,none +Headache,regression,True,mse=0.18840,r2=0.2088,none +Breath_Shortness,regression,True,mse=0.16005,r2=0.2642,none +Heart_Pounding,regression,True,mse=0.17364,r2=0.1805,none +Back_Pain,regression,True,mse=0.20411,r2=0.1495,none +Limb_Joint_Pain,regression,True,mse=0.16754,r2=0.1635,none +Tiredness,regression,True,mse=0.15552,r2=0.3162,none +Sleep_Trouble,regression,True,mse=0.16397,r2=0.2664,none +Dizziness,regression,True,mse=0.16016,r2=0.1864,none +Nausea,regression,True,mse=0.10358,r2=0.1875,none +Chest_Pain,regression,True,mse=0.09515,r2=0.2064,none +Fainting,regression,True,mse=0.02884,r2=0.0934,none +Loose_Stools_Frequency,regression,True,mse=0.19391,r2=0.1692,none +Hard_Stools_Frequency,regression,True,mse=0.20094,r2=0.1928,none +Urinary_Frequency,regression,True,mse=0.22031,r2=0.1083,none +Abdomen_Pain_Frequency,regression,True,mse=0.13654,r2=0.4499,none +Recent_Abdominal_Pain,regression,True,mse=0.11318,r2=0.4575,none +Abdominal_Distension,regression,True,mse=0.12470,r2=0.3120,none +Bowel_Satisfaction,regression,True,mse=0.11267,r2=0.2667,none +Bowel_Interference,regression,True,mse=0.15387,r2=0.3840,none +Coeliac_Disease,regression,False,mse=0.01618,r2=0.0477,median +IBS,regression,True,mse=0.08246,r2=0.2479,none +Caesarian_Born,regression,False,mse=0.02584,r2=0.0132,median +Sensitive_Stomach,regression,True,mse=0.12573,r2=0.2929,none +Childhood_Antibiotics,regression,True,mse=0.11160,r2=0.0798,none +Alcohol-Related_Injury,regression,True,mse=0.03446,r2=0.0933,none +Alcohol_Drinking_Frequency,regression,True,mse=0.04356,r2=0.4509,none +Serious_Accident,regression,True,mse=0.08273,r2=0.0628,none +Combat_War_Exposure,regression,True,mse=0.03397,r2=0.0647,none +Appetite_Changes,regression,True,mse=0.10221,r2=0.3431,none +Stressful_Thoughts,regression,True,mse=0.12213,r2=0.3859,none +Concentration_Issues,regression,True,mse=0.09228,r2=0.3689,none +Alcohol_Reduction_Recommendation,regression,True,mse=0.06356,r2=0.1625,none +Stress_Upset,regression,True,mse=0.12909,r2=0.4505,none +Cannabis_Use,regression,True,mse=0.12062,r2=0.2852,none +Violent_Death_Witness,regression,True,mse=0.10684,r2=0.0847,none +Avoided_Stressful_Activities,regression,True,mse=0.11409,r2=0.3014,none +Movement/Speech_Changes,regression,True,mse=0.04043,r2=0.2784,none +Recent_Tiredness/Low_Energy,regression,True,mse=0.12960,r2=0.4816,none +Violent_Crime_Victim,regression,True,mse=0.13953,r2=0.1039,none +Sleep_Disturbances,regression,True,mse=0.13989,r2=0.4401,none +Recent_Restlessness,regression,True,mse=0.06582,r2=0.3790,none +Health-Related_Happiness,regression,True,mse=0.07755,r2=0.2775,none +Recent_Loss_of_Interest,regression,True,mse=0.06951,r2=0.5438,none +Physical_Abuse_Child,regression,True,mse=0.12559,r2=0.1692,none +Prolonged_Sadness/Depression,regression,True,mse=0.11611,r2=0.5318,none +Loss_of_Interest,regression,True,mse=0.10975,r2=0.5404,none +Felt_Hated_Child,regression,True,mse=0.10187,r2=0.2082,none +Belittlement_Partner,regression,True,mse=0.12995,r2=0.2890,none +Self-Harm_History,regression,True,mse=0.03025,r2=0.2708,none +Physical_Violence_Adult,regression,True,mse=0.08520,r2=0.2633,none +Professional_Mental_Help,regression,True,mse=0.09884,r2=0.5859,none +Relaxation_Difficulty,regression,True,mse=0.09671,r2=0.5312,none +Sexual_Interference_Partner,regression,True,mse=0.04193,r2=0.2413,none +Recent_Depression,regression,True,mse=0.07231,r2=0.5820,none +Uncontrollable_Worrying,regression,True,mse=0.06690,r2=0.6334,none +Recent_Nervousness/Anxiety,regression,True,mse=0.09104,r2=0.5473,none +Self-Harm_Contemplation,regression,True,mse=0.06572,r2=0.4576,none +Excessive_Worrying,regression,True,mse=0.08668,r2=0.6060,none +Life_Threatening_Illness,regression,True,mse=0.10246,r2=0.2421,none +Felt_Loved_Child,regression,False,mse=0.01200,r2=0.0489,median +Recent_Irritability,regression,True,mse=0.12271,r2=0.3905,none +Recent_Foreboding,regression,True,mse=0.08438,r2=0.4020,none +Recent_Inadequacy,regression,True,mse=0.08905,r2=0.4241,none +General_Happiness,regression,True,mse=0.03505,r2=0.2935,none +Life_Worthlessness,regression,True,mse=0.11928,r2=0.4400,none +Take_Doctor_Child,regression,True,mse=0.01835,r2=0.0953,none +Recent_Suicidal/Self-Harm_Thoughts,regression,True,mse=0.02573,r2=0.3898,none +Substance/Behavior_Addiction,regression,True,mse=0.04985,r2=0.1453,none +Molested_Child,regression,True,mse=0.05788,r2=0.2745,none +Sexual_Assault_Victim,regression,True,mse=0.08077,r2=0.3780,none +Mental_Distress_Impact,regression,True,mse=0.09673,r2=0.5618,none +Pay_Rent_Mortgage,regression,True,mse=0.02908,r2=0.0683,none +Mania/Excitability,regression,True,mse=0.03714,r2=0.1225,none +Life_Meaningfulness,regression,True,mse=0.01426,r2=0.0799,none +Confiding_Relationship,regression,True,mse=0.07173,r2=0.1078,none +Extreme_Irritability,regression,True,mse=0.14411,r2=0.2507,none +Family_IBS,regression,True,mse=0.12395,r2=0.1030,none +Prolonged_Anxiety,regression,True,mse=0.13143,r2=0.3255,none +Protein,regression,True,mse=124.35085,r2=0.8720,none +Energy,regression,True,mse=71430.10976,r2=0.9931,none +Folate,regression,True,mse=4286.06229,r2=0.7532,none +Carbohydrate,regression,True,mse=222.16047,r2=0.9801,none +Alcohol,regression,True,mse=57.53842,r2=0.9072,none +Food_Weight,regression,True,mse=193223.76103,r2=0.7794,none +Iron_Iron,regression,True,mse=4.05186,r2=0.8502,none +Potassium,regression,True,mse=137361.19459,r2=0.9389,none +Vitamin_C,regression,True,mse=7278.99181,r2=0.5623,none +Carotene,regression,True,mse=4624624.62934,r2=0.5419,none +Vitamin_D,regression,True,mse=2.28493,r2=0.8168,none +Magnesium,regression,True,mse=1471.57836,r2=0.9081,none +Vitamin_B12,regression,True,mse=5.88117,r2=0.8119,none +Vitamin_E,regression,True,mse=6.29204,r2=0.7832,none +Starch,regression,True,mse=167.00839,r2=0.9470,none +Calcium,regression,True,mse=30679.32814,r2=0.8555,none +Saturated_Fat,regression,True,mse=11.78611,r2=0.9532,none +Total_Sugars,regression,True,mse=183.39533,r2=0.9492,none +Polyunsaturated_Fat,regression,True,mse=7.23715,r2=0.9111,none +Fat,regression,True,mse=28.71385,r2=0.9789,none +Vitamin_B6,regression,True,mse=0.10019,r2=0.8677,none +Englyst_Fibre,regression,True,mse=11.03254,r2=0.8089,none +Vitamin_User,regression,True,mse=0.08917,r2=0.6308,none +Bread_Consumed,regression,True,mse=0.08354,r2=0.3368,none +Spent_Doing_Light_Physical_Activity,regression,True,mse=0.05829,r2=0.0683,none +Portion_Size,regression,True,mse=0.06970,r2=0.0648,none +Typical_Diet_Yesterday,regression,True,mse=0.13465,r2=0.1069,none +Tea_Consumed,regression,True,mse=0.05722,r2=0.6469,none +Breakfast_Consumed,regression,True,mse=0.07511,r2=0.6729,none +Non_Alcoholic_Drinks,regression,True,mse=0.07657,r2=0.3486,none +Alcohol_Consumed,regression,True,mse=0.00033,r2=0.9987,none +Spent_Doing_Vigorous_Physical_Activity,regression,True,mse=0.19698,r2=0.2047,none +Starchy_Consumers,regression,True,mse=0.13371,r2=0.3293,none +Soup_Consumers,regression,True,mse=0.10607,r2=0.1133,none +Savoury_Consumers,regression,True,mse=0.17472,r2=0.2513,none +Cheese_Consumers,regression,True,mse=0.16514,r2=0.3291,none +Fish_Consumer,regression,True,mse=0.06765,r2=0.6731,none +Meat_Consumers,regression,True,mse=0.08056,r2=0.6246,none +Egg_Consumers,regression,True,mse=0.09082,r2=0.4468,none +Coffee_Consumed,regression,True,mse=0.08438,r2=0.6113,none +Ice_Cream_Consumers,regression,True,mse=0.18249,r2=0.2361,none +Dessert_Consumers,regression,True,mse=0.16362,r2=0.2443,none +Sweet_Consumers,regression,True,mse=0.19481,r2=0.2175,none +Spreads_Consumers,regression,True,mse=0.21045,r2=0.1582,none +Vegetable_Consumers,regression,True,mse=0.06133,r2=0.5858,none +Fruit_Consumers,regression,True,mse=0.08802,r2=0.4201,none +Vegetarian_Intake,regression,True,mse=0.03005,r2=0.1757,none +Milk_Type_Consumed,regression,True,mse=180268.51615,r2=0.2382,none +Spent_Doing_Moderate_Physical_Activity,regression,True,mse=0.14973,r2=0.1860,none +cataract_time,skipped_excluded,False,,,none +Retinol,regression,True,mse=7209.44864,r2=0.8217,none +glaucoma_time,skipped_excluded,False,,,none +AMD_time,skipped_excluded,False,,,none +DR_time,skipped_excluded,False,,,none From f9bdce365958e7cdd5b91f3ecb47bd116fb8afbb Mon Sep 17 00:00:00 2001 From: gsy19971111 Date: Tue, 30 Sep 2025 23:48:44 +0800 Subject: [PATCH 4/5] =?UTF-8?q?Update=20=E7=BB=93=E9=A1=B9=E6=8A=A5?= =?UTF-8?q?=E5=91=8A.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\347\273\223\351\241\271\346\212\245\345\221\212.md" | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git "a/jointContribution/AI_Climate_disease/\347\273\223\351\241\271\346\212\245\345\221\212.md" "b/jointContribution/AI_Climate_disease/\347\273\223\351\241\271\346\212\245\345\221\212.md" index d1a942416..6455f7977 100644 --- "a/jointContribution/AI_Climate_disease/\347\273\223\351\241\271\346\212\245\345\221\212.md" +++ "b/jointContribution/AI_Climate_disease/\347\273\223\351\241\271\346\212\245\345\221\212.md" @@ -215,7 +215,7 @@ 5. 为城市规划、空气质量控制、疾病防控政策提供量化证据。 ## 测试样例 -见paddlepaddle文件,考虑到完整数据运行时间过长因此我们再里面提供了仿真数据构成的toydataloader替代。 +见RP中的paddle_model_samples文件,每一个增量的模块我们都用在一个虚拟数据集上证明它是可以运行和训练的,考虑到完整数据运行时间过长,且需要长达一周以上的数据下载,以及一周以上的训练流程,因此我们在里面提供了仿真数据构成的ToyTwoModalDataset类进行替代。一个6小时内能运行完成完的仅有表格模态的版本我们也放在了RP里。 # Project Information @@ -435,3 +435,8 @@ Building on the existing **multimodal deep learning framework** (ERA5 meteorolog 3. Validate scalability across multiple Biobanks (UKB, CKB, FinnGen, BBJ). 4. Provide disease risk simulations under environmental and climate interventions. 5. Deliver quantitative evidence for urban planning, air quality control, and public health policy. + + +## Test Samples + +See the paddle_model_samples folder in the repo (RP). For each incremental module, we demonstrate—on a synthetic dataset—that it can run and train. Because running on the full dataset would take too long (and downloading it can take up to a week), we provide a simulated ToyTwoModalDataset as a substitute. From b9d8b4fe18d29f7d998326edcbd620d4b7051171 Mon Sep 17 00:00:00 2001 From: gsy19971111 Date: Tue, 30 Sep 2025 23:53:53 +0800 Subject: [PATCH 5/5] Add files via upload --- .../AI_Climate_disease/dataprocessing.ipynb | 786 ++++++++ .../AI_Climate_disease/paddle_TabM.ipynb | 1731 +++++++++++++++++ 2 files changed, 2517 insertions(+) create mode 100644 jointContribution/AI_Climate_disease/dataprocessing.ipynb create mode 100644 jointContribution/AI_Climate_disease/paddle_TabM.ipynb diff --git a/jointContribution/AI_Climate_disease/dataprocessing.ipynb b/jointContribution/AI_Climate_disease/dataprocessing.ipynb new file mode 100644 index 000000000..ff5f62534 --- /dev/null +++ b/jointContribution/AI_Climate_disease/dataprocessing.ipynb @@ -0,0 +1,786 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Extract data from ERA5-LAND path" + ], + "metadata": { + "id": "gkPfDn2YQidr" + } + }, + { + "cell_type": "markdown", + "source": [ + "## inquiry by year" + ], + "metadata": { + "id": "ZOxbx-46UMLE" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "bbNSkwzMOTxK" + }, + "outputs": [], + "source": [ + "# era5land_loader.py\n", + "# -*- coding: utf-8 -*-\n", + "\"\"\"\n", + "输入:地名、年份、ERA5-Land 根目录、城市经纬字典\n", + "输出:形状为 (365, X, 20, 20, 24) 的 numpy.float32\n", + "特性:\n", + "- 自动发现 feature 目录(最多 50),自动推断变量名\n", + "- 兼容 (time, step) → 展平成 1D 小时轴并去重\n", + "- 经纬度支持 0..360 / -180..180;以最近格点为中心取 20×20\n", + "- 首次查询缓存 {year}_{city}.pth(pickle),后续命中直接返回\n", + "依赖:xarray, cfgrib, eccodes, numpy\n", + "\"\"\"\n", + "\n", + "import os\n", + "import re\n", + "import pickle\n", + "from typing import List, Tuple, Dict, Optional\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "\n", + "# ==========================\n", + "# 工具 & 兼容性函数\n", + "# ==========================\n", + "def _clip_to_year(ds: xr.Dataset, year: int) -> xr.Dataset:\n", + " \"\"\"仅保留该年的小时:YYYY-01-01 00:00 ~ YYYY-12-31 23:00(含端点)\"\"\"\n", + " start = np.datetime64(f\"{year}-01-01T00:00:00\")\n", + " end = np.datetime64(f\"{year}-12-31T23:00:00\")\n", + " if \"time\" not in ds.coords:\n", + " return ds\n", + " return ds.sel(time=slice(start, end))\n", + "\n", + "\n", + "def _safe_city_key(city: str) -> str:\n", + " return re.sub(r'[^A-Za-z0-9_]+', '_', city.strip().lower())\n", + "\n", + "\n", + "def get_latlon(city: str, city_geo_dic: Dict[str, Tuple[float, float]]) -> Tuple[float, float]:\n", + " if city not in city_geo_dic:\n", + " raise KeyError(f\"city '{city}' not found in city_geo_dic.\")\n", + " lat, lon = city_geo_dic[city]\n", + " return float(lat), float(lon)\n", + "\n", + "\n", + "def _get_lat_lon_names(ds: xr.Dataset) -> Tuple[str, str]:\n", + " lat_candidates = [\"latitude\", \"lat\", \"Latitude\", \"LAT\"]\n", + " lon_candidates = [\"longitude\", \"lon\", \"Longitude\", \"LON\"]\n", + " lat_name = next((c for c in lat_candidates if c in ds.coords), None)\n", + " lon_name = next((c for c in lon_candidates if c in ds.coords), None)\n", + " if lat_name is None or lon_name is None:\n", + " raise KeyError(f\"Cannot find latitude/longitude coords in dataset. coords={list(ds.coords)}\")\n", + " return lat_name, lon_name\n", + "\n", + "\n", + "def to_dataset_lon(lon_deg: float, lon_coords: np.ndarray) -> float:\n", + " lon_min, lon_max = float(np.min(lon_coords)), float(np.max(lon_coords))\n", + " if lon_min >= 0 and lon_max > 180: # 0..360\n", + " return (lon_deg + 360.0) % 360.0\n", + " return ((lon_deg + 180.0) % 360.0) - 180.0 # -180..180\n", + "\n", + "\n", + "# ==========================\n", + "# 目录扫描 & 变量名推断\n", + "# ==========================\n", + "def list_available_features(data_root: str, year: int, max_features: int = 50) -> List[str]:\n", + " feats = []\n", + " if not os.path.isdir(data_root):\n", + " raise FileNotFoundError(f\"data_root not found: {data_root}\")\n", + " for name in sorted(os.listdir(data_root)):\n", + " dir1 = os.path.join(data_root, name)\n", + " if not os.path.isdir(dir1):\n", + " continue\n", + " dir_year = os.path.join(dir1, str(year))\n", + " if not os.path.isdir(dir_year):\n", + " continue\n", + " if any(fn.endswith(\".grib\") for fn in os.listdir(dir_year)):\n", + " feats.append(name)\n", + " if not feats:\n", + " raise FileNotFoundError(f\"No feature folders with GRIB files found for year={year} under {data_root}\")\n", + " return feats[:max_features]\n", + "\n", + "\n", + "def infer_var_name(ds: xr.Dataset, feature_folder_name: str) -> str:\n", + " # 1) exact/包含匹配\n", + " for v in ds.data_vars:\n", + " if v == feature_folder_name or (v in feature_folder_name) or (feature_folder_name in v):\n", + " return v\n", + " # 2) 常见别名\n", + " alias = {\n", + " \"2m_dewpoint_temperature\": \"d2m\",\n", + " \"2m_temperature\": \"t2m\",\n", + " \"total_precipitation\": \"tp\",\n", + " \"surface_pressure\": \"sp\",\n", + " \"u_component_of_wind_10m\": \"u10\",\n", + " \"v_component_of_wind_10m\": \"v10\",\n", + " }\n", + " for k, v in alias.items():\n", + " if k in feature_folder_name and v in ds.data_vars:\n", + " return v\n", + " # 3) fallback\n", + " return list(ds.data_vars)[0]\n", + "\n", + "\n", + "# ==========================\n", + "# (time, step) 展平 & 去重\n", + "# ==========================\n", + "def _flatten_time_step(ds: xr.Dataset) -> xr.Dataset:\n", + " \"\"\"\n", + " 将 (time, step) 合成 1D 时间轴:\n", + " - 计算 time_flat = time[:,None] + step[None,:]\n", + " - stack 成单维 'ts'\n", + " - drop_vars 删除旧的 'time'/'step' 坐标(避免命名冲突)\n", + " - 用新坐标替换维度 → 'time',排序并去重(保留同一时刻的最后一次)\n", + " 若无 step,原样返回;若有 'number' 集合维,取第一个成员。\n", + " \"\"\"\n", + " if \"number\" in ds.dims:\n", + " ds = ds.isel(number=0, drop=True)\n", + " if \"step\" not in ds.dims:\n", + " return ds\n", + "\n", + " t = ds[\"time\"].values # (Nt,)\n", + " s = ds[\"step\"].values # (Ns,)\n", + " time_flat = (t[:, None] + s[None, :]).reshape(-1)\n", + "\n", + " ds = ds.stack(ts=(\"time\", \"step\"))\n", + " ds = ds.drop_vars([name for name in (\"time\", \"step\") if name in ds.coords], errors=\"ignore\")\n", + " ds = ds.assign_coords(valid_time=(\"ts\", time_flat))\n", + " ds = ds.swap_dims({\"ts\": \"valid_time\"}).rename({\"valid_time\": \"time\"}).sortby(\"time\")\n", + "\n", + " # 去重:保留同一时刻的最后一次(一般是较大 step)\n", + " vals = ds[\"time\"].values\n", + " _, idx_rev = np.unique(vals[::-1], return_index=True)\n", + " keep = np.sort(vals.size - 1 - idx_rev)\n", + " ds = ds.isel(time=keep)\n", + " return ds\n", + "\n", + "\n", + "def _drop_duplicate_times(ds: xr.Dataset) -> xr.Dataset:\n", + " if \"time\" not in ds.coords:\n", + " return ds\n", + " vals = ds[\"time\"].values\n", + " _, idx_rev = np.unique(vals[::-1], return_index=True)\n", + " keep = np.sort(vals.size - 1 - idx_rev)\n", + " return ds.isel(time=keep)\n", + "\n", + "\n", + "# ==========================\n", + "# 数据打开 & 空间索引\n", + "# ==========================\n", + "def open_feature_year(data_root: str, feature: str, year: int) -> xr.Dataset:\n", + " \"\"\"\n", + " 打开某个 feature 的全年 GRIB 并按 time 维拼接;自动展平 (time, step)。\n", + " 期望路径:era5land///reanalysis-era5-land__-MM.grib\n", + " 若文件名不完全一致,使用包含 year-MM 的 .grib 作为兜底。\n", + " \"\"\"\n", + " dir_year = os.path.join(data_root, feature, str(year))\n", + " if not os.path.isdir(dir_year):\n", + " raise FileNotFoundError(f\"dir not found: {dir_year}\")\n", + "\n", + " files: List[str] = []\n", + " for m in range(1, 13):\n", + " fname = f\"reanalysis-era5-land_{feature}_{year}-{m:02d}.grib\"\n", + " fpath = os.path.join(dir_year, fname)\n", + " if os.path.exists(fpath):\n", + " files.append(fpath)\n", + " else:\n", + " cand = [fn for fn in os.listdir(dir_year) if fn.endswith(\".grib\") and f\"{year}-{m:02d}\" in fn]\n", + " files += [os.path.join(dir_year, fn) for fn in sorted(cand)]\n", + " if not files:\n", + " raise FileNotFoundError(f\"No monthly grib files under {dir_year}\")\n", + "\n", + " dsets = []\n", + " for fp in files:\n", + " try:\n", + " ds = xr.open_dataset(\n", + " fp,\n", + " engine=\"cfgrib\",\n", + " backend_kwargs={\"indexpath\": \"\"},\n", + " decode_timedelta=True,\n", + " )\n", + " except Exception as e:\n", + " raise RuntimeError(\n", + " f\"Failed to open {fp} with engine='cfgrib'. \"\n", + " f\"Ensure cfgrib + eccodes are installed. Original error: {e}\"\n", + " )\n", + " ds = _flatten_time_step(ds)\n", + " dsets.append(ds)\n", + "\n", + " ds_all = xr.concat(dsets, dim=\"time\")\n", + " ds_all = ds_all.sortby(\"time\")\n", + " ds_all = _drop_duplicate_times(ds_all)\n", + " ds_all = _clip_to_year(ds_all, year) # ← 新增:裁到目标年份\n", + " return ds_all\n", + "\n", + "\n", + "def find_20x20_slices(ds: xr.Dataset, lat_c: float, lon_c: float) -> Tuple[slice, slice, Dict]:\n", + " lat_name, lon_name = _get_lat_lon_names(ds)\n", + " lat_arr = ds[lat_name].values\n", + " lon_arr = ds[lon_name].values\n", + "\n", + " lon_c_ds = to_dataset_lon(lon_c, lon_arr)\n", + " ilat_c = int(np.argmin(np.abs(lat_arr - lat_c)))\n", + " diff_lon = np.abs(((lon_arr - lon_c_ds + 180.0) % 360.0) - 180.0)\n", + " ilon_c = int(np.argmin(diff_lon))\n", + "\n", + " half = 10\n", + " ilat0, ilat1 = max(0, ilat_c - half), min(len(lat_arr), ilat_c + half)\n", + " ilon0, ilon1 = max(0, ilon_c - half), min(len(lon_arr), ilon_c + half)\n", + "\n", + " need_lat = 20 - (ilat1 - ilat0)\n", + " if need_lat > 0:\n", + " ilat0 = max(0, ilat0 - need_lat)\n", + " need_lon = 20 - (ilon1 - ilon0)\n", + " if need_lon > 0:\n", + " ilon0 = max(0, ilon0 - need_lon)\n", + "\n", + " ilat1 = min(len(lat_arr), ilat0 + 20)\n", + " ilon1 = min(len(lon_arr), ilon0 + 20)\n", + "\n", + " meta = dict(\n", + " lat_center=float(lat_arr[ilat_c]),\n", + " lon_center=float(lon_arr[ilon_c]),\n", + " lat_bounds=(float(lat_arr[min(ilat0, ilat1 - 1)]), float(lat_arr[max(ilat0, ilat1 - 1)])),\n", + " lon_bounds=(float(lon_arr[ilon0]), float(lon_arr[ilon1 - 1])),\n", + " ilat=(int(ilat0), int(ilat1)),\n", + " ilon=(int(ilon0), int(ilon1)),\n", + " lat_name=lat_name,\n", + " lon_name=lon_name,\n", + " )\n", + " return slice(ilat0, ilat1), slice(ilon0, ilon1), meta\n", + "\n", + "\n", + "# ==========================\n", + "# 形状规范化:到 (365, 20, 20, 24)\n", + "# ==========================\n", + "def feature_to_year_tensor20(ds_all: xr.Dataset,\n", + " var_name: str,\n", + " lat_slice: slice,\n", + " lon_slice: slice) -> np.ndarray:\n", + " lat_name, lon_name = _get_lat_lon_names(ds_all)\n", + " da = ds_all[var_name] # (time, lat, lon)\n", + "\n", + " da20 = da.isel({lat_name: lat_slice, lon_name: lon_slice})\n", + "\n", + " time = da20[\"time\"]\n", + " if hasattr(time, \"dt\"):\n", + " is_feb29 = (time.dt.month == 2) & (time.dt.day == 29)\n", + " if bool(is_feb29.any()):\n", + " da20 = da20.sel(time=~is_feb29)\n", + "\n", + " T = da20.sizes[\"time\"]\n", + " if T % 24 != 0:\n", + " raise ValueError(\n", + " f\"time length {T} not divisible by 24 after Feb-29 removal. \"\n", + " f\"Likely not hourly or 'step' not flattened. \"\n", + " f\"Inspect ds.dims and ds['time'] for details.\"\n", + " )\n", + " days = T // 24\n", + " if days != 365:\n", + " raise ValueError(f\"expected 365 days, got {days}. Check input files/year completeness.\")\n", + "\n", + " arr = da20.values.reshape(days, 24, 20, 20) # (365, 24, 20, 20)\n", + " arr = np.moveaxis(arr, 1, -1) # (365, 20, 20, 24)\n", + " return arr.astype(\"float32\")\n", + "\n", + "\n", + "# ==========================\n", + "# 主入口:城市+年份 → (365, X, 20, 20, 24)\n", + "# 带 .pth 缓存(year_city.pth)\n", + "# ==========================\n", + "def load_era5land_city_year(\n", + " city: str,\n", + " year: int,\n", + " data_root: str,\n", + " city_geo_dic: Dict[str, Tuple[float, float]],\n", + " feature_whitelist: Optional[List[str]] = None,\n", + " feature_blacklist: Optional[List[str]] = None,\n", + " cache_dir: str = \"era5_cache\",\n", + " force_refresh: bool = False,\n", + " max_features: int = 50,\n", + ") -> np.ndarray:\n", + " os.makedirs(cache_dir, exist_ok=True)\n", + " cache_name = f\"{int(year)}_{_safe_city_key(city)}.pth\"\n", + " cache_path = os.path.join(cache_dir, cache_name)\n", + " if (not force_refresh) and os.path.isfile(cache_path):\n", + " with open(cache_path, \"rb\") as f:\n", + " obj = pickle.load(f)\n", + " arr = obj[\"arr\"]\n", + " if (arr.ndim == 5 and arr.shape[0] == 365 and\n", + " arr.shape[2] == 20 and arr.shape[3] == 20 and arr.shape[4] == 24):\n", + " return arr\n", + " # 缓存不兼容则重建\n", + "\n", + " lat, lon = get_latlon(city, city_geo_dic)\n", + "\n", + " features = list_available_features(data_root, year, max_features=max_features)\n", + " if feature_whitelist:\n", + " wl = set(feature_whitelist)\n", + " features = [f for f in features if f in wl]\n", + " if feature_blacklist:\n", + " bl = set(feature_blacklist)\n", + " features = [f for f in features if f not in bl]\n", + " if not features:\n", + " raise RuntimeError(\"No features left after applying white/black list filters.\")\n", + "\n", + " probe_ds = open_feature_year(data_root, features[0], year)\n", + " lat_slice, lon_slice, region_meta = find_20x20_slices(probe_ds, lat, lon)\n", + "\n", + " tensors: List[np.ndarray] = []\n", + " for feat in features:\n", + " ds_all = open_feature_year(data_root, feat, year)\n", + " var_name = infer_var_name(ds_all, feat)\n", + " tens = feature_to_year_tensor20(ds_all, var_name, lat_slice, lon_slice)\n", + " tensors.append(tens.astype(\"float32\"))\n", + "\n", + " arr = np.stack(tensors, axis=1).astype(\"float32\") # (365, X, 20, 20, 24)\n", + "\n", + " to_save = {\"arr\": arr, \"city\": city, \"year\": int(year), \"features\": features, \"region_meta\": region_meta}\n", + " with open(cache_path, \"wb\") as f:\n", + " pickle.dump(to_save, f)\n", + " return arr\n", + "\n", + "\n", + "# ==========================\n", + "# 示例(可删)\n", + "# ==========================\n", + "if __name__ == \"__main__\":\n", + " city_geo_dic = {\n", + " \"Leeds\": (53.7974185, -1.5437941),\n", + " \"Beijing\": (39.9042, 116.4074),\n", + " }\n", + " data_root = \"era5land\"\n", + "\n", + " try:\n", + " arr = load_era5land_city_year(\n", + " city=\"Leeds\",\n", + " year=1997,\n", + " data_root=data_root,\n", + " city_geo_dic=city_geo_dic,\n", + " cache_dir=\"era5_cache\",\n", + " force_refresh=False,\n", + " max_features=50,\n", + " )\n", + " print(\"Loaded array shape:\", arr.shape) # (365, X, 20, 20, 24)\n", + " except Exception as e:\n", + " print(\"Error:\", e)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## inqury by day" + ], + "metadata": { + "id": "jB20vGFfUHu2" + } + }, + { + "cell_type": "code", + "source": [ + "# era5land_loader.py\n", + "# -*- coding: utf-8 -*-\n", + "\"\"\"\n", + "输入:地名、年份、ERA5-Land 根目录、城市经纬字典\n", + "输出:形状为 (365, X, 20, 20, 24) 的 numpy.float32\n", + "特性:\n", + "- 自动发现 feature 目录(最多 50),自动推断变量名\n", + "- 兼容 (time, step) → 展平成 1D 小时轴并去重\n", + "- 经纬度支持 0..360 / -180..180;以最近格点为中心取 20×20\n", + "- 首次查询缓存 {year}_{city}.pth(pickle),后续命中直接返回\n", + "依赖:xarray, cfgrib, eccodes, numpy\n", + "\"\"\"\n", + "\n", + "import os\n", + "import re\n", + "import pickle\n", + "from typing import List, Tuple, Dict, Optional\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "\n", + "# ==========================\n", + "# 工具 & 兼容性函数\n", + "# ==========================\n", + "def _clip_to_year(ds: xr.Dataset, year: int) -> xr.Dataset:\n", + " \"\"\"仅保留该年的小时:YYYY-01-01 00:00 ~ YYYY-12-31 23:00(含端点)\"\"\"\n", + " start = np.datetime64(f\"{year}-01-01T00:00:00\")\n", + " end = np.datetime64(f\"{year}-12-31T23:00:00\")\n", + " if \"time\" not in ds.coords:\n", + " return ds\n", + " return ds.sel(time=slice(start, end))\n", + "\n", + "\n", + "def _safe_city_key(city: str) -> str:\n", + " return re.sub(r'[^A-Za-z0-9_]+', '_', city.strip().lower())\n", + "\n", + "\n", + "def get_latlon(city: str, city_geo_dic: Dict[str, Tuple[float, float]]) -> Tuple[float, float]:\n", + " if city not in city_geo_dic:\n", + " raise KeyError(f\"city '{city}' not found in city_geo_dic.\")\n", + " lat, lon = city_geo_dic[city]\n", + " return float(lat), float(lon)\n", + "\n", + "\n", + "def _get_lat_lon_names(ds: xr.Dataset) -> Tuple[str, str]:\n", + " lat_candidates = [\"latitude\", \"lat\", \"Latitude\", \"LAT\"]\n", + " lon_candidates = [\"longitude\", \"lon\", \"Longitude\", \"LON\"]\n", + " lat_name = next((c for c in lat_candidates if c in ds.coords), None)\n", + " lon_name = next((c for c in lon_candidates if c in ds.coords), None)\n", + " if lat_name is None or lon_name is None:\n", + " raise KeyError(f\"Cannot find latitude/longitude coords in dataset. coords={list(ds.coords)}\")\n", + " return lat_name, lon_name\n", + "\n", + "\n", + "def to_dataset_lon(lon_deg: float, lon_coords: np.ndarray) -> float:\n", + " lon_min, lon_max = float(np.min(lon_coords)), float(np.max(lon_coords))\n", + " if lon_min >= 0 and lon_max > 180: # 0..360\n", + " return (lon_deg + 360.0) % 360.0\n", + " return ((lon_deg + 180.0) % 360.0) - 180.0 # -180..180\n", + "\n", + "\n", + "# ==========================\n", + "# 目录扫描 & 变量名推断\n", + "# ==========================\n", + "def list_available_features(data_root: str, year: int, max_features: int = 50) -> List[str]:\n", + " feats = []\n", + " if not os.path.isdir(data_root):\n", + " raise FileNotFoundError(f\"data_root not found: {data_root}\")\n", + " for name in sorted(os.listdir(data_root)):\n", + " dir1 = os.path.join(data_root, name)\n", + " if not os.path.isdir(dir1):\n", + " continue\n", + " dir_year = os.path.join(dir1, str(year))\n", + " if not os.path.isdir(dir_year):\n", + " continue\n", + " if any(fn.endswith(\".grib\") for fn in os.listdir(dir_year)):\n", + " feats.append(name)\n", + " if not feats:\n", + " raise FileNotFoundError(f\"No feature folders with GRIB files found for year={year} under {data_root}\")\n", + " return feats[:max_features]\n", + "\n", + "\n", + "def infer_var_name(ds: xr.Dataset, feature_folder_name: str) -> str:\n", + " # 1) exact/包含匹配\n", + " for v in ds.data_vars:\n", + " if v == feature_folder_name or (v in feature_folder_name) or (feature_folder_name in v):\n", + " return v\n", + " # 2) 常见别名\n", + " '''\n", + " alias = {\n", + " \"2m_dewpoint_temperature\": \"d2m\",\n", + " \"2m_temperature\": \"t2m\",\n", + " \"total_precipitation\": \"tp\",\n", + " \"surface_pressure\": \"sp\",\n", + " \"u_component_of_wind_10m\": \"u10\",\n", + " \"v_component_of_wind_10m\": \"v10\",\n", + " }\n", + " for k, v in alias.items():\n", + " if k in feature_folder_name and v in ds.data_vars:\n", + " return v\n", + " '''\n", + " # 3) fallback\n", + " return list(ds.data_vars)[0]\n", + "\n", + "\n", + "# ==========================\n", + "# (time, step) 展平 & 去重\n", + "# ==========================\n", + "def _flatten_time_step(ds: xr.Dataset) -> xr.Dataset:\n", + " \"\"\"\n", + " 将 (time, step) 合成 1D 时间轴(小时级)并去重:\n", + " 1) 若有集合维 'number',先取第一个成员\n", + " 2) 若无 'step' 维,原样返回\n", + " 3) 计算扁平有效时刻 time_flat = time[:,None] + step[None,:]\n", + " 4) stack 成单维 'ts',然后直接用 assign_coords 覆盖 'ts' 坐标为 time_flat\n", + " 5) 将维度/坐标 'ts' 重命名为 'time',排序并去重(保留同一时刻的最后一次)\n", + " \"\"\"\n", + " if \"number\" in ds.dims:\n", + " ds = ds.isel(number=0, drop=True)\n", + " if \"step\" not in ds.dims:\n", + " return ds\n", + "\n", + " # 计算扁平有效时间轴\n", + " t = ds[\"time\"].values # (Nt,)\n", + " s = ds[\"step\"].values # (Ns,)\n", + " time_flat = (t[:, None] + s[None, :]).reshape(-1)\n", + "\n", + " # 把 (time, step) 叠成一维 'ts'\n", + " ds = ds.stack(ts=(\"time\", \"step\"))\n", + "\n", + " # 关键:不要删除 MultiIndex 的层级;直接“覆盖” ts 坐标为扁平时间\n", + " ds = ds.assign_coords(ts=(\"ts\", time_flat))\n", + "\n", + " # 此时 'ts' 已不是 MultiIndex,直接改名为 'time' 并排序\n", + " ds = ds.rename({\"ts\": \"time\"}).sortby(\"time\")\n", + "\n", + " # 去重:保留同一时刻的最后一次(一般对应较大的 step)\n", + " vals = ds[\"time\"].values\n", + " _, idx_rev = np.unique(vals[::-1], return_index=True)\n", + " keep = np.sort(vals.size - 1 - idx_rev)\n", + " ds = ds.isel(time=keep)\n", + "\n", + " return ds\n", + "\n", + "\n", + "def _drop_duplicate_times(ds: xr.Dataset) -> xr.Dataset:\n", + " if \"time\" not in ds.coords:\n", + " return ds\n", + " vals = ds[\"time\"].values\n", + " _, idx_rev = np.unique(vals[::-1], return_index=True)\n", + " keep = np.sort(vals.size - 1 - idx_rev)\n", + " return ds.isel(time=keep)\n", + "\n", + "\n", + "# ==========================\n", + "# 数据打开 & 空间索引\n", + "# ==========================\n", + "def open_feature_year(data_root: str, feature: str, year: int) -> xr.Dataset:\n", + " \"\"\"\n", + " 打开某个 feature 的全年 GRIB 并按 time 维拼接;自动展平 (time, step)。\n", + " 期望路径:era5land///reanalysis-era5-land__-MM.grib\n", + " 若文件名不完全一致,使用包含 year-MM 的 .grib 作为兜底。\n", + " \"\"\"\n", + " dir_year = os.path.join(data_root, feature, str(year))\n", + " if not os.path.isdir(dir_year):\n", + " raise FileNotFoundError(f\"dir not found: {dir_year}\")\n", + "\n", + " files: List[str] = []\n", + " for m in range(1, 13):\n", + " fname = f\"reanalysis-era5-land_{feature}_{year}-{m:02d}.grib\"\n", + " fpath = os.path.join(dir_year, fname)\n", + " if os.path.exists(fpath):\n", + " files.append(fpath)\n", + " else:\n", + " cand = [fn for fn in os.listdir(dir_year) if fn.endswith(\".grib\") and f\"{year}-{m:02d}\" in fn]\n", + " files += [os.path.join(dir_year, fn) for fn in sorted(cand)]\n", + " if not files:\n", + " raise FileNotFoundError(f\"No monthly grib files under {dir_year}\")\n", + "\n", + " dsets = []\n", + " for fp in files:\n", + " try:\n", + " ds = xr.open_dataset(\n", + " fp,\n", + " engine=\"cfgrib\",\n", + " backend_kwargs={\"indexpath\": \"\"},\n", + " decode_timedelta=True,\n", + " )\n", + " except Exception as e:\n", + " raise RuntimeError(\n", + " f\"Failed to open {fp} with engine='cfgrib'. \"\n", + " f\"Ensure cfgrib + eccodes are installed. Original error: {e}\"\n", + " )\n", + " ds = _flatten_time_step(ds)\n", + " dsets.append(ds)\n", + "\n", + " ds_all = xr.concat(dsets, dim=\"time\")\n", + " ds_all = ds_all.sortby(\"time\")\n", + " ds_all = _drop_duplicate_times(ds_all)\n", + " ds_all = _clip_to_year(ds_all, year) # ← 新增:裁到目标年份\n", + " return ds_all\n", + "\n", + "\n", + "def find_20x20_slices(ds: xr.Dataset, lat_c: float, lon_c: float) -> Tuple[slice, slice, Dict]:\n", + " lat_name, lon_name = _get_lat_lon_names(ds)\n", + " lat_arr = ds[lat_name].values\n", + " lon_arr = ds[lon_name].values\n", + "\n", + " lon_c_ds = to_dataset_lon(lon_c, lon_arr)\n", + " ilat_c = int(np.argmin(np.abs(lat_arr - lat_c)))\n", + " diff_lon = np.abs(((lon_arr - lon_c_ds + 180.0) % 360.0) - 180.0)\n", + " ilon_c = int(np.argmin(diff_lon))\n", + "\n", + " half = 10\n", + " ilat0, ilat1 = max(0, ilat_c - half), min(len(lat_arr), ilat_c + half)\n", + " ilon0, ilon1 = max(0, ilon_c - half), min(len(lon_arr), ilon_c + half)\n", + "\n", + " need_lat = 20 - (ilat1 - ilat0)\n", + " if need_lat > 0:\n", + " ilat0 = max(0, ilat0 - need_lat)\n", + " need_lon = 20 - (ilon1 - ilon0)\n", + " if need_lon > 0:\n", + " ilon0 = max(0, ilon0 - need_lon)\n", + "\n", + " ilat1 = min(len(lat_arr), ilat0 + 20)\n", + " ilon1 = min(len(lon_arr), ilon0 + 20)\n", + "\n", + " meta = dict(\n", + " lat_center=float(lat_arr[ilat_c]),\n", + " lon_center=float(lon_arr[ilon_c]),\n", + " lat_bounds=(float(lat_arr[min(ilat0, ilat1 - 1)]), float(lat_arr[max(ilat0, ilat1 - 1)])),\n", + " lon_bounds=(float(lon_arr[ilon0]), float(lon_arr[ilon1 - 1])),\n", + " ilat=(int(ilat0), int(ilat1)),\n", + " ilon=(int(ilon0), int(ilon1)),\n", + " lat_name=lat_name,\n", + " lon_name=lon_name,\n", + " )\n", + " return slice(ilat0, ilat1), slice(ilon0, ilon1), meta\n", + "\n", + "\n", + "# ==========================\n", + "# 形状规范化:到 (365, 20, 20, 24)\n", + "# ==========================\n", + "def feature_to_year_tensor20(ds_all: xr.Dataset,\n", + " var_name: str,\n", + " lat_slice: slice,\n", + " lon_slice: slice) -> np.ndarray:\n", + " lat_name, lon_name = _get_lat_lon_names(ds_all)\n", + " da = ds_all[var_name] # (time, lat, lon)\n", + "\n", + " da20 = da.isel({lat_name: lat_slice, lon_name: lon_slice})\n", + "\n", + " time = da20[\"time\"]\n", + " if hasattr(time, \"dt\"):\n", + " is_feb29 = (time.dt.month == 2) & (time.dt.day == 29)\n", + " if bool(is_feb29.any()):\n", + " da20 = da20.sel(time=~is_feb29)\n", + "\n", + " T = da20.sizes[\"time\"]\n", + " if T % 24 != 0:\n", + " raise ValueError(\n", + " f\"time length {T} not divisible by 24 after Feb-29 removal. \"\n", + " f\"Likely not hourly or 'step' not flattened. \"\n", + " f\"Inspect ds.dims and ds['time'] for details.\"\n", + " )\n", + " days = T // 24\n", + " if days != 365:\n", + " raise ValueError(f\"expected 365 days, got {days}. Check input files/year completeness.\")\n", + "\n", + " arr = da20.values.reshape(days, 24, 20, 20) # (365, 24, 20, 20)\n", + " arr = np.moveaxis(arr, 1, -1) # (365, 20, 20, 24)\n", + " return arr.astype(\"float32\")\n", + "\n", + "\n", + "# ==========================\n", + "# 主入口:城市+年份 → (365, X, 20, 20, 24)\n", + "# 带 .pth 缓存(year_city.pth)\n", + "# ==========================\n", + "def load_era5land_city_year(\n", + " city: str,\n", + " year: int,\n", + " data_root: str,\n", + " city_geo_dic: Dict[str, Tuple[float, float]],\n", + " feature_whitelist: Optional[List[str]] = None,\n", + " feature_blacklist: Optional[List[str]] = None,\n", + " cache_dir: str = \"era5_cache\",\n", + " force_refresh: bool = False,\n", + " max_features: int = 50,\n", + ") -> np.ndarray:\n", + " os.makedirs(cache_dir, exist_ok=True)\n", + " cache_name = f\"{int(year)}_{_safe_city_key(city)}.pth\"\n", + " cache_path = os.path.join(cache_dir, cache_name)\n", + " if (not force_refresh) and os.path.isfile(cache_path):\n", + " with open(cache_path, \"rb\") as f:\n", + " obj = pickle.load(f)\n", + " arr = obj[\"arr\"]\n", + " if (arr.ndim == 5 and arr.shape[0] == 365 and\n", + " arr.shape[2] == 20 and arr.shape[3] == 20 and arr.shape[4] == 24):\n", + " return arr\n", + " # 缓存不兼容则重建\n", + "\n", + " lat, lon = get_latlon(city, city_geo_dic)\n", + "\n", + " features = list_available_features(data_root, year, max_features=max_features)\n", + " if feature_whitelist:\n", + " wl = set(feature_whitelist)\n", + " features = [f for f in features if f in wl]\n", + " if feature_blacklist:\n", + " bl = set(feature_blacklist)\n", + " features = [f for f in features if f not in bl]\n", + " if not features:\n", + " raise RuntimeError(\"No features left after applying white/black list filters.\")\n", + "\n", + " probe_ds = open_feature_year(data_root, features[0], year)\n", + " lat_slice, lon_slice, region_meta = find_20x20_slices(probe_ds, lat, lon)\n", + "\n", + " tensors: List[np.ndarray] = []\n", + " for feat in features:\n", + " ds_all = open_feature_year(data_root, feat, year)\n", + " var_name = infer_var_name(ds_all, feat)\n", + " tens = feature_to_year_tensor20(ds_all, var_name, lat_slice, lon_slice)\n", + " tensors.append(tens.astype(\"float32\"))\n", + "\n", + " arr = np.stack(tensors, axis=1).astype(\"float32\") # (365, X, 20, 20, 24)\n", + "\n", + " to_save = {\"arr\": arr, \"city\": city, \"year\": int(year), \"features\": features, \"region_meta\": region_meta}\n", + " with open(cache_path, \"wb\") as f:\n", + " pickle.dump(to_save, f)\n", + " return arr\n", + "\n", + "\n", + "# ==========================\n", + "# 示例(可删)\n", + "# ==========================\n", + "if __name__ == \"__main__\":\n", + " city_geo_dic={\n", + " 'Leeds': (53.7974185, -1.5437941),\n", + " 'Bristol': (51.4538022, -2.5972985),\n", + " 'Newcastle': (54.9738474, -1.6131572),\n", + " 'Nottingham': (52.9534193, -1.1496461),\n", + " 'Liverpool': (53.4071991, -2.99168),\n", + " 'Sheffield': (53.3806626, -1.4702278),\n", + " 'Reading': (51.4514953, -0.9836342),\n", + " 'Bury': (52.2460367, 0.7125173),\n", + " 'Hounslow': (51.4686132, -0.3613471),\n", + " 'Croydon': (51.3713049, -0.101957),\n", + " 'Birmingham': (52.4796992, -1.9026911),\n", + " 'Middlesborough': (51.6107383, -0.0610164),\n", + " 'Stoke': (53.0162014, -2.1812607),\n", + " 'Glasgow': (55.861155, -4.2501687),\n", + " 'Cardiff': (51.4816546, -3.1791934),\n", + " 'Edinburgh': (55.9533456, -3.1883749),\n", + " 'Oxford': (51.7520131, -1.2578499),\n", + " 'Manchester': (53.4794892, -2.2451148),\n", + " 'Barts': (51.5175315, -0.0998302),\n", + " 'Swansea': (51.6195955, -3.9459248),\n", + " 'Wrexham': (53.0465084, -2.9937869)\n", + " }\n", + " data_root = \"era5land\"\n", + "\n", + " try:\n", + " arr = load_era5land_city_year(\n", + " city=\"Oxford\",\n", + " year=1997,\n", + " data_root=data_root,\n", + " city_geo_dic=city_geo_dic,\n", + " cache_dir=\"era5_cache\",\n", + " force_refresh=False,\n", + " max_features=50,\n", + " )\n", + " print(\"Loaded array shape:\", arr.shape) # (365, X, 20, 20, 24)\n", + " except Exception as e:\n", + " print(\"Error:\", e)" + ], + "metadata": { + "id": "4HZ5HfD_UF3v" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/jointContribution/AI_Climate_disease/paddle_TabM.ipynb b/jointContribution/AI_Climate_disease/paddle_TabM.ipynb new file mode 100644 index 000000000..f79cc8124 --- /dev/null +++ b/jointContribution/AI_Climate_disease/paddle_TabM.ipynb @@ -0,0 +1,1731 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "gpuType": "A100" + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "76ca8cfc292346dfadcc8f350c529734": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_28bd507f88a1466f94678bee217b5961", + "IPY_MODEL_c2e8877ed55246afb27c8fb03a697ca8", + "IPY_MODEL_a3154335e49b4386a312aac23a7388ad" + ], + "layout": "IPY_MODEL_d1b7cd83197b476b8fb2903489f75bfb" + } + }, + "28bd507f88a1466f94678bee217b5961": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1780e2c757bf42d7a2fcbb545fa5d7cc", + "placeholder": "​", + "style": "IPY_MODEL_616a990371dc40ec9296130ad1ed2ff0", + "value": "Epoch 1/1: 100%" + } + }, + "c2e8877ed55246afb27c8fb03a697ca8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_92a0d748812941039d3b06e84391d641", + "max": 625, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e9f86a7b5771466b99089bb9520e4aca", + "value": 625 + } + }, + "a3154335e49b4386a312aac23a7388ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0bccce02988645efbfbd7a29d8378898", + "placeholder": "​", + "style": "IPY_MODEL_4be3945108b947928029e0e9816dece8", + "value": " 625/625 [10:38<00:00,  1.01s/it, loss=0.1582]" + } + }, + "d1b7cd83197b476b8fb2903489f75bfb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "1780e2c757bf42d7a2fcbb545fa5d7cc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "616a990371dc40ec9296130ad1ed2ff0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "92a0d748812941039d3b06e84391d641": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e9f86a7b5771466b99089bb9520e4aca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0bccce02988645efbfbd7a29d8378898": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4be3945108b947928029e0e9816dece8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7f33ec822fbc4d07af9be3d457af3cec": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c3663fe04105476fae614fd17b98caa8", + "IPY_MODEL_b618e40973224e218b4caa01f1d07224", + "IPY_MODEL_f8a12ceb21da4c19893bc2c795edf115" + ], + "layout": "IPY_MODEL_9203599d4de840719c301d5f77ccb1cf" + } + }, + "c3663fe04105476fae614fd17b98caa8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2400cf85591f468482e05dc382b5cbe1", + "placeholder": "​", + "style": "IPY_MODEL_160db9542e184f14bd9d1ffb7e7695df", + "value": "Epoch 1/1:   0%" + } + }, + "b618e40973224e218b4caa01f1d07224": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bbc1d8ac1e3a4348981afa663f912810", + "max": 625, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4013a6c5ccad4fe4b64110359e1aa0dd", + "value": 3 + } + }, + "f8a12ceb21da4c19893bc2c795edf115": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4c67098f55fa4786b86ffc6a9779f914", + "placeholder": "​", + "style": "IPY_MODEL_bf903af558494b1ab6a0e07e661423ea", + "value": " 3/625 [00:03<11:04,  1.07s/it, loss=0.3910]" + } + }, + "9203599d4de840719c301d5f77ccb1cf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2400cf85591f468482e05dc382b5cbe1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "160db9542e184f14bd9d1ffb7e7695df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bbc1d8ac1e3a4348981afa663f912810": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4013a6c5ccad4fe4b64110359e1aa0dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4c67098f55fa4786b86ffc6a9779f914": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bf903af558494b1ab6a0e07e661423ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "2mk4wkvoLMdg" + }, + "outputs": [], + "source": [ + "# =========================\n", + "# 配置(按需修改)\n", + "# =========================\n", + "DATA_PATH = \"/content/drive/MyDrive/demo_200000.csv\" # 支持 CSV 或 Excel\n", + "SHEET_NAME = None # Excel 时可指定;CSV 忽略\n", + "\n", + "# 特征版本:'no_region'(不带地区)或 'region_onehot'(地区独热)\n", + "VERSION = \"no_region\"\n", + "# 若用 'region_onehot',把地区列名写这里(可多个)\n", + "REGION_COLS = [\"UK.Biobank.assessment.centre...Instance.0\"]\n", + "\n", + "# 训练超参\n", + "TEST_SIZE = 0.2\n", + "EPOCHS = 1\n", + "BATCH_SIZE = 256\n", + "LR = 1e-3\n", + "SEED = 42\n", + "\n", + "# TabM / Backbone 配置\n", + "ARCH_TYPE = \"tabm\" # 'plain' | 'tabm' | 'tabm-mini' | 'tabm-packed'\n", + "TABM_K = 32 # mini-ensemble 宽度(tabm/tabm-packed 生效)\n", + "BACKBONE_CFG = dict(n_blocks=3, d_hidden=512, dropout=0.2)\n", + "\n", + "# 可选:保存模型与预处理器(为空不保存)\n", + "SAVE_DIR = \"\" # 例如 \"/mnt/data/tabm_artifacts\"\n" + ] + }, + { + "cell_type": "code", + "source": [ + "!pip -q install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple\n", + "\n", + "# 验证\n", + "import paddle\n", + "paddle.utils.run_check()\n", + "print(\"Paddle version:\", paddle.__version__)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "dvMGg_p_LpAK", + "outputId": "c53dab5d-e521-45d7-efbd-a23ed622e8aa" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m189.0/189.0 MB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m65.5/65.5 kB\u001b[0m \u001b[31m6.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/paddle/utils/cpp_extension/extension_utils.py:718: UserWarning: No ccache found. Please be aware that recompiling all source files may be required. You can download and install ccache from: https://github.com/ccache/ccache/blob/master/doc/INSTALL.md\n", + " warnings.warn(warning_message)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running verify PaddlePaddle program ... \n", + "PaddlePaddle works well on 1 CPU.\n", + "PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.\n", + "Paddle version: 3.2.0\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.12/dist-packages/paddle/pir/math_op_patch.py:219: UserWarning: Value do not have 'place' interface for pir graph mode, try not to use it. None will be returned.\n", + " warnings.warn(\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "a9zCOfz2LjbU", + "outputId": "96105fa1-5dd6-45c9-d7c5-a495dee229c8" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# 依赖导入\n", + "# =========================\n", + "import os, json, math, warnings\n", + "warnings.filterwarnings(\"ignore\", category=UserWarning)\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "from typing import List, Dict, Any, Tuple, Literal, Optional\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler, OneHotEncoder\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.metrics import (\n", + " accuracy_score, f1_score, roc_auc_score, precision_score, recall_score,\n", + " hamming_loss, average_precision_score, multilabel_confusion_matrix\n", + ")\n", + "from tqdm.auto import tqdm\n", + "\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "from paddle.io import Dataset, DataLoader\n", + "\n", + "def seed_everything(seed: int = 42):\n", + " import random, os\n", + " random.seed(seed); np.random.seed(seed)\n", + " paddle.seed(seed)\n", + " os.environ[\"PYTHONHASHSEED\"] = str(seed)\n", + "\n", + "seed_everything(SEED)\n", + "paddle.set_device(\"cpu\") # 强制使用 CPU\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ilmYOLLVLl1v", + "outputId": "9b3b2c83-369e-4887-9ffa-0481c10f710a" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Place(cpu)" + ] + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# 读入数据(CSV / Excel 自适应)\n", + "# =========================\n", + "if DATA_PATH.lower().endswith(\".csv\"):\n", + " df = pd.read_csv(DATA_PATH)\n", + "else:\n", + " df = pd.read_excel(DATA_PATH, sheet_name=SHEET_NAME) if SHEET_NAME else pd.read_excel(DATA_PATH)\n", + "\n", + "df.shape, df.head(3)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "R8eapI0sL34a", + "outputId": "99abc3dd-cb59-4dbf-9d37-8ba9dee7e923" + }, + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "((200000, 434),\n", + " ID UK.Biobank.assessment.centre...Instance.0 cataract cataract_time \\\n", + " 0 3203000 Leeds 1 2011-09-28 \n", + " 1 4084800 Stockport (pilot) 0 NaN \n", + " 2 1759102 Glasgow 0 NaN \n", + " \n", + " glaucoma glaucoma_time AMD AMD_time DR DR_time ... Operation_Code \\\n", + " 0 0 NaN 0 NaN 0 NaN ... 1 \n", + " 1 0 NaN 0 NaN 0 NaN ... 1 \n", + " 2 0 NaN 0 NaN 0 NaN ... 1 \n", + " \n", + " Home_Area_Population_Density Pulse_Rate FEV1 PEF \\\n", + " 0 0.0 66.0 1.876667 197.333333 \n", + " 1 0.0 65.5 NaN NaN \n", + " 2 1.0 NaN 3.966667 442.000000 \n", + " \n", + " Incorrect_Matches Diastolic_BP Systolic_BP FVC Total_Bilirubin \n", + " 0 1.0 83.0 165.5 2.54 6.27 \n", + " 1 NaN 96.5 155.5 NaN NaN \n", + " 2 4.5 NaN NaN 5.67 20.19 \n", + " \n", + " [3 rows x 434 columns])" + ] + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# 工具 & 常量\n", + "# =========================\n", + "EXCLUDE_COLS = [\"ID\",\"DR\",\"DR_time\",\"AMD_time\",\"AMD\",\"glaucoma_time\",\"glaucoma\",\"cataract_time\",\"cataract\"]\n", + "LABEL_COLS = [\"DR\",\"AMD\",\"glaucoma\",\"cataract\"]\n", + "\n", + "def make_onehot_encoder():\n", + " # 兼容不同 sklearn 版本\n", + " try:\n", + " return OneHotEncoder(sparse_output=False, handle_unknown=\"ignore\")\n", + " except TypeError:\n", + " return OneHotEncoder(sparse=False, handle_unknown=\"ignore\")\n", + "\n", + "def safe_auc(y_true: np.ndarray, y_prob: np.ndarray, average: str) -> float:\n", + " try: return roc_auc_score(y_true, y_prob, average=average)\n", + " except Exception: return float(\"nan\")\n", + "\n", + "def safe_ap(y_true: np.ndarray, y_prob: np.ndarray, average: str) -> float:\n", + " try: return average_precision_score(y_true, y_prob, average=average)\n", + " except Exception: return float(\"nan\")\n", + "\n", + "def per_label_auc_ap(y_true: np.ndarray, y_prob: np.ndarray, label_names: List[str]) -> Dict[str, Dict[str, float]]:\n", + " out = {}\n", + " for i, name in enumerate(label_names):\n", + " yt, yp = y_true[:, i], y_prob[:, i]\n", + " if len(np.unique(yt)) >= 2:\n", + " out[name] = {\n", + " \"roc_auc\": roc_auc_score(yt, yp),\n", + " \"ap\": average_precision_score(yt, yp)\n", + " }\n", + " else:\n", + " out[name] = {\"roc_auc\": float(\"nan\"), \"ap\": float(\"nan\")}\n", + " return out\n", + "\n", + "def per_label_confusion(y_true: np.ndarray, y_pred: np.ndarray, label_names: List[str]) -> Dict[str, Dict[str, int]]:\n", + " cms = multilabel_confusion_matrix(y_true, y_pred)\n", + " out = {}\n", + " for i, name in enumerate(label_names):\n", + " tn, fp, fn, tp = cms[i].ravel().tolist()\n", + " out[name] = {\"tn\": int(tn), \"fp\": int(fp), \"fn\": int(fn), \"tp\": int(tp)}\n", + " return out\n" + ], + "metadata": { + "id": "x-70ogOQL76X" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# 特征构建(两版:不带地区 / 地区独热)\n", + "# - 数值/布尔列:均值填充 + 标准化\n", + "# - 仅当 region_onehot 时,对 REGION_COLS 做 OneHot\n", + "# - 其它非数值列丢弃\n", + "# =========================\n", + "def build_features_labels(\n", + " df: pd.DataFrame,\n", + " version: str,\n", + " region_cols: List[str]\n", + ") -> Tuple[np.ndarray, np.ndarray, Dict[str, Any]]:\n", + " assert all(c in df.columns for c in LABEL_COLS), f\"缺少标签列:{LABEL_COLS}\"\n", + " y = df[LABEL_COLS].astype(float).values\n", + "\n", + " base_drop = list(set(EXCLUDE_COLS))\n", + " feat_df = df.drop(columns=[c for c in base_drop if c in df.columns], errors=\"ignore\")\n", + "\n", + " existing_regions = []\n", + " if version == \"region_onehot\" and region_cols:\n", + " existing_regions = [c for c in region_cols if c in feat_df.columns]\n", + " feat_df = feat_df.drop(columns=existing_regions, errors=\"ignore\")\n", + "\n", + " # 尝试数值化(失败置 NaN)\n", + " X_num_try = feat_df.apply(pd.to_numeric, errors=\"coerce\")\n", + " keep_cols = [c for c in X_num_try.columns if not X_num_try[c].isna().all()]\n", + " if len(keep_cols) == 0:\n", + " raise ValueError(\"没有可用的数值特征列。请检查数据,或设置 VERSION='region_onehot' 并正确指定 REGION_COLS。\")\n", + " X_num = X_num_try[keep_cols].copy()\n", + " for c in X_num.columns:\n", + " if X_num[c].dtype == bool:\n", + " X_num[c] = X_num[c].astype(float)\n", + "\n", + " # 数值列:均值填充 + 标准化\n", + " imputer = SimpleImputer(strategy=\"mean\")\n", + " scaler = StandardScaler()\n", + " X_num_imp = imputer.fit_transform(X_num.values)\n", + " X_num_std = scaler.fit_transform(X_num_imp)\n", + "\n", + " meta: Dict[str, Any] = {\n", + " \"version\": version,\n", + " \"kept_numeric_cols\": keep_cols,\n", + " \"used_region_cols\": existing_regions,\n", + " \"imputer\": imputer,\n", + " \"scaler\": scaler,\n", + " \"enc\": None,\n", + " \"feature_dim_before_region\": X_num_std.shape[1]\n", + " }\n", + "\n", + " if version == \"region_onehot\" and existing_regions:\n", + " enc = make_onehot_encoder()\n", + " X_region = enc.fit_transform(df[existing_regions].fillna(\"missing\"))\n", + " X = np.hstack([X_num_std, X_region])\n", + " meta[\"enc\"] = enc\n", + " meta[\"region_onehot_dim\"] = X_region.shape[1]\n", + " else:\n", + " X = X_num_std\n", + " meta[\"region_onehot_dim\"] = 0\n", + "\n", + " meta[\"final_input_dim\"] = X.shape[1]\n", + " return X, y, meta\n" + ], + "metadata": { + "id": "CJ6ILYOrL8E1" + }, + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# TabM 组件(Paddle 实现)\n", + "# =========================\n", + "def init_rsqrt_uniform_(w: paddle.Tensor) -> paddle.Tensor:\n", + " bound = 1.0 / math.sqrt(w.shape[-1])\n", + " noise = paddle.uniform(w.shape, min=-bound, max=bound, dtype=w.dtype)\n", + " w.set_value(noise); return w\n", + "\n", + "def init_random_signs_(w: paddle.Tensor) -> paddle.Tensor:\n", + " with paddle.no_grad():\n", + " p = paddle.full(w.shape, 0.5, dtype='float32')\n", + " s = paddle.bernoulli(p) * 2.0 - 1.0\n", + " s = paddle.cast(s, w.dtype)\n", + " w.set_value(s)\n", + " return w\n", + "\n", + "class NLinear(nn.Layer):\n", + " \"\"\"PackedEnsemble: K 份 Linear 打包 → 输入 (B,K,D), 权重 (K, I, O)\"\"\"\n", + " def __init__(self, k: int, in_f: int, out_f: int, bias: bool = True):\n", + " super().__init__()\n", + " self.k, self.in_f, self.out_f = k, in_f, out_f\n", + " self.weight = self.create_parameter(shape=[k, in_f, out_f])\n", + " self.bias_e = self.create_parameter(shape=[k, out_f]) if bias else None\n", + " self.reset_parameters()\n", + "\n", + " def reset_parameters(self):\n", + " init_rsqrt_uniform_(self.weight)\n", + " if self.bias_e is not None:\n", + " init_rsqrt_uniform_(self.bias_e)\n", + "\n", + " def forward(self, x): # x: (B,K,I)\n", + " xk = paddle.transpose(x, [1, 0, 2]) # (K,B,I)\n", + " yk = paddle.bmm(xk, self.weight) # (K,B,O)\n", + " y = paddle.transpose(yk, [1, 0, 2]) # (B,K,O)\n", + " if self.bias_e is not None:\n", + " y = y + self.bias_e\n", + " return y\n", + "\n", + "class ScaleEnsemble(nn.Layer):\n", + " def __init__(self, k: int, d: int, init='ones'):\n", + " super().__init__()\n", + " self.k, self.d = k, d\n", + " self.weight = self.create_parameter(shape=[k, d])\n", + " self.init = init; self.reset_parameters()\n", + " def reset_parameters(self):\n", + " if self.init == 'ones':\n", + " self.weight.set_value(paddle.ones_like(self.weight))\n", + " else:\n", + " init_random_signs_(self.weight)\n", + " def forward(self, x): # (B,K,D)\n", + " return x * self.weight\n", + "\n", + "class LinearBE(nn.Layer):\n", + " \"\"\"BatchEnsemble Linear:\n", + " y_e = ((x * r_e) @ W) * s_e + b_e\n", + " x: (B,K,I) → y: (B,K,O)\n", + " \"\"\"\n", + " def __init__(self, in_f: int, out_f: int, k: int, scale_init='ones', bias: bool = True):\n", + " super().__init__()\n", + " self.k, self.in_f, self.out_f = k, in_f, out_f\n", + " self.weight = self.create_parameter(shape=[in_f, out_f]) # 共享权重\n", + " self.r = self.create_parameter(shape=[k, in_f])\n", + " self.s = self.create_parameter(shape=[k, out_f])\n", + " self.use_bias = bias\n", + " self.bias_e = self.create_parameter(shape=[k, out_f]) if bias else None\n", + " self.scale_init = scale_init\n", + " self.reset_parameters()\n", + "\n", + " def reset_parameters(self):\n", + " init_rsqrt_uniform_(self.weight)\n", + " if self.scale_init == 'ones':\n", + " self.r.set_value(paddle.ones_like(self.r))\n", + " self.s.set_value(paddle.ones_like(self.s))\n", + " else:\n", + " init_random_signs_(self.r); init_random_signs_(self.s)\n", + " if self.use_bias:\n", + " init_rsqrt_uniform_(self.bias_e)\n", + "\n", + " def forward(self, x): # (B,K,I)\n", + " xr = x * self.r # (B,K,I)\n", + " y = paddle.matmul(xr, self.weight) # (B,K,O)\n", + " y = y * self.s\n", + " if self.use_bias:\n", + " y = y + self.bias_e\n", + " return y\n", + "\n", + "class MLPBlock(nn.Layer):\n", + " def __init__(self, d_in, d_hid, dropout, act='ReLU'):\n", + " super().__init__()\n", + " Act = getattr(nn, act)\n", + " self.net = nn.Sequential(\n", + " nn.Linear(d_in, d_hid),\n", + " Act(),\n", + " nn.Dropout(dropout),\n", + " )\n", + " def forward(self, x): return self.net(x)\n", + "\n", + "class BackboneMLP(nn.Layer):\n", + " def __init__(self, n_blocks: int, d_in: int, d_hidden: int, dropout: float):\n", + " super().__init__()\n", + " blocks = []\n", + " for i in range(n_blocks):\n", + " blocks.append(MLPBlock(d_in if i==0 else d_hidden, d_hidden, dropout))\n", + " self.blocks = nn.LayerList(blocks)\n", + " def forward(self, x):\n", + " for blk in self.blocks:\n", + " x = blk(x)\n", + " return x\n", + "\n", + "def _get_parent_by_path(root: nn.Layer, path_list):\n", + " cur = root\n", + " for p in path_list:\n", + " if hasattr(cur, p):\n", + " cur = getattr(cur, p)\n", + " else:\n", + " sub_layers = getattr(cur, \"_sub_layers\", None)\n", + " if sub_layers is None or p not in sub_layers:\n", + " raise AttributeError(f\"Cannot locate sublayer '{p}' under '{type(cur).__name__}'\")\n", + " cur = sub_layers[p]\n", + " return cur\n", + "\n", + "def _replace_linear(module: nn.Layer, k: int, mode: Literal['be','packed']):\n", + " to_replace = []\n", + " for full_name, layer in module.named_sublayers(include_self=False):\n", + " if isinstance(layer, nn.Linear):\n", + " parts = full_name.split('.')\n", + " parent_path, child_name = parts[:-1], parts[-1]\n", + " parent = _get_parent_by_path(module, parent_path) if parent_path else module\n", + " in_f = layer.weight.shape[0]\n", + " out_f = layer.weight.shape[1]\n", + " if mode == 'be':\n", + " new_layer = LinearBE(in_f, out_f, k)\n", + " with paddle.no_grad():\n", + " new_layer.weight.set_value(layer.weight.clone())\n", + " if layer.bias is not None and new_layer.bias_e is not None:\n", + " b = layer.bias.reshape([1,-1]).tile([k,1])\n", + " new_layer.bias_e.set_value(b)\n", + " else: # packed\n", + " new_layer = NLinear(k, in_f, out_f, bias=layer.bias is not None)\n", + " with paddle.no_grad():\n", + " w = layer.weight.unsqueeze(0).tile([k,1,1])\n", + " new_layer.weight.set_value(w)\n", + " if layer.bias is not None and new_layer.bias_e is not None:\n", + " b = layer.bias.unsqueeze(0).tile([k,1])\n", + " new_layer.bias_e.set_value(b)\n", + " to_replace.append((parent, child_name, new_layer))\n", + " for parent, child_name, new_layer in to_replace:\n", + " if hasattr(parent, child_name):\n", + " setattr(parent, child_name, new_layer)\n", + " else:\n", + " parent._sub_layers[child_name] = new_layer\n", + "\n", + "class TabMFeatureExtractor(nn.Layer):\n", + " \"\"\"arch_type: 'plain' | 'tabm' | 'tabm-mini' | 'tabm-packed'\"\"\"\n", + " def __init__(self,\n", + " num_features: int,\n", + " arch_type: Literal['plain','tabm','tabm-mini','tabm-packed']='tabm',\n", + " k: int = 32,\n", + " backbone_cfg: Optional[dict] = None,\n", + " reduce: bool = True):\n", + " super().__init__()\n", + " if arch_type == 'plain':\n", + " k = 1\n", + " self.k = k\n", + " self.reduce = reduce\n", + " cfg = backbone_cfg or dict(n_blocks=3, d_hidden=512, dropout=0.1)\n", + " self.d_hidden = cfg[\"d_hidden\"]\n", + " self.backbone = BackboneMLP(**cfg, d_in=num_features)\n", + "\n", + " if arch_type == 'tabm':\n", + " _replace_linear(self.backbone, k, mode='be')\n", + " self.min_adapter = None\n", + " elif arch_type == 'tabm-mini':\n", + " self.min_adapter = ScaleEnsemble(k, num_features, init='random-signs')\n", + " elif arch_type == 'tabm-packed':\n", + " _replace_linear(self.backbone, k, mode='packed')\n", + " self.min_adapter = None\n", + " else:\n", + " self.min_adapter = None\n", + "\n", + " def forward(self, x_num: paddle.Tensor): # x_num: (B, D)\n", + " if self.k > 1:\n", + " x = x_num.unsqueeze(1).tile([1, self.k, 1]) # (B,K,D)\n", + " else:\n", + " x = x_num.unsqueeze(1) # (B,1,D)\n", + " if self.min_adapter is not None:\n", + " x = self.min_adapter(x)\n", + " feats = self.backbone(x) # (B,K,H)\n", + " return feats.mean(axis=1) if self.reduce else feats # (B,H) 或 (B,K,H)\n" + ], + "metadata": { + "id": "atHvFaijMDx_" + }, + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# 数据集 & 评估 & 训练(Paddle)\n", + "# =========================\n", + "class NumpyDataset(Dataset):\n", + " def __init__(self, X: np.ndarray, y: np.ndarray):\n", + " self.X = X.astype(\"float32\")\n", + " self.y = y.astype(\"float32\")\n", + " def __len__(self): return self.X.shape[0]\n", + " def __getitem__(self, idx): return self.X[idx], self.y[idx]\n", + "\n", + "class TabMClassifier(nn.Layer):\n", + " def __init__(self, input_dim: int, arch_type: str, k: int, backbone_cfg: dict, out_dim: int = 4):\n", + " super().__init__()\n", + " self.feat = TabMFeatureExtractor(\n", + " num_features=input_dim,\n", + " arch_type=arch_type,\n", + " k=k,\n", + " backbone_cfg=backbone_cfg,\n", + " reduce=True\n", + " )\n", + " self.head = nn.Linear(self.feat.d_hidden, out_dim) # 输出logits\n", + "\n", + " def forward(self, x): # x: (B, D)\n", + " h = self.feat(x) # (B, H)\n", + " logits = self.head(h) # (B, 4)\n", + " return logits\n", + "\n", + "@paddle.no_grad()\n", + "def evaluate(model: nn.Layer, Xv: np.ndarray, yv: np.ndarray, thr: float = 0.5) -> Dict[str, Any]:\n", + " model.eval()\n", + " Xv_t = paddle.to_tensor(Xv.astype(\"float32\"))\n", + " logits = model(Xv_t)\n", + " probs = F.sigmoid(logits).numpy()\n", + " y_true = yv.astype(int)\n", + " y_pred = (probs >= thr).astype(int)\n", + "\n", + " metrics = {\n", + " \"subset_accuracy\": accuracy_score(y_true, y_pred),\n", + " \"hamming_loss\": hamming_loss(y_true, y_pred)\n", + " }\n", + " for avg in [\"micro\", \"macro\", \"weighted\"]:\n", + " metrics[f\"precision_{avg}\"] = precision_score(y_true, y_pred, average=avg, zero_division=0)\n", + " metrics[f\"recall_{avg}\"] = recall_score(y_true, y_pred, average=avg, zero_division=0)\n", + " metrics[f\"f1_{avg}\"] = f1_score(y_true, y_pred, average=avg, zero_division=0)\n", + " metrics[\"roc_auc_macro\"] = safe_auc(y_true, probs, average=\"macro\")\n", + " metrics[\"roc_auc_micro\"] = safe_auc(y_true, probs, average=\"micro\")\n", + " metrics[\"pr_auc_macro\"] = safe_ap(y_true, probs, average=\"macro\")\n", + " metrics[\"pr_auc_micro\"] = safe_ap(y_true, probs, average=\"micro\")\n", + " metrics[\"per_label_auc_ap\"] = per_label_auc_ap(y_true, probs, LABEL_COLS)\n", + " metrics[\"per_label_confusion\"] = per_label_confusion(y_true, y_pred, LABEL_COLS)\n", + " return metrics\n", + "\n", + "from tqdm.auto import tqdm\n", + "import paddle\n", + "import paddle.nn as nn\n", + "import paddle.nn.functional as F\n", + "\n", + "def train(model: nn.Layer,\n", + " train_loader,\n", + " X_val: np.ndarray,\n", + " y_val: np.ndarray,\n", + " epochs: int = 20,\n", + " lr: float = 1e-3):\n", + " model.train()\n", + " opt = paddle.optimizer.Adam(learning_rate=lr, parameters=model.parameters())\n", + " history = []\n", + "\n", + " for ep in range(1, epochs + 1):\n", + " model.train()\n", + " running, seen = 0.0, 0\n", + " pbar = tqdm(train_loader, desc=f\"Epoch {ep}/{epochs}\", leave=False)\n", + "\n", + " for xb, yb in pbar:\n", + " # forward\n", + " logits = model(xb) # (B,4)\n", + " loss = F.binary_cross_entropy_with_logits(logits, yb, reduction='mean')\n", + "\n", + " # backward\n", + " loss.backward()\n", + " opt.step()\n", + " opt.clear_grad()\n", + "\n", + " # 记录损失 —— 关键修复:使用 loss.item()(或 float(loss.numpy()))\n", + " bs = xb.shape[0]\n", + " running += loss.item() * bs\n", + " seen += bs\n", + " pbar.set_postfix(loss=f\"{running/max(seen,1):.4f}\")\n", + "\n", + " tr_loss = running / max(seen, 1)\n", + "\n", + " # 验证\n", + " ev = evaluate(model, X_val, y_val)\n", + " ev[\"epoch\"] = ep\n", + " ev[\"train_loss\"] = tr_loss\n", + " history.append(ev)\n", + "\n", + " print(f\"[Epoch {ep:03d}] loss={tr_loss:.4f} \"\n", + " f\"F1(micro)={ev['f1_micro']:.4f} \"\n", + " f\"AUC(macro)={ev['roc_auc_macro']:.4f} \"\n", + " f\"PR-AUC(macro)={ev['pr_auc_macro']:.4f}\")\n", + "\n", + " return model, history\n", + "\n" + ], + "metadata": { + "id": "HGz5LYpnL8Hl" + }, + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# 构建特征 & 划分数据集 & 训练\n", + "# =========================\n", + "X, y, meta = build_features_labels(df, VERSION, REGION_COLS)\n", + "X_tr, X_va, y_tr, y_va = train_test_split(X, y, test_size=TEST_SIZE, random_state=SEED)\n", + "\n", + "train_ds = NumpyDataset(X_tr, y_tr)\n", + "train_loader = DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True, drop_last=False)\n", + "\n", + "model = TabMClassifier(\n", + " input_dim=X_tr.shape[1],\n", + " arch_type=ARCH_TYPE,\n", + " k=TABM_K,\n", + " backbone_cfg=BACKBONE_CFG,\n", + " out_dim=len(LABEL_COLS)\n", + ")\n", + "\n", + "model, history = train(model, train_loader, X_va, y_va, epochs=EPOCHS, lr=LR)\n", + "\n", + "final_eval = evaluate(model, X_va, y_va)\n", + "pd.DataFrame([{\n", + " \"subset_accuracy\": final_eval[\"subset_accuracy\"],\n", + " \"hamming_loss\": final_eval[\"hamming_loss\"],\n", + " \"precision_micro\": final_eval[\"precision_micro\"],\n", + " \"recall_micro\": final_eval[\"recall_micro\"],\n", + " \"f1_micro\": final_eval[\"f1_micro\"],\n", + " \"precision_macro\": final_eval[\"precision_macro\"],\n", + " \"recall_macro\": final_eval[\"recall_macro\"],\n", + " \"f1_macro\": final_eval[\"f1_macro\"],\n", + " \"roc_auc_macro\": final_eval[\"roc_auc_macro\"],\n", + " \"roc_auc_micro\": final_eval[\"roc_auc_micro\"],\n", + " \"pr_auc_macro\": final_eval[\"pr_auc_macro\"],\n", + " \"pr_auc_micro\": final_eval[\"pr_auc_micro\"],\n", + "}])\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 119, + "referenced_widgets": [ + "76ca8cfc292346dfadcc8f350c529734", + "28bd507f88a1466f94678bee217b5961", + "c2e8877ed55246afb27c8fb03a697ca8", + "a3154335e49b4386a312aac23a7388ad", + "d1b7cd83197b476b8fb2903489f75bfb", + "1780e2c757bf42d7a2fcbb545fa5d7cc", + "616a990371dc40ec9296130ad1ed2ff0", + "92a0d748812941039d3b06e84391d641", + "e9f86a7b5771466b99089bb9520e4aca", + "0bccce02988645efbfbd7a29d8378898", + "4be3945108b947928029e0e9816dece8" + ] + }, + "id": "MxDDYK8LMKtD", + "outputId": "3a7d681d-5900-4791-eef2-f39780dc9186" + }, + "execution_count": 11, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Epoch 1/1: 0%| | 0/625 [00:00\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subset_accuracyhamming_lossprecision_microrecall_microf1_microprecision_macrorecall_macrof1_macroroc_auc_macroroc_auc_micropr_auc_macropr_auc_micro
00.8314750.0522190.4559750.0703630.1219130.2407220.0505570.0835630.7940740.8599870.1946720.27163
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "summary": "{\n \"name\": \"}])\",\n \"rows\": 1,\n \"fields\": [\n {\n \"column\": \"subset_accuracy\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.831475,\n \"max\": 0.831475,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.831475\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"hamming_loss\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.05221875,\n \"max\": 0.05221875,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.05221875\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"precision_micro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.4559748427672956,\n \"max\": 0.4559748427672956,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.4559748427672956\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"recall_micro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.07036273201504306,\n \"max\": 0.07036273201504306,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.07036273201504306\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"f1_micro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.12191276931161324,\n \"max\": 0.12191276931161324,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.12191276931161324\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"precision_macro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.240721940214326,\n \"max\": 0.240721940214326,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.240721940214326\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"recall_macro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.05055690064614064,\n \"max\": 0.05055690064614064,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.05055690064614064\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"f1_macro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.08356312939216112,\n \"max\": 0.08356312939216112,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.08356312939216112\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"roc_auc_macro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.7940743075848319,\n \"max\": 0.7940743075848319,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.7940743075848319\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"roc_auc_micro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.859986601711957,\n \"max\": 0.859986601711957,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.859986601711957\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"pr_auc_macro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.19467193877891958,\n \"max\": 0.19467193877891958,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.19467193877891958\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"pr_auc_micro\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": null,\n \"min\": 0.27162957409528626,\n \"max\": 0.27162957409528626,\n \"num_unique_values\": 1,\n \"samples\": [\n 0.27162957409528626\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + } + }, + "metadata": {}, + "execution_count": 11 + } + ] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# 可选:保存模型与预处理器\n", + "# =========================\n", + "def save_artifacts(save_dir: str, model: nn.Layer, meta: Dict[str, Any]):\n", + " os.makedirs(save_dir, exist_ok=True)\n", + " paddle.save(model.state_dict(), os.path.join(save_dir, \"model.pdparams\"))\n", + " try:\n", + " import joblib\n", + " joblib.dump(meta[\"imputer\"], os.path.join(save_dir, \"imputer.joblib\"))\n", + " joblib.dump(meta[\"scaler\"], os.path.join(save_dir, \"scaler.joblib\"))\n", + " if meta.get(\"enc\", None) is not None:\n", + " joblib.dump(meta[\"enc\"], os.path.join(save_dir, \"onehot_encoder.joblib\"))\n", + " with open(os.path.join(save_dir, \"meta.json\"), \"w\", encoding=\"utf-8\") as f:\n", + " json.dump({\n", + " \"LABEL_COLS\": LABEL_COLS,\n", + " \"EXCLUDE_COLS\": EXCLUDE_COLS,\n", + " \"used_region_cols\": meta.get(\"used_region_cols\", []),\n", + " \"feature_dim_before_region\": meta.get(\"feature_dim_before_region\", None),\n", + " \"region_onehot_dim\": meta.get(\"region_onehot_dim\", None),\n", + " \"final_input_dim\": meta.get(\"final_input_dim\", None),\n", + " \"version\": meta.get(\"version\", None),\n", + " \"arch_type\": ARCH_TYPE,\n", + " \"k\": TABM_K,\n", + " \"backbone_cfg\": BACKBONE_CFG,\n", + " }, f, ensure_ascii=False, indent=2)\n", + " print(f\"[INFO] Artifacts saved to: {save_dir}\")\n", + " except Exception as e:\n", + " print(f\"[WARN] Failed to save preprocessors: {e}\")\n", + "\n", + "if SAVE_DIR:\n", + " save_artifacts(SAVE_DIR, model, meta)\n" + ], + "metadata": { + "id": "uLRAQZuvMOqr" + }, + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# =========================\n", + "# (可选)快速对比 no_region vs region_onehot(若地区列存在)\n", + "# =========================\n", + "def run_variant(version: str, region_cols: List[str], epochs= max(1, EPOCHS//2)):\n", + " Xv, yv, metav = build_features_labels(df, version, region_cols)\n", + " X_tr, X_va, y_tr, y_va = train_test_split(Xv, yv, test_size=TEST_SIZE, random_state=SEED)\n", + " ds = NumpyDataset(X_tr, y_tr)\n", + " loader = DataLoader(ds, batch_size=BATCH_SIZE, shuffle=True, drop_last=False)\n", + " m = TabMClassifier(\n", + " input_dim=X_tr.shape[1],\n", + " arch_type=ARCH_TYPE,\n", + " k=TABM_K,\n", + " backbone_cfg=BACKBONE_CFG,\n", + " out_dim=len(LABEL_COLS)\n", + " )\n", + " m, _ = train(m, loader, X_va, y_va, epochs=epochs, lr=LR)\n", + " ev = evaluate(m, X_va, y_va)\n", + " return ev\n", + "\n", + "try:\n", + " ev_no_region = run_variant(\"no_region\", REGION_COLS)\n", + " existing_regions = [c for c in REGION_COLS if c in df.columns]\n", + " if existing_regions:\n", + " ev_region = run_variant(\"region_onehot\", REGION_COLS)\n", + " comp = pd.DataFrame([\n", + " {\"version\": \"no_region\", **{k: ev_no_region[k] for k in [\n", + " \"subset_accuracy\",\"hamming_loss\",\"f1_micro\",\"f1_macro\",\"roc_auc_macro\",\"pr_auc_macro\"\n", + " ]}},\n", + " {\"version\": \"region_onehot\", **{k: ev_region[k] for k in [\n", + " \"subset_accuracy\",\"hamming_loss\",\"f1_micro\",\"f1_macro\",\"roc_auc_macro\",\"pr_auc_macro\"\n", + " ]}},\n", + " ])\n", + " comp\n", + " else:\n", + " print(\"未找到指定的地区列,跳过对比。\")\n", + "except Exception as e:\n", + " print(\"对比运行出错:\", e)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "7f33ec822fbc4d07af9be3d457af3cec", + "c3663fe04105476fae614fd17b98caa8", + "b618e40973224e218b4caa01f1d07224", + "f8a12ceb21da4c19893bc2c795edf115", + "9203599d4de840719c301d5f77ccb1cf", + "2400cf85591f468482e05dc382b5cbe1", + "160db9542e184f14bd9d1ffb7e7695df", + "bbc1d8ac1e3a4348981afa663f912810", + "4013a6c5ccad4fe4b64110359e1aa0dd", + "4c67098f55fa4786b86ffc6a9779f914", + "bf903af558494b1ab6a0e07e661423ea" + ] + }, + "id": "BEWOPhnxMTru", + "outputId": "b887bd55-64c4-4706-b1b1-b1979e824367" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Epoch 1/1: 0%| | 0/625 [00:00