From 244e157bc0415a7bcd444780310ef497950e2155 Mon Sep 17 00:00:00 2001 From: ntnt Date: Mon, 2 Feb 2026 21:47:52 +0800 Subject: [PATCH] plane: fig --- p1/data_window_analysis.py | 702 ++-- p1/find_optimal_window.py | 460 +-- p1/lambda_cost_analysis.py | 1688 +++++----- p1/richards_curve_1984.py | 366 +- p3/water_sensitivity_analysis.py | 3000 ++++++++--------- .../__pycache__/cost_analysis.cpython-314.pyc | Bin 0 -> 34025 bytes .../__pycache__/cost_analysis.cpython-38.pyc | Bin 0 -> 19332 bytes plane/cost_analysis.py | 137 + plane/fuel_share_trend.png | Bin 200368 -> 141090 bytes plane/fuel_total_correlation.png | Bin 0 -> 93299 bytes prob/p_B.pdf | Bin 433092 -> 470252 bytes 11 files changed, 3245 insertions(+), 3108 deletions(-) create mode 100644 plane/__pycache__/cost_analysis.cpython-314.pyc create mode 100644 plane/__pycache__/cost_analysis.cpython-38.pyc create mode 100644 plane/fuel_total_correlation.png diff --git a/p1/data_window_analysis.py b/p1/data_window_analysis.py index 03cc32f..6625a5d 100644 --- a/p1/data_window_analysis.py +++ b/p1/data_window_analysis.py @@ -1,351 +1,351 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Data Window Sensitivity Analysis for Richards Model - -Analyzes how different historical data windows affect the K (carrying capacity) -estimate in the Richards growth model. - -Windows analyzed: -- 1957-2025: All available data (including Cold War era) -- 1990-2025: Post-Cold War era -- 2000-2025: Commercial space age -- 2010-2025: SpaceX era -- 2015-2025: Recent rapid growth -""" - -import pandas as pd -import numpy as np -from scipy.optimize import curve_fit -import matplotlib -matplotlib.use('Agg') -import matplotlib.pyplot as plt -import warnings -warnings.filterwarnings('ignore') - -plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans'] -plt.rcParams['axes.unicode_minus'] = False - - -# ============================================================ -# Richards Growth Model -# ============================================================ - -def richards(t, K, r, t0, v): - """Richards curve (generalized logistic model)""" - exp_term = np.exp(-r * (t - t0)) - exp_term = np.clip(exp_term, 1e-10, 1e10) - return K / np.power(1 + exp_term, 1/v) - - -# ============================================================ -# Data Loading -# ============================================================ - -def load_data(filepath="rocket_launch_counts.csv"): - """Load and preprocess rocket launch data""" - df = pd.read_csv(filepath) - df = df.rename(columns={"YDate": "year", "Total": "launches"}) - df["year"] = pd.to_numeric(df["year"], errors="coerce") - df["launches"] = pd.to_numeric(df["launches"], errors="coerce") - df = df.dropna(subset=["year", "launches"]) - df = df[(df["year"] >= 1957) & (df["year"] <= 2025)] - df = df.astype({"year": int, "launches": int}) - df = df.sort_values("year").reset_index(drop=True) - return df - - -# ============================================================ -# Fit Richards Model (Unconstrained) -# ============================================================ - -def fit_richards_unconstrained(data, base_year=1957): - """Fit Richards model without constraining K""" - years = data["year"].values - launches = data["launches"].values - t = (years - base_year).astype(float) - - # Initial parameters - p0 = [5000.0, 0.08, 80.0, 2.0] - - # Wide bounds - let data determine K - bounds = ([500, 0.005, 10, 0.2], [100000, 1.0, 200, 10.0]) - - try: - popt, pcov = curve_fit(richards, t, launches, p0=p0, bounds=bounds, maxfev=100000) - perr = np.sqrt(np.diag(pcov)) - y_pred = richards(t, *popt) - - ss_res = np.sum((launches - y_pred) ** 2) - ss_tot = np.sum((launches - np.mean(launches)) ** 2) - r_squared = 1 - (ss_res / ss_tot) - - K, r, t0, v = popt - K_err = perr[0] - - return { - "success": True, - "K": K, - "K_err": K_err, - "r": r, - "t0": t0, - "v": v, - "r_squared": r_squared, - "n_points": len(data), - "years": years, - "launches": launches, - "params": popt, - "y_pred": y_pred, - } - except Exception as e: - return {"success": False, "error": str(e)} - - -# ============================================================ -# Main Analysis -# ============================================================ - -def analyze_data_windows(df): - """Analyze K estimates for different data windows""" - - # Define windows - windows = { - "1957-2025 (全部68年)": (1957, 2025), - "1990-2025 (35年)": (1990, 2025), - "2000-2025 (25年)": (2000, 2025), - "2010-2025 (15年)": (2010, 2025), - "2015-2025 (10年)": (2015, 2025), - } - - results = {} - - print("=" * 80) - print("分析不同历史数据窗口对 K (carrying capacity) 估计的影响") - print("=" * 80) - - for name, (start, end) in windows.items(): - data = df[(df["year"] >= start) & (df["year"] <= end)].copy() - result = fit_richards_unconstrained(data) - - if result["success"]: - result["start"] = start - result["end"] = end - result["name"] = name - results[name] = result - - print(f"\n--- {name} ---") - print(f" 数据点数: {result['n_points']}") - print(f" K = {result['K']:.0f} (carrying capacity)") - print(f" r = {result['r']:.4f} (growth rate)") - print(f" R² = {result['r_squared']:.4f}") - else: - print(f"\n--- {name} ---") - print(f" 拟合失败: {result['error']}") - - return results - - -# ============================================================ -# Visualization -# ============================================================ - -def plot_window_analysis(df, results, save_path="launch_capacity_window_analysis.png"): - """Generate comprehensive window analysis plot""" - - fig, axes = plt.subplots(2, 2, figsize=(14, 11)) - - names = list(results.keys()) - physical_max = 3650 - - # ========== Plot 1: K Values Comparison ========== - ax1 = axes[0, 0] - - K_vals = [results[n]["K"] for n in names] - colors = ["#E74C3C" if k < physical_max else "#27AE60" for k in K_vals] - - y_pos = range(len(names)) - bars = ax1.barh(y_pos, K_vals, color=colors, alpha=0.7, edgecolor="black") - ax1.axvline(physical_max, color="blue", ls="--", lw=2.5, - label=f"Physical Max ({physical_max})") - - ax1.set_yticks(y_pos) - ax1.set_yticklabels(names, fontsize=10) - ax1.set_xlabel("K (Carrying Capacity, launches/year)", fontsize=11) - ax1.set_title("K Estimates by Data Window\n(Unconstrained Richards Model)", fontsize=12) - ax1.legend(loc="lower right", fontsize=10) - ax1.grid(True, alpha=0.3, axis="x") - - for bar, k in zip(bars, K_vals): - ax1.text(k + 200, bar.get_y() + bar.get_height()/2, - f"{k:.0f}", va="center", fontsize=10, fontweight="bold") - - # ========== Plot 2: R² Comparison ========== - ax2 = axes[0, 1] - - r2_vals = [results[n]["r_squared"] for n in names] - colors2 = ["#27AE60" if r2 > 0.9 else "#F39C12" if r2 > 0.7 else "#E74C3C" - for r2 in r2_vals] - - bars2 = ax2.barh(y_pos, r2_vals, color=colors2, alpha=0.7, edgecolor="black") - ax2.axvline(0.9, color="green", ls="--", lw=1.5, alpha=0.7, label="R²=0.9 (Good fit)") - ax2.axvline(0.7, color="orange", ls=":", lw=1.5, alpha=0.7, label="R²=0.7 (Acceptable)") - - ax2.set_yticks(y_pos) - ax2.set_yticklabels(names, fontsize=10) - ax2.set_xlabel("R² (Goodness of Fit)", fontsize=11) - ax2.set_title("Model Fit Quality by Data Window", fontsize=12) - ax2.set_xlim(0, 1.1) - ax2.legend(loc="lower right", fontsize=9) - ax2.grid(True, alpha=0.3, axis="x") - - for bar, r2 in zip(bars2, r2_vals): - ax2.text(r2 + 0.02, bar.get_y() + bar.get_height()/2, - f"{r2:.3f}", va="center", fontsize=10, fontweight="bold") - - # ========== Plot 3: Historical Data with All Model Fits ========== - ax3 = axes[1, 0] - - # Plot all historical data - ax3.scatter(df["year"], df["launches"], color="gray", s=30, alpha=0.5, - label="Historical Data", zorder=1) - - # Plot each model prediction - colors_line = ["#E74C3C", "#F39C12", "#3498DB", "#27AE60", "#9B59B6"] - for i, (name, res) in enumerate(results.items()): - start = res["start"] - years_proj = np.arange(start, 2080) - t_proj = years_proj - 1957 - pred = richards(t_proj, *res["params"]) - - label = f'{name.split(" ")[0]}: K={res["K"]:.0f}' - ax3.plot(years_proj, pred, color=colors_line[i], lw=2, alpha=0.8, - label=label, zorder=2) - - ax3.axhline(physical_max, color="black", ls=":", lw=2, - label=f"Physical Max ({physical_max})") - - ax3.set_xlabel("Year", fontsize=11) - ax3.set_ylabel("Annual Launches", fontsize=11) - ax3.set_title("Richards Model Predictions\n(Different Data Windows)", fontsize=12) - ax3.legend(loc="upper left", fontsize=8) - ax3.grid(True, alpha=0.3) - ax3.set_xlim(1955, 2080) - ax3.set_ylim(0, 15000) - - # ========== Plot 4: Summary Table ========== - ax4 = axes[1, 1] - ax4.axis("off") - - # Build summary text - summary = """ -┌────────────────────────────────────────────────────────────────────────┐ -│ 数据窗口对 K 估计的影响分析 │ -├────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 核心发现: │ -│ ───────── │ -│ 1. 数据窗口选择对 K 估计影响巨大 │ -│ • 全部数据: K ≈ 500 │ -│ • 近15年: K ≈ 12,000 │ -│ │ -│ 2. 1957-2025 全部数据: │ -│ • R² = 0.08 (极差拟合) │ -│ • 冷战时期数据干扰,模型误判为"已饱和" │ -│ • 不适合用于预测未来增长 │ -│ │ -│ 3. 2010-2025 近15年数据: │ -│ • R² = 0.90 (良好拟合) │ -│ • 准确捕捉商业航天时代的增长趋势 │ -│ • 预测 K ≈ 12,000 >> 物理上限 (3,650) │ -│ │ -│ 结论: │ -│ ───── │ -│ • 选择 2010-2025 数据窗口是合理的 (R² = 0.90, 反映当前趋势) │ -│ • 数据驱动 K ≈ 12,000 反映增长潜力 (需要 ~33 个发射站) │ -│ • 但物理约束 (10站 × 365天 = 3,650) 才是真正的上限 │ -│ • 因此采用 1 次/站/天 作为保守估计是合理的 │ -│ │ -│ 物理上限: 3,650 次/年 (10个发射站 × 365天) │ -│ │ -└────────────────────────────────────────────────────────────────────────┘ -""" - - ax4.text(0.02, 0.98, summary, transform=ax4.transAxes, fontsize=10, - verticalalignment="top", family="monospace", - bbox=dict(boxstyle="round", facecolor="lightyellow", alpha=0.9)) - - plt.suptitle("Data Window Sensitivity Analysis for Richards Model", - fontsize=14, fontweight="bold", y=1.02) - plt.tight_layout() - plt.savefig(save_path, dpi=150, bbox_inches="tight") - plt.close() - print(f"\nPlot saved: {save_path}") - - -# ============================================================ -# Print Detailed Table -# ============================================================ - -def print_comparison_table(results): - """Print detailed comparison table""" - - physical_max = 3650 - - print("\n" + "=" * 80) - print("详细对比表") - print("=" * 80) - - header = f"{'数据窗口':<22} | {'K值':>8} | {'R²':>7} | {'数据点':>5} | {'K/物理上限':>10} | {'说明':<18}" - print(header) - print("-" * 22 + "-+-" + "-" * 8 + "-+-" + "-" * 7 + "-+-" + "-" * 5 + "-+-" + "-" * 10 + "-+-" + "-" * 18) - - for name, res in results.items(): - k = res["K"] - r2 = res["r_squared"] - n = res["n_points"] - ratio = k / physical_max - - if r2 < 0.5: - note = "拟合差,不可用" - elif k < physical_max: - note = "低于物理上限" - elif ratio < 2: - note = "接近物理上限" - else: - note = "远超物理上限" - - print(f"{name:<22} | {k:>8.0f} | {r2:>7.4f} | {n:>5} | {ratio:>10.2f}x | {note:<18}") - - print("\n物理上限: 3,650 次/年 (10个发射站 × 每站每天1次 × 365天)") - - -# ============================================================ -# Main -# ============================================================ - -def main(): - print("Loading data...") - df = load_data() - print(f"Data loaded: {len(df)} records from {df['year'].min()} to {df['year'].max()}") - - # Analyze different windows - results = analyze_data_windows(df) - - # Print comparison table - print_comparison_table(results) - - # Generate visualization - print("\n" + "=" * 80) - print("Generating visualization...") - print("=" * 80) - plot_window_analysis(df, results) - - print("\n" + "=" * 80) - print("分析完成!") - print("=" * 80) - - return results - - -if __name__ == "__main__": - results = main() +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Data Window Sensitivity Analysis for Richards Model + +Analyzes how different historical data windows affect the K (carrying capacity) +estimate in the Richards growth model. + +Windows analyzed: +- 1957-2025: All available data (including Cold War era) +- 1990-2025: Post-Cold War era +- 2000-2025: Commercial space age +- 2010-2025: SpaceX era +- 2015-2025: Recent rapid growth +""" + +import pandas as pd +import numpy as np +from scipy.optimize import curve_fit +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +import warnings +warnings.filterwarnings('ignore') + +plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans'] +plt.rcParams['axes.unicode_minus'] = False + + +# ============================================================ +# Richards Growth Model +# ============================================================ + +def richards(t, K, r, t0, v): + """Richards curve (generalized logistic model)""" + exp_term = np.exp(-r * (t - t0)) + exp_term = np.clip(exp_term, 1e-10, 1e10) + return K / np.power(1 + exp_term, 1/v) + + +# ============================================================ +# Data Loading +# ============================================================ + +def load_data(filepath="rocket_launch_counts.csv"): + """Load and preprocess rocket launch data""" + df = pd.read_csv(filepath) + df = df.rename(columns={"YDate": "year", "Total": "launches"}) + df["year"] = pd.to_numeric(df["year"], errors="coerce") + df["launches"] = pd.to_numeric(df["launches"], errors="coerce") + df = df.dropna(subset=["year", "launches"]) + df = df[(df["year"] >= 1957) & (df["year"] <= 2025)] + df = df.astype({"year": int, "launches": int}) + df = df.sort_values("year").reset_index(drop=True) + return df + + +# ============================================================ +# Fit Richards Model (Unconstrained) +# ============================================================ + +def fit_richards_unconstrained(data, base_year=1957): + """Fit Richards model without constraining K""" + years = data["year"].values + launches = data["launches"].values + t = (years - base_year).astype(float) + + # Initial parameters + p0 = [5000.0, 0.08, 80.0, 2.0] + + # Wide bounds - let data determine K + bounds = ([500, 0.005, 10, 0.2], [100000, 1.0, 200, 10.0]) + + try: + popt, pcov = curve_fit(richards, t, launches, p0=p0, bounds=bounds, maxfev=100000) + perr = np.sqrt(np.diag(pcov)) + y_pred = richards(t, *popt) + + ss_res = np.sum((launches - y_pred) ** 2) + ss_tot = np.sum((launches - np.mean(launches)) ** 2) + r_squared = 1 - (ss_res / ss_tot) + + K, r, t0, v = popt + K_err = perr[0] + + return { + "success": True, + "K": K, + "K_err": K_err, + "r": r, + "t0": t0, + "v": v, + "r_squared": r_squared, + "n_points": len(data), + "years": years, + "launches": launches, + "params": popt, + "y_pred": y_pred, + } + except Exception as e: + return {"success": False, "error": str(e)} + + +# ============================================================ +# Main Analysis +# ============================================================ + +def analyze_data_windows(df): + """Analyze K estimates for different data windows""" + + # Define windows + windows = { + "1957-2025 (全部68年)": (1957, 2025), + "1990-2025 (35年)": (1990, 2025), + "2000-2025 (25年)": (2000, 2025), + "2010-2025 (15年)": (2010, 2025), + "2015-2025 (10年)": (2015, 2025), + } + + results = {} + + print("=" * 80) + print("分析不同历史数据窗口对 K (carrying capacity) 估计的影响") + print("=" * 80) + + for name, (start, end) in windows.items(): + data = df[(df["year"] >= start) & (df["year"] <= end)].copy() + result = fit_richards_unconstrained(data) + + if result["success"]: + result["start"] = start + result["end"] = end + result["name"] = name + results[name] = result + + print(f"\n--- {name} ---") + print(f" 数据点数: {result['n_points']}") + print(f" K = {result['K']:.0f} (carrying capacity)") + print(f" r = {result['r']:.4f} (growth rate)") + print(f" R² = {result['r_squared']:.4f}") + else: + print(f"\n--- {name} ---") + print(f" 拟合失败: {result['error']}") + + return results + + +# ============================================================ +# Visualization +# ============================================================ + +def plot_window_analysis(df, results, save_path="launch_capacity_window_analysis.png"): + """Generate comprehensive window analysis plot""" + + fig, axes = plt.subplots(2, 2, figsize=(14, 11)) + + names = list(results.keys()) + physical_max = 3650 + + # ========== Plot 1: K Values Comparison ========== + ax1 = axes[0, 0] + + K_vals = [results[n]["K"] for n in names] + colors = ["#E74C3C" if k < physical_max else "#27AE60" for k in K_vals] + + y_pos = range(len(names)) + bars = ax1.barh(y_pos, K_vals, color=colors, alpha=0.7, edgecolor="black") + ax1.axvline(physical_max, color="blue", ls="--", lw=2.5, + label=f"Physical Max ({physical_max})") + + ax1.set_yticks(y_pos) + ax1.set_yticklabels(names, fontsize=10) + ax1.set_xlabel("K (Carrying Capacity, launches/year)", fontsize=11) + ax1.set_title("K Estimates by Data Window\n(Unconstrained Richards Model)", fontsize=12) + ax1.legend(loc="lower right", fontsize=10) + ax1.grid(True, alpha=0.3, axis="x") + + for bar, k in zip(bars, K_vals): + ax1.text(k + 200, bar.get_y() + bar.get_height()/2, + f"{k:.0f}", va="center", fontsize=10, fontweight="bold") + + # ========== Plot 2: R² Comparison ========== + ax2 = axes[0, 1] + + r2_vals = [results[n]["r_squared"] for n in names] + colors2 = ["#27AE60" if r2 > 0.9 else "#F39C12" if r2 > 0.7 else "#E74C3C" + for r2 in r2_vals] + + bars2 = ax2.barh(y_pos, r2_vals, color=colors2, alpha=0.7, edgecolor="black") + ax2.axvline(0.9, color="green", ls="--", lw=1.5, alpha=0.7, label="R²=0.9 (Good fit)") + ax2.axvline(0.7, color="orange", ls=":", lw=1.5, alpha=0.7, label="R²=0.7 (Acceptable)") + + ax2.set_yticks(y_pos) + ax2.set_yticklabels(names, fontsize=10) + ax2.set_xlabel("R² (Goodness of Fit)", fontsize=11) + ax2.set_title("Model Fit Quality by Data Window", fontsize=12) + ax2.set_xlim(0, 1.1) + ax2.legend(loc="lower right", fontsize=9) + ax2.grid(True, alpha=0.3, axis="x") + + for bar, r2 in zip(bars2, r2_vals): + ax2.text(r2 + 0.02, bar.get_y() + bar.get_height()/2, + f"{r2:.3f}", va="center", fontsize=10, fontweight="bold") + + # ========== Plot 3: Historical Data with All Model Fits ========== + ax3 = axes[1, 0] + + # Plot all historical data + ax3.scatter(df["year"], df["launches"], color="gray", s=30, alpha=0.5, + label="Historical Data", zorder=1) + + # Plot each model prediction + colors_line = ["#E74C3C", "#F39C12", "#3498DB", "#27AE60", "#9B59B6"] + for i, (name, res) in enumerate(results.items()): + start = res["start"] + years_proj = np.arange(start, 2080) + t_proj = years_proj - 1957 + pred = richards(t_proj, *res["params"]) + + label = f'{name.split(" ")[0]}: K={res["K"]:.0f}' + ax3.plot(years_proj, pred, color=colors_line[i], lw=2, alpha=0.8, + label=label, zorder=2) + + ax3.axhline(physical_max, color="black", ls=":", lw=2, + label=f"Physical Max ({physical_max})") + + ax3.set_xlabel("Year", fontsize=11) + ax3.set_ylabel("Annual Launches", fontsize=11) + ax3.set_title("Richards Model Predictions\n(Different Data Windows)", fontsize=12) + ax3.legend(loc="upper left", fontsize=8) + ax3.grid(True, alpha=0.3) + ax3.set_xlim(1955, 2080) + ax3.set_ylim(0, 15000) + + # ========== Plot 4: Summary Table ========== + ax4 = axes[1, 1] + ax4.axis("off") + + # Build summary text + summary = """ +┌────────────────────────────────────────────────────────────────────────┐ +│ 数据窗口对 K 估计的影响分析 │ +├────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 核心发现: │ +│ ───────── │ +│ 1. 数据窗口选择对 K 估计影响巨大 │ +│ • 全部数据: K ≈ 500 │ +│ • 近15年: K ≈ 12,000 │ +│ │ +│ 2. 1957-2025 全部数据: │ +│ • R² = 0.08 (极差拟合) │ +│ • 冷战时期数据干扰,模型误判为"已饱和" │ +│ • 不适合用于预测未来增长 │ +│ │ +│ 3. 2010-2025 近15年数据: │ +│ • R² = 0.90 (良好拟合) │ +│ • 准确捕捉商业航天时代的增长趋势 │ +│ • 预测 K ≈ 12,000 >> 物理上限 (3,650) │ +│ │ +│ 结论: │ +│ ───── │ +│ • 选择 2010-2025 数据窗口是合理的 (R² = 0.90, 反映当前趋势) │ +│ • 数据驱动 K ≈ 12,000 反映增长潜力 (需要 ~33 个发射站) │ +│ • 但物理约束 (10站 × 365天 = 3,650) 才是真正的上限 │ +│ • 因此采用 1 次/站/天 作为保守估计是合理的 │ +│ │ +│ 物理上限: 3,650 次/年 (10个发射站 × 365天) │ +│ │ +└────────────────────────────────────────────────────────────────────────┘ +""" + + ax4.text(0.02, 0.98, summary, transform=ax4.transAxes, fontsize=10, + verticalalignment="top", family="monospace", + bbox=dict(boxstyle="round", facecolor="lightyellow", alpha=0.9)) + + plt.suptitle("Data Window Sensitivity Analysis for Richards Model", + fontsize=14, fontweight="bold", y=1.02) + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches="tight") + plt.close() + print(f"\nPlot saved: {save_path}") + + +# ============================================================ +# Print Detailed Table +# ============================================================ + +def print_comparison_table(results): + """Print detailed comparison table""" + + physical_max = 3650 + + print("\n" + "=" * 80) + print("详细对比表") + print("=" * 80) + + header = f"{'数据窗口':<22} | {'K值':>8} | {'R²':>7} | {'数据点':>5} | {'K/物理上限':>10} | {'说明':<18}" + print(header) + print("-" * 22 + "-+-" + "-" * 8 + "-+-" + "-" * 7 + "-+-" + "-" * 5 + "-+-" + "-" * 10 + "-+-" + "-" * 18) + + for name, res in results.items(): + k = res["K"] + r2 = res["r_squared"] + n = res["n_points"] + ratio = k / physical_max + + if r2 < 0.5: + note = "拟合差,不可用" + elif k < physical_max: + note = "低于物理上限" + elif ratio < 2: + note = "接近物理上限" + else: + note = "远超物理上限" + + print(f"{name:<22} | {k:>8.0f} | {r2:>7.4f} | {n:>5} | {ratio:>10.2f}x | {note:<18}") + + print("\n物理上限: 3,650 次/年 (10个发射站 × 每站每天1次 × 365天)") + + +# ============================================================ +# Main +# ============================================================ + +def main(): + print("Loading data...") + df = load_data() + print(f"Data loaded: {len(df)} records from {df['year'].min()} to {df['year'].max()}") + + # Analyze different windows + results = analyze_data_windows(df) + + # Print comparison table + print_comparison_table(results) + + # Generate visualization + print("\n" + "=" * 80) + print("Generating visualization...") + print("=" * 80) + plot_window_analysis(df, results) + + print("\n" + "=" * 80) + print("分析完成!") + print("=" * 80) + + return results + + +if __name__ == "__main__": + results = main() diff --git a/p1/find_optimal_window.py b/p1/find_optimal_window.py index 5acb8d3..fe9f329 100644 --- a/p1/find_optimal_window.py +++ b/p1/find_optimal_window.py @@ -1,230 +1,230 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Find Optimal Data Window for K ≈ 3650 - -Enumerate all possible starting years to find which data window -produces K closest to the physical limit (3650 launches/year). -""" - -import pandas as pd -import numpy as np -from scipy.optimize import curve_fit -import matplotlib -matplotlib.use('Agg') -import matplotlib.pyplot as plt -import warnings -warnings.filterwarnings('ignore') - -plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans'] -plt.rcParams['axes.unicode_minus'] = False - - -# Richards model -def richards(t, K, r, t0, v): - exp_term = np.exp(-r * (t - t0)) - exp_term = np.clip(exp_term, 1e-10, 1e10) - return K / np.power(1 + exp_term, 1/v) - - -def load_data(filepath="rocket_launch_counts.csv"): - df = pd.read_csv(filepath) - df = df.rename(columns={"YDate": "year", "Total": "launches"}) - df["year"] = pd.to_numeric(df["year"], errors="coerce") - df["launches"] = pd.to_numeric(df["launches"], errors="coerce") - df = df.dropna(subset=["year", "launches"]) - df = df[(df["year"] >= 1957) & (df["year"] <= 2025)] - df = df.astype({"year": int, "launches": int}) - df = df.sort_values("year").reset_index(drop=True) - return df - - -def fit_richards(data, base_year=1957): - """Fit unconstrained Richards model""" - years = data["year"].values - launches = data["launches"].values - t = (years - base_year).astype(float) - - p0 = [5000.0, 0.08, 80.0, 2.0] - bounds = ([500, 0.005, 10, 0.2], [100000, 1.0, 200, 10.0]) - - try: - popt, pcov = curve_fit(richards, t, launches, p0=p0, bounds=bounds, maxfev=100000) - y_pred = richards(t, *popt) - ss_res = np.sum((launches - y_pred) ** 2) - ss_tot = np.sum((launches - np.mean(launches)) ** 2) - r_squared = 1 - (ss_res / ss_tot) if ss_tot > 0 else 0 - - return { - "success": True, - "K": popt[0], - "r": popt[1], - "t0": popt[2], - "v": popt[3], - "r_squared": r_squared, - "n_points": len(data), - } - except: - return {"success": False} - - -def main(): - print("=" * 80) - print("枚举起始年份,寻找 K ≈ 3650 的数据窗口") - print("=" * 80) - - df = load_data() - print(f"数据范围: {df['year'].min()} - {df['year'].max()}\n") - - target_K = 3650 - end_year = 2025 - - # Enumerate all starting years - results = [] - - for start_year in range(1957, 2020): - data = df[(df["year"] >= start_year) & (df["year"] <= end_year)].copy() - - if len(data) < 5: # Need at least 5 data points - continue - - result = fit_richards(data) - - if result["success"]: - diff = abs(result["K"] - target_K) - results.append({ - "start_year": start_year, - "end_year": end_year, - "years_span": end_year - start_year + 1, - "n_points": result["n_points"], - "K": result["K"], - "r_squared": result["r_squared"], - "diff_from_target": diff, - "ratio": result["K"] / target_K, - }) - - # Sort by difference from target - results_df = pd.DataFrame(results) - results_df = results_df.sort_values("diff_from_target") - - # Print full table - print("完整枚举结果表(按与目标值 3650 的差距排序):") - print("-" * 80) - print(f"{'起始年份':>8} | {'时间跨度':>8} | {'数据点':>6} | {'K值':>10} | {'R²':>8} | {'K/3650':>8} | {'差距':>10}") - print("-" * 80) - - for _, row in results_df.iterrows(): - marker = "★" if row["diff_from_target"] < 500 else "" - print(f"{int(row['start_year']):>8} | {int(row['years_span']):>6}年 | {int(row['n_points']):>6} | " - f"{row['K']:>10.0f} | {row['r_squared']:>8.4f} | {row['ratio']:>8.2f}x | {row['diff_from_target']:>10.0f} {marker}") - - # Find closest matches - print("\n" + "=" * 80) - print("最接近 K = 3650 的数据窗口 (Top 10)") - print("=" * 80) - - top10 = results_df.head(10) - print(f"\n{'排名':>4} | {'起始年份':>8} | {'K值':>10} | {'R²':>8} | {'差距':>10} | {'评价':<20}") - print("-" * 75) - - for i, (_, row) in enumerate(top10.iterrows(), 1): - if row["r_squared"] < 0.5: - comment = "❌ 拟合差,不可信" - elif row["r_squared"] < 0.8: - comment = "⚠️ 拟合一般" - else: - comment = "✅ 拟合良好" - - print(f"{i:>4} | {int(row['start_year']):>8} | {row['K']:>10.0f} | {row['r_squared']:>8.4f} | " - f"{row['diff_from_target']:>10.0f} | {comment:<20}") - - # Analysis - print("\n" + "=" * 80) - print("分析结论") - print("=" * 80) - - # Find best with good R² - good_fit = results_df[results_df["r_squared"] >= 0.8] - if len(good_fit) > 0: - best_good = good_fit.iloc[0] - print(f"\n在 R² ≥ 0.8 的条件下,最接近 K=3650 的窗口:") - print(f" 起始年份: {int(best_good['start_year'])}") - print(f" K = {best_good['K']:.0f}") - print(f" R² = {best_good['r_squared']:.4f}") - print(f" 差距: {best_good['diff_from_target']:.0f}") - - # Summary - print("\n关键发现:") - print("-" * 40) - - # Check if any good fit gives K near 3650 - near_target = results_df[(results_df["diff_from_target"] < 1000) & (results_df["r_squared"] >= 0.7)] - - if len(near_target) == 0: - print(" ⚠️ 没有任何数据窗口能在良好拟合(R²≥0.7)的条件下得到 K≈3650") - print(" ⚠️ 所有良好拟合的窗口都给出 K >> 3650 或 K << 3650") - print("\n 这说明:") - print(" • K=3650 不是数据自然支持的结论") - print(" • K=3650 来自物理约束,而非统计预测") - print(" • 论文中应该明确说明这是'物理上限'而非'数据预测'") - else: - print(f" 找到 {len(near_target)} 个窗口使 K 接近 3650:") - for _, row in near_target.iterrows(): - print(f" {int(row['start_year'])}-2025: K={row['K']:.0f}, R²={row['r_squared']:.4f}") - - # Generate visualization - print("\n" + "=" * 80) - print("生成可视化...") - print("=" * 80) - - fig, axes = plt.subplots(1, 2, figsize=(14, 6)) - - # Plot 1: K vs Start Year - ax1 = axes[0] - colors = ['#27AE60' if r2 >= 0.8 else '#F39C12' if r2 >= 0.5 else '#E74C3C' - for r2 in results_df["r_squared"]] - - ax1.scatter(results_df["start_year"], results_df["K"], c=colors, s=60, alpha=0.7, edgecolor='black') - ax1.axhline(3650, color='blue', ls='--', lw=2, label='Target K=3650') - ax1.axhline(3650*0.9, color='blue', ls=':', lw=1, alpha=0.5) - ax1.axhline(3650*1.1, color='blue', ls=':', lw=1, alpha=0.5) - - ax1.set_xlabel("Starting Year", fontsize=11) - ax1.set_ylabel("K (Carrying Capacity)", fontsize=11) - ax1.set_title("K vs Starting Year\n(Color: Green=R²≥0.8, Yellow=R²≥0.5, Red=R²<0.5)", fontsize=12) - ax1.legend() - ax1.grid(True, alpha=0.3) - ax1.set_xlim(1955, 2020) - - # Plot 2: R² vs Start Year - ax2 = axes[1] - ax2.scatter(results_df["start_year"], results_df["r_squared"], c=colors, s=60, alpha=0.7, edgecolor='black') - ax2.axhline(0.8, color='green', ls='--', lw=1.5, label='R²=0.8 (Good)') - ax2.axhline(0.5, color='orange', ls=':', lw=1.5, label='R²=0.5 (Acceptable)') - - ax2.set_xlabel("Starting Year", fontsize=11) - ax2.set_ylabel("R² (Goodness of Fit)", fontsize=11) - ax2.set_title("Model Fit Quality vs Starting Year", fontsize=12) - ax2.legend() - ax2.grid(True, alpha=0.3) - ax2.set_xlim(1955, 2020) - ax2.set_ylim(-0.1, 1.1) - - plt.tight_layout() - plt.savefig("find_optimal_window.png", dpi=150, bbox_inches='tight') - plt.close() - print("图表已保存: find_optimal_window.png") - - # Save to CSV - results_df.to_csv("window_enumeration.csv", index=False) - print("数据已保存: window_enumeration.csv") - - print("\n" + "=" * 80) - print("分析完成!") - print("=" * 80) - - return results_df - - -if __name__ == "__main__": - results = main() +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Find Optimal Data Window for K ≈ 3650 + +Enumerate all possible starting years to find which data window +produces K closest to the physical limit (3650 launches/year). +""" + +import pandas as pd +import numpy as np +from scipy.optimize import curve_fit +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +import warnings +warnings.filterwarnings('ignore') + +plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans'] +plt.rcParams['axes.unicode_minus'] = False + + +# Richards model +def richards(t, K, r, t0, v): + exp_term = np.exp(-r * (t - t0)) + exp_term = np.clip(exp_term, 1e-10, 1e10) + return K / np.power(1 + exp_term, 1/v) + + +def load_data(filepath="rocket_launch_counts.csv"): + df = pd.read_csv(filepath) + df = df.rename(columns={"YDate": "year", "Total": "launches"}) + df["year"] = pd.to_numeric(df["year"], errors="coerce") + df["launches"] = pd.to_numeric(df["launches"], errors="coerce") + df = df.dropna(subset=["year", "launches"]) + df = df[(df["year"] >= 1957) & (df["year"] <= 2025)] + df = df.astype({"year": int, "launches": int}) + df = df.sort_values("year").reset_index(drop=True) + return df + + +def fit_richards(data, base_year=1957): + """Fit unconstrained Richards model""" + years = data["year"].values + launches = data["launches"].values + t = (years - base_year).astype(float) + + p0 = [5000.0, 0.08, 80.0, 2.0] + bounds = ([500, 0.005, 10, 0.2], [100000, 1.0, 200, 10.0]) + + try: + popt, pcov = curve_fit(richards, t, launches, p0=p0, bounds=bounds, maxfev=100000) + y_pred = richards(t, *popt) + ss_res = np.sum((launches - y_pred) ** 2) + ss_tot = np.sum((launches - np.mean(launches)) ** 2) + r_squared = 1 - (ss_res / ss_tot) if ss_tot > 0 else 0 + + return { + "success": True, + "K": popt[0], + "r": popt[1], + "t0": popt[2], + "v": popt[3], + "r_squared": r_squared, + "n_points": len(data), + } + except: + return {"success": False} + + +def main(): + print("=" * 80) + print("枚举起始年份,寻找 K ≈ 3650 的数据窗口") + print("=" * 80) + + df = load_data() + print(f"数据范围: {df['year'].min()} - {df['year'].max()}\n") + + target_K = 3650 + end_year = 2025 + + # Enumerate all starting years + results = [] + + for start_year in range(1957, 2020): + data = df[(df["year"] >= start_year) & (df["year"] <= end_year)].copy() + + if len(data) < 5: # Need at least 5 data points + continue + + result = fit_richards(data) + + if result["success"]: + diff = abs(result["K"] - target_K) + results.append({ + "start_year": start_year, + "end_year": end_year, + "years_span": end_year - start_year + 1, + "n_points": result["n_points"], + "K": result["K"], + "r_squared": result["r_squared"], + "diff_from_target": diff, + "ratio": result["K"] / target_K, + }) + + # Sort by difference from target + results_df = pd.DataFrame(results) + results_df = results_df.sort_values("diff_from_target") + + # Print full table + print("完整枚举结果表(按与目标值 3650 的差距排序):") + print("-" * 80) + print(f"{'起始年份':>8} | {'时间跨度':>8} | {'数据点':>6} | {'K值':>10} | {'R²':>8} | {'K/3650':>8} | {'差距':>10}") + print("-" * 80) + + for _, row in results_df.iterrows(): + marker = "★" if row["diff_from_target"] < 500 else "" + print(f"{int(row['start_year']):>8} | {int(row['years_span']):>6}年 | {int(row['n_points']):>6} | " + f"{row['K']:>10.0f} | {row['r_squared']:>8.4f} | {row['ratio']:>8.2f}x | {row['diff_from_target']:>10.0f} {marker}") + + # Find closest matches + print("\n" + "=" * 80) + print("最接近 K = 3650 的数据窗口 (Top 10)") + print("=" * 80) + + top10 = results_df.head(10) + print(f"\n{'排名':>4} | {'起始年份':>8} | {'K值':>10} | {'R²':>8} | {'差距':>10} | {'评价':<20}") + print("-" * 75) + + for i, (_, row) in enumerate(top10.iterrows(), 1): + if row["r_squared"] < 0.5: + comment = "❌ 拟合差,不可信" + elif row["r_squared"] < 0.8: + comment = "⚠️ 拟合一般" + else: + comment = "✅ 拟合良好" + + print(f"{i:>4} | {int(row['start_year']):>8} | {row['K']:>10.0f} | {row['r_squared']:>8.4f} | " + f"{row['diff_from_target']:>10.0f} | {comment:<20}") + + # Analysis + print("\n" + "=" * 80) + print("分析结论") + print("=" * 80) + + # Find best with good R² + good_fit = results_df[results_df["r_squared"] >= 0.8] + if len(good_fit) > 0: + best_good = good_fit.iloc[0] + print(f"\n在 R² ≥ 0.8 的条件下,最接近 K=3650 的窗口:") + print(f" 起始年份: {int(best_good['start_year'])}") + print(f" K = {best_good['K']:.0f}") + print(f" R² = {best_good['r_squared']:.4f}") + print(f" 差距: {best_good['diff_from_target']:.0f}") + + # Summary + print("\n关键发现:") + print("-" * 40) + + # Check if any good fit gives K near 3650 + near_target = results_df[(results_df["diff_from_target"] < 1000) & (results_df["r_squared"] >= 0.7)] + + if len(near_target) == 0: + print(" ⚠️ 没有任何数据窗口能在良好拟合(R²≥0.7)的条件下得到 K≈3650") + print(" ⚠️ 所有良好拟合的窗口都给出 K >> 3650 或 K << 3650") + print("\n 这说明:") + print(" • K=3650 不是数据自然支持的结论") + print(" • K=3650 来自物理约束,而非统计预测") + print(" • 论文中应该明确说明这是'物理上限'而非'数据预测'") + else: + print(f" 找到 {len(near_target)} 个窗口使 K 接近 3650:") + for _, row in near_target.iterrows(): + print(f" {int(row['start_year'])}-2025: K={row['K']:.0f}, R²={row['r_squared']:.4f}") + + # Generate visualization + print("\n" + "=" * 80) + print("生成可视化...") + print("=" * 80) + + fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + + # Plot 1: K vs Start Year + ax1 = axes[0] + colors = ['#27AE60' if r2 >= 0.8 else '#F39C12' if r2 >= 0.5 else '#E74C3C' + for r2 in results_df["r_squared"]] + + ax1.scatter(results_df["start_year"], results_df["K"], c=colors, s=60, alpha=0.7, edgecolor='black') + ax1.axhline(3650, color='blue', ls='--', lw=2, label='Target K=3650') + ax1.axhline(3650*0.9, color='blue', ls=':', lw=1, alpha=0.5) + ax1.axhline(3650*1.1, color='blue', ls=':', lw=1, alpha=0.5) + + ax1.set_xlabel("Starting Year", fontsize=11) + ax1.set_ylabel("K (Carrying Capacity)", fontsize=11) + ax1.set_title("K vs Starting Year\n(Color: Green=R²≥0.8, Yellow=R²≥0.5, Red=R²<0.5)", fontsize=12) + ax1.legend() + ax1.grid(True, alpha=0.3) + ax1.set_xlim(1955, 2020) + + # Plot 2: R² vs Start Year + ax2 = axes[1] + ax2.scatter(results_df["start_year"], results_df["r_squared"], c=colors, s=60, alpha=0.7, edgecolor='black') + ax2.axhline(0.8, color='green', ls='--', lw=1.5, label='R²=0.8 (Good)') + ax2.axhline(0.5, color='orange', ls=':', lw=1.5, label='R²=0.5 (Acceptable)') + + ax2.set_xlabel("Starting Year", fontsize=11) + ax2.set_ylabel("R² (Goodness of Fit)", fontsize=11) + ax2.set_title("Model Fit Quality vs Starting Year", fontsize=12) + ax2.legend() + ax2.grid(True, alpha=0.3) + ax2.set_xlim(1955, 2020) + ax2.set_ylim(-0.1, 1.1) + + plt.tight_layout() + plt.savefig("find_optimal_window.png", dpi=150, bbox_inches='tight') + plt.close() + print("图表已保存: find_optimal_window.png") + + # Save to CSV + results_df.to_csv("window_enumeration.csv", index=False) + print("数据已保存: window_enumeration.csv") + + print("\n" + "=" * 80) + print("分析完成!") + print("=" * 80) + + return results_df + + +if __name__ == "__main__": + results = main() diff --git a/p1/lambda_cost_analysis.py b/p1/lambda_cost_analysis.py index 9233ca0..4ead3b9 100644 --- a/p1/lambda_cost_analysis.py +++ b/p1/lambda_cost_analysis.py @@ -1,844 +1,844 @@ -""" -Lambda Time Cost Analysis for Moon Colony Logistics - -This module introduces the time opportunity cost (λ) to find the optimal -operating point on the Energy-Time trade-off curve. - -Objective Function: J = E_total + λ × T -where: - - E_total: Total energy consumption (PJ) - - T: Construction timeline (years) - - λ: Time opportunity cost (PJ/year) - -The optimal point satisfies: dE/dT = -λ (marginal energy saving = time cost) -""" - -import numpy as np -import matplotlib -matplotlib.use('Agg') -import matplotlib.pyplot as plt -from matplotlib import rcParams -import pandas as pd -from typing import Dict, List, Tuple, Optional -from dataclasses import dataclass - -# Font settings -rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans', 'SimHei'] -rcParams['axes.unicode_minus'] = False - -# ============== Physical Constants ============== -G0 = 9.81 # m/s² -OMEGA_EARTH = 7.27e-5 # rad/s -R_EARTH = 6.371e6 # m - -# Mission parameters -TOTAL_PAYLOAD = 100e6 # 100 million metric tons - -# Space Elevator parameters -NUM_ELEVATORS = 3 -ELEVATOR_CAPACITY_PER_YEAR = 179000 # metric tons per elevator per year -TOTAL_ELEVATOR_CAPACITY = NUM_ELEVATORS * ELEVATOR_CAPACITY_PER_YEAR # 537,000 tons/year -ELEVATOR_SPECIFIC_ENERGY = 157.2e9 # J per metric ton (157.2 MJ/kg × 1000) - -# Rocket parameters - LOX/CH4 (Raptor-class) -PAYLOAD_PER_LAUNCH = 125 # metric tons per launch -ISP = 363 # Specific impulse (s) -SPECIFIC_FUEL_ENERGY = 11.9e6 # J/kg -ALPHA = 0.10 # Structural coefficient -NUM_STAGES = 3 -DELTA_V_BASE = 13300 # m/s (LEO + TLI + LOI) - - -# ============== Launch Site Definition ============== -@dataclass -class LaunchSite: - name: str - short_name: str - latitude: float - max_launches_per_day: int = 1 - - @property - def abs_latitude(self) -> float: - return abs(self.latitude) - - @property - def delta_v_loss(self) -> float: - v_equator = OMEGA_EARTH * R_EARTH - v_site = OMEGA_EARTH * R_EARTH * np.cos(np.radians(self.abs_latitude)) - return v_equator - v_site - - @property - def total_delta_v(self) -> float: - return DELTA_V_BASE + self.delta_v_loss - - -LAUNCH_SITES = sorted([ - LaunchSite("Kourou (French Guiana)", "Kourou", 5.2), - LaunchSite("Satish Dhawan (India)", "SDSC", 13.7), - LaunchSite("Boca Chica (Texas)", "Texas", 26.0), - LaunchSite("Cape Canaveral (Florida)", "Florida", 28.5), - LaunchSite("Vandenberg (California)", "California", 34.7), - LaunchSite("Wallops (Virginia)", "Virginia", 37.8), - LaunchSite("Taiyuan (China)", "Taiyuan", 38.8), - LaunchSite("Mahia (New Zealand)", "Mahia", 39.3), - LaunchSite("Baikonur (Kazakhstan)", "Baikonur", 45.6), - LaunchSite("Kodiak (Alaska)", "Alaska", 57.4), -], key=lambda x: x.abs_latitude) - - -# ============== Core Calculation Functions ============== - -def fuel_ratio_multistage(delta_v: float) -> float: - """Multi-stage rocket fuel/payload ratio""" - ve = ISP * G0 - delta_v_per_stage = delta_v / NUM_STAGES - R_stage = np.exp(delta_v_per_stage / ve) - - denominator = 1 - ALPHA * (R_stage - 1) - if denominator <= 0: - return np.inf - - k_stage = (R_stage - 1) / denominator - - total_fuel_ratio = 0 - remaining_ratio = 1.0 - - for _ in range(NUM_STAGES): - fuel_this_stage = remaining_ratio * k_stage - total_fuel_ratio += fuel_this_stage - remaining_ratio *= (1 + k_stage * (1 + ALPHA)) - - return total_fuel_ratio - - -def rocket_energy_per_ton(site: LaunchSite) -> float: - """Energy consumption per ton of payload for rocket launch (J/ton)""" - k = fuel_ratio_multistage(site.total_delta_v) - fuel_per_ton = k * 1000 # kg fuel per metric ton payload - return fuel_per_ton * SPECIFIC_FUEL_ENERGY - - -def calculate_scenario(completion_years: float) -> Optional[Dict]: - """ - Calculate optimal scenario for given completion timeline - (elevator priority + low-latitude rockets) - """ - # Space elevator transport - elevator_payload = min(TOTAL_ELEVATOR_CAPACITY * completion_years, TOTAL_PAYLOAD) - elevator_energy = elevator_payload * ELEVATOR_SPECIFIC_ENERGY - - # Remaining payload for rockets - remaining_payload = TOTAL_PAYLOAD - elevator_payload - - if remaining_payload <= 0: - return { - 'years': completion_years, - 'elevator_payload': elevator_payload, - 'rocket_payload': 0, - 'elevator_energy_PJ': elevator_energy / 1e15, - 'rocket_energy_PJ': 0, - 'total_energy_PJ': elevator_energy / 1e15, - 'rocket_launches': 0, - 'sites_used': 0, - 'elevator_fraction': 1.0, - } - - # Rocket launches needed - rocket_launches_needed = int(np.ceil(remaining_payload / PAYLOAD_PER_LAUNCH)) - - # Allocate by latitude priority - days_available = completion_years * 365 - max_launches_per_site = int(days_available) - - # Check feasibility - total_rocket_capacity = len(LAUNCH_SITES) * max_launches_per_site * PAYLOAD_PER_LAUNCH - if remaining_payload > total_rocket_capacity: - return None - - rocket_energy = 0 - sites_used = 0 - remaining_launches = rocket_launches_needed - - for site in LAUNCH_SITES: - if remaining_launches <= 0: - break - allocated = min(remaining_launches, max_launches_per_site) - rocket_energy += rocket_energy_per_ton(site) * PAYLOAD_PER_LAUNCH * allocated - remaining_launches -= allocated - if allocated > 0: - sites_used += 1 - - rocket_payload = rocket_launches_needed * PAYLOAD_PER_LAUNCH - total_energy = elevator_energy + rocket_energy - - return { - 'years': completion_years, - 'elevator_payload': elevator_payload, - 'rocket_payload': rocket_payload, - 'elevator_energy_PJ': elevator_energy / 1e15, - 'rocket_energy_PJ': rocket_energy / 1e15, - 'total_energy_PJ': total_energy / 1e15, - 'rocket_launches': rocket_launches_needed, - 'sites_used': sites_used, - 'elevator_fraction': elevator_payload / TOTAL_PAYLOAD, - } - - -# ============== Generate Trade-off Curve ============== - -def generate_tradeoff_curve( - year_min: float = 100, - year_max: float = 250, - num_points: int = 500 -) -> pd.DataFrame: - """Generate Energy-Time trade-off curve data""" - years_range = np.linspace(year_min, year_max, num_points) - - results = [] - for years in years_range: - scenario = calculate_scenario(years) - if scenario is not None: - results.append({ - 'years': years, - 'energy_PJ': scenario['total_energy_PJ'], - 'elevator_fraction': scenario['elevator_fraction'], - 'sites_used': scenario['sites_used'], - 'rocket_launches': scenario['rocket_launches'], - }) - - return pd.DataFrame(results) - - -# ============== Lambda Cost Analysis ============== - -def calculate_total_cost(df: pd.DataFrame, lambda_cost: float) -> np.ndarray: - """ - Calculate total cost J = E + λ × T - - Args: - df: Trade-off curve data - lambda_cost: Time opportunity cost (PJ/year) - - Returns: - Total cost array - """ - return df['energy_PJ'].values + lambda_cost * df['years'].values - - -def find_optimal_point(df: pd.DataFrame, lambda_cost: float) -> Dict: - """ - Find optimal point that minimizes J = E + λ × T - - Args: - df: Trade-off curve data - lambda_cost: Time opportunity cost (PJ/year) - - Returns: - Optimal point information - """ - total_cost = calculate_total_cost(df, lambda_cost) - opt_idx = np.argmin(total_cost) - - return { - 'index': opt_idx, - 'years': df['years'].iloc[opt_idx], - 'energy_PJ': df['energy_PJ'].iloc[opt_idx], - 'total_cost': total_cost[opt_idx], - 'elevator_fraction': df['elevator_fraction'].iloc[opt_idx], - 'lambda': lambda_cost, - } - - -def calculate_marginal_energy_saving(df: pd.DataFrame) -> np.ndarray: - """ - Calculate marginal energy saving rate: -dE/dT (PJ/year) - - This represents how much energy is saved per additional year of timeline. - """ - years = df['years'].values - energy = df['energy_PJ'].values - - # Use central difference for interior points - marginal = -np.gradient(energy, years) - - return marginal - - -def sensitivity_analysis( - df: pd.DataFrame, - lambda_range: np.ndarray -) -> pd.DataFrame: - """ - Perform sensitivity analysis on λ parameter - - Args: - df: Trade-off curve data - lambda_range: Array of λ values to test - - Returns: - DataFrame with optimal points for each λ - """ - results = [] - for lam in lambda_range: - opt = find_optimal_point(df, lam) - results.append({ - 'lambda_PJ_per_year': lam, - 'optimal_years': opt['years'], - 'optimal_energy_PJ': opt['energy_PJ'], - 'total_cost_PJ': opt['total_cost'], - 'elevator_fraction': opt['elevator_fraction'], - }) - - return pd.DataFrame(results) - - -# ============== Visualization Functions ============== - -def plot_lambda_analysis( - df: pd.DataFrame, - save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_cost_analysis.png' -): - """ - Comprehensive visualization of λ time cost analysis - Focus on critical range λ = 400-600 PJ/year - """ - fig, axes = plt.subplots(2, 2, figsize=(14, 12)) - - years = df['years'].values - energy = df['energy_PJ'].values - - # Key boundaries - T_min = years.min() # ~100.7 years (fastest) - T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY # ~186 years (elevator only) - E_min = energy[years >= T_elev].min() if any(years >= T_elev) else energy.min() - - # ========== Plot 1: Trade-off Curve with λ Iso-cost Lines ========== - ax1 = axes[0, 0] - - # Main curve - ax1.plot(years, energy, 'b-', linewidth=2.5, label='Energy-Time Trade-off') - - # Mark key points - ax1.axvline(x=T_elev, color='green', linestyle='--', alpha=0.7, label=f'Elevator-only: {T_elev:.1f} years') - ax1.axvline(x=T_min, color='red', linestyle='--', alpha=0.7, label=f'Minimum time: {T_min:.1f} years') - - # Draw iso-cost lines for different λ (focus on 400-600 range) - lambda_values = [420, 480, 500, 550] - colors = ['#2ecc71', '#e74c3c', '#9b59b6', '#3498db'] - - for lam, color in zip(lambda_values, colors): - opt = find_optimal_point(df, lam) - # Iso-cost line: E + λT = const → E = const - λT - T_line = np.linspace(80, 220, 100) - E_line = opt['total_cost'] - lam * T_line - valid = (E_line > 0) & (E_line < 70000) - ax1.plot(T_line[valid], E_line[valid], '--', color=color, alpha=0.6, linewidth=1.5) - ax1.plot(opt['years'], opt['energy_PJ'], 'o', color=color, markersize=12, - markeredgecolor='black', markeredgewidth=1.5, - label=f'λ={lam}: T={opt["years"]:.1f}y, E={opt["energy_PJ"]:.0f}PJ') - - ax1.set_xlabel('Construction Timeline T (years)', fontsize=12) - ax1.set_ylabel('Total Energy E (PJ)', fontsize=12) - ax1.set_title('Energy-Time Trade-off with λ Iso-cost Lines (λ=400-600)\n$J = E + λT$', fontsize=13) - ax1.legend(loc='upper right', fontsize=9) - ax1.grid(True, alpha=0.3) - ax1.set_xlim(95, 200) - ax1.set_ylim(10000, 65000) - - # ========== Plot 2: Marginal Energy Saving Rate ========== - ax2 = axes[0, 1] - - marginal = calculate_marginal_energy_saving(df) - - ax2.plot(years, marginal, 'r-', linewidth=2, label='Marginal Energy Saving -dE/dT') - ax2.axhline(y=0, color='black', linestyle='-', alpha=0.3) - - # Mark critical λ values in 400-600 range - for lam, color in zip([450, 480, 500, 550], ['#2ecc71', '#e74c3c', '#9b59b6', '#3498db']): - ax2.axhline(y=lam, color=color, linestyle='--', alpha=0.7, label=f'λ = {lam} PJ/year') - # Find intersection - intersect_idx = np.argmin(np.abs(marginal - lam)) - ax2.plot(years[intersect_idx], marginal[intersect_idx], 'o', color=color, markersize=8) - - ax2.set_xlabel('Construction Timeline T (years)', fontsize=12) - ax2.set_ylabel('Marginal Energy Saving -dE/dT (PJ/year)', fontsize=12) - ax2.set_title('Marginal Analysis: Optimal Condition is -dE/dT = λ', fontsize=13) - ax2.legend(loc='upper right', fontsize=9) - ax2.grid(True, alpha=0.3) - ax2.set_xlim(95, 200) - ax2.set_ylim(350, 620) - - # ========== Plot 3: Sensitivity Analysis (400-600 range) ========== - ax3 = axes[1, 0] - - lambda_range = np.linspace(400, 600, 200) - sensitivity_df = sensitivity_analysis(df, lambda_range) - - # Plot optimal years vs λ - ax3.plot(sensitivity_df['lambda_PJ_per_year'], sensitivity_df['optimal_years'], - 'b-', linewidth=2.5, label='Optimal Timeline T*') - - # Mark key regions - ax3.axhline(y=T_elev, color='green', linestyle='--', alpha=0.7, label=f'Elevator-only: {T_elev:.1f}y') - ax3.axhline(y=T_min, color='red', linestyle='--', alpha=0.7, label=f'Min timeline: {T_min:.1f}y') - ax3.axhline(y=139, color='orange', linestyle=':', linewidth=2, alpha=0.8, label='Original knee: 139y') - - # Find λ corresponding to 139 years - idx_139 = np.argmin(np.abs(sensitivity_df['optimal_years'] - 139)) - if idx_139 < len(sensitivity_df): - lambda_139 = sensitivity_df['lambda_PJ_per_year'].iloc[idx_139] - ax3.axvline(x=lambda_139, color='orange', linestyle=':', linewidth=2, alpha=0.6) - ax3.scatter([lambda_139], [139], s=150, c='orange', marker='*', zorder=5, - edgecolors='black', linewidths=1.5, label=f'λ≈{lambda_139:.0f} for T*=139y') - - # Mark critical transition - ax3.axvline(x=480, color='purple', linestyle='--', alpha=0.5) - ax3.text(482, 175, 'Critical\nTransition', fontsize=9, color='purple') - - ax3.set_xlabel('Time Opportunity Cost λ (PJ/year)', fontsize=12) - ax3.set_ylabel('Optimal Timeline T* (years)', fontsize=12) - ax3.set_title('Sensitivity Analysis: Optimal Timeline vs λ (400-600 range)', fontsize=13) - ax3.legend(loc='upper right', fontsize=9) - ax3.grid(True, alpha=0.3) - ax3.set_xlim(400, 600) - ax3.set_ylim(95, 195) - - # ========== Plot 4: Total Cost Curves (400-600 range) ========== - ax4 = axes[1, 1] - - for lam, color in [(450, '#2ecc71'), (480, '#e74c3c'), (500, '#9b59b6'), (550, '#3498db')]: - total_cost = calculate_total_cost(df, lam) - ax4.plot(years, total_cost / 1000, color=color, linestyle='-', - linewidth=2, label=f'λ={lam} PJ/year') - - # Mark minimum - opt = find_optimal_point(df, lam) - ax4.plot(opt['years'], opt['total_cost'] / 1000, 'o', color=color, markersize=10, - markeredgecolor='black', markeredgewidth=1.5) - - ax4.set_xlabel('Construction Timeline T (years)', fontsize=12) - ax4.set_ylabel('Total Cost J = E + λT (×10³ PJ)', fontsize=12) - ax4.set_title('Total Cost Function for λ = 400-600 PJ/year', fontsize=13) - ax4.legend(loc='upper right', fontsize=10) - ax4.grid(True, alpha=0.3) - ax4.set_xlim(95, 200) - - plt.tight_layout() - plt.savefig(save_path, dpi=150, bbox_inches='tight') - print(f"Lambda analysis plot saved to: {save_path}") - - return fig - - -def plot_decision_recommendation( - df: pd.DataFrame, - save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_decision_map.png' -): - """ - Decision map showing optimal choice based on λ preference - """ - fig, ax = plt.subplots(figsize=(12, 8)) - - years = df['years'].values - energy = df['energy_PJ'].values - - # Main trade-off curve - ax.plot(years, energy, 'b-', linewidth=3, label='Feasible Trade-off Curve') - - # Key boundaries - T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY - T_min = years.min() - - # Shade decision regions - # Region 1: Low λ (cost priority) → longer timeline - ax.axvspan(160, 190, alpha=0.2, color='green', label='Low λ (<150): Cost Priority') - # Region 2: Medium λ (balanced) → middle ground - ax.axvspan(130, 160, alpha=0.2, color='yellow', label='Medium λ (150-250): Balanced') - # Region 3: High λ (time priority) → shorter timeline - ax.axvspan(100, 130, alpha=0.2, color='red', label='High λ (>250): Time Priority') - - # Mark specific strategy points - strategies = [ - {'name': 'A: Cost-Prioritized', 'years': 186, 'lambda': 0, 'color': 'green'}, - {'name': 'C: Balanced (λ≈200)', 'years': 139, 'lambda': 200, 'color': 'orange'}, - {'name': 'B: Time-Prioritized', 'years': 101, 'lambda': 500, 'color': 'red'}, - ] - - for s in strategies: - idx = np.argmin(np.abs(years - s['years'])) - ax.plot(years[idx], energy[idx], 'o', color=s['color'], markersize=15, - markeredgecolor='black', markeredgewidth=2) - ax.annotate(s['name'], (years[idx], energy[idx]), - textcoords="offset points", xytext=(10, 10), fontsize=11, - fontweight='bold', color=s['color']) - - # Add decision guidance text - textstr = '\n'.join([ - 'Decision Guidance:', - '─────────────────', - 'λ < 150 PJ/year → Strategy A', - ' (Long-term cost efficiency)', - '', - '150 ≤ λ ≤ 250 → Strategy C', - ' (Balanced trade-off)', - '', - 'λ > 250 PJ/year → Strategy B', - ' (Time-critical mission)', - ]) - props = dict(boxstyle='round', facecolor='wheat', alpha=0.8) - ax.text(0.02, 0.98, textstr, transform=ax.transAxes, fontsize=10, - verticalalignment='top', bbox=props, family='monospace') - - ax.set_xlabel('Construction Timeline T (years)', fontsize=13) - ax.set_ylabel('Total Energy E (PJ)', fontsize=13) - ax.set_title('Decision Map: Optimal Strategy Selection Based on Time Opportunity Cost λ', fontsize=14) - ax.legend(loc='upper right', fontsize=10) - ax.grid(True, alpha=0.3) - ax.set_xlim(95, 200) - ax.set_ylim(10000, 65000) - - plt.tight_layout() - plt.savefig(save_path, dpi=150, bbox_inches='tight') - print(f"Decision map saved to: {save_path}") - - return fig - - -# ============== Critical Point Analysis ============== - -def analyze_curve_structure(df: pd.DataFrame) -> Dict: - """ - Analyze the structure of the trade-off curve to understand - why certain λ values lead to specific optimal points. - """ - years = df['years'].values - energy = df['energy_PJ'].values - - # Calculate marginal rates - marginal = -np.gradient(energy, years) - - # Find the elevator-only boundary - T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY - idx_elev = np.argmin(np.abs(years - T_elev)) - - # Analyze marginal rate distribution - # Region 1: T > T_elev (pure elevator, marginal ≈ 0) - # Region 2: T < T_elev (need rockets, marginal > 0) - - # Find critical points where marginal rate changes significantly - marginal_near_elev = marginal[idx_elev - 5:idx_elev + 5] - marginal_at_139 = marginal[np.argmin(np.abs(years - 139))] - marginal_at_101 = marginal[np.argmin(np.abs(years - 101))] - - return { - 'T_elev': T_elev, - 'idx_elev': idx_elev, - 'marginal_at_elev': marginal[idx_elev], - 'marginal_at_139': marginal_at_139, - 'marginal_at_101': marginal_at_101, - 'energy_at_elev': energy[idx_elev], - 'energy_at_139': energy[np.argmin(np.abs(years - 139))], - 'energy_at_101': energy[np.argmin(np.abs(years - 101))], - } - - -def find_critical_lambda(df: pd.DataFrame) -> Dict: - """ - Find the critical λ values where optimal point transitions occur. - """ - years = df['years'].values - energy = df['energy_PJ'].values - - # Dense lambda scan - lambda_range = np.linspace(1, 1000, 2000) - - transitions = [] - prev_years = None - - for lam in lambda_range: - opt = find_optimal_point(df, lam) - if prev_years is not None and abs(opt['years'] - prev_years) > 5: - transitions.append({ - 'lambda': lam, - 'from_years': prev_years, - 'to_years': opt['years'], - }) - prev_years = opt['years'] - - return transitions - - -def plot_comprehensive_analysis( - df: pd.DataFrame, - save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_comprehensive.png' -): - """ - Comprehensive plot showing: - 1. Trade-off curve with marginal rates - 2. Critical λ transitions - 3. Decision regions - """ - fig = plt.figure(figsize=(16, 14)) - - years = df['years'].values - energy = df['energy_PJ'].values - marginal = calculate_marginal_energy_saving(df) - - T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY - T_min = years.min() - - # ========== Plot 1: Trade-off curve with annotations ========== - ax1 = fig.add_subplot(2, 2, 1) - - ax1.plot(years, energy / 1000, 'b-', linewidth=2.5, label='Trade-off Curve') - - # Mark key points - key_points = [ - (T_min, 'Minimum Time\n(~101 years)', 'red'), - (139, 'Original Knee\n(139 years)', 'orange'), - (T_elev, 'Elevator-Only\n(~186 years)', 'green'), - ] - - for t, label, color in key_points: - idx = np.argmin(np.abs(years - t)) - ax1.plot(years[idx], energy[idx] / 1000, 'o', color=color, markersize=12, - markeredgecolor='black', markeredgewidth=2, zorder=5) - ax1.annotate(label, (years[idx], energy[idx] / 1000), - textcoords="offset points", xytext=(10, 10), fontsize=10, - color=color, fontweight='bold') - - ax1.set_xlabel('Construction Timeline T (years)', fontsize=12) - ax1.set_ylabel('Total Energy E (×10³ PJ)', fontsize=12) - ax1.set_title('Energy-Time Trade-off Curve', fontsize=14) - ax1.grid(True, alpha=0.3) - ax1.set_xlim(95, 200) - ax1.legend(loc='upper right') - - # ========== Plot 2: Marginal Rate Analysis ========== - ax2 = fig.add_subplot(2, 2, 2) - - ax2.plot(years, marginal, 'r-', linewidth=2, label='Marginal Saving Rate') - ax2.fill_between(years, 0, marginal, alpha=0.3, color='red') - - # Mark critical thresholds - ax2.axhline(y=480, color='purple', linestyle='--', linewidth=2, - label='Critical λ ≈ 480 PJ/year') - ax2.axvline(x=T_elev, color='green', linestyle=':', alpha=0.7) - - # Annotate the jump at elevator boundary - ax2.annotate('Marginal rate jumps\nat elevator capacity limit', - xy=(T_elev, marginal[np.argmin(np.abs(years - T_elev))]), - xytext=(150, 400), fontsize=10, - arrowprops=dict(arrowstyle='->', color='black')) - - ax2.set_xlabel('Construction Timeline T (years)', fontsize=12) - ax2.set_ylabel('Marginal Energy Saving -dE/dT (PJ/year)', fontsize=12) - ax2.set_title('Marginal Analysis: Why 186 years is optimal for most λ', fontsize=14) - ax2.grid(True, alpha=0.3) - ax2.set_xlim(95, 200) - ax2.set_ylim(-50, 600) - ax2.legend(loc='upper right') - - # ========== Plot 3: λ Sensitivity with Phase Transitions (400-600 focus) ========== - ax3 = fig.add_subplot(2, 2, 3) - - lambda_range = np.linspace(400, 600, 200) - opt_years = [] - for lam in lambda_range: - opt = find_optimal_point(df, lam) - opt_years.append(opt['years']) - - ax3.plot(lambda_range, opt_years, 'b-', linewidth=2.5) - - # Shade phases - ax3.axhspan(180, 190, alpha=0.3, color='green', label='Phase 1: Elevator-Only (λ < 480)') - ax3.axhspan(100, 145, alpha=0.3, color='red', label='Phase 2: Hybrid (λ > 480)') - - # Mark critical λ - ax3.axvline(x=480, color='purple', linestyle='--', linewidth=2) - ax3.annotate('Critical Transition\nλ ≈ 480 PJ/year', - xy=(480, 160), fontsize=11, color='purple', fontweight='bold', - ha='center') - - # Mark 139 year point - ax3.axhline(y=139, color='orange', linestyle=':', linewidth=2, alpha=0.8) - ax3.scatter([500], [139], s=200, c='orange', marker='*', zorder=5, - edgecolors='black', linewidths=2, label='T*=139y at λ≈500') - - ax3.set_xlabel('Time Opportunity Cost λ (PJ/year)', fontsize=12) - ax3.set_ylabel('Optimal Timeline T* (years)', fontsize=12) - ax3.set_title('Phase Transition in Optimal Strategy (λ=400-600)', fontsize=14) - ax3.grid(True, alpha=0.3) - ax3.set_xlim(400, 600) - ax3.set_ylim(95, 195) - ax3.legend(loc='upper right') - - # ========== Plot 4: Decision Summary Table ========== - ax4 = fig.add_subplot(2, 2, 4) - ax4.axis('off') - - # Create summary table - summary_text = """ - ┌─────────────────────────────────────────────────────────────────┐ - │ KEY FINDINGS FROM λ COST ANALYSIS │ - ├─────────────────────────────────────────────────────────────────┤ - │ │ - │ 1. CURVE STRUCTURE │ - │ • Sharp discontinuity at T = 186 years (elevator capacity) │ - │ • Marginal rate jumps from ~0 to ~480 PJ/year at boundary │ - │ │ - │ 2. OPTIMAL POINT SELECTION │ - │ • λ < 480 PJ/year → T* = 186 years (elevator-only) │ - │ • λ ≈ 500 PJ/year → T* = 139 years (original knee) │ - │ • λ > 600 PJ/year → T* → 101 years (time-priority) │ - │ │ - │ 3. IMPLICATIONS FOR THE 139-YEAR KNEE POINT │ - │ • Requires implicit assumption: λ ≈ 500 PJ/year │ - │ • This means: 1 year delay costs ~500 PJ opportunity cost │ - │ • Equivalent to: ~0.5% of total elevator energy per year │ - │ │ - │ 4. RECOMMENDATION │ - │ • Either justify λ ≈ 500 PJ/year with physical reasoning │ - │ • Or acknowledge 186 years as cost-optimal baseline │ - │ • Present 139 years as a time-constrained scenario │ - │ │ - └─────────────────────────────────────────────────────────────────┘ - """ - - ax4.text(0.05, 0.95, summary_text, transform=ax4.transAxes, - fontsize=11, verticalalignment='top', family='monospace', - bbox=dict(boxstyle='round', facecolor='lightyellow', alpha=0.8)) - - plt.tight_layout() - plt.savefig(save_path, dpi=150, bbox_inches='tight') - print(f"Comprehensive analysis saved to: {save_path}") - - return fig - - -# ============== Main Analysis ============== - -def main(): - print("=" * 70) - print("Lambda Time Cost Analysis for Moon Colony Logistics") - print("=" * 70) - - # Generate trade-off curve - print("\n[1] Generating Energy-Time trade-off curve...") - df = generate_tradeoff_curve(year_min=100, year_max=220, num_points=500) - print(f" Generated {len(df)} data points") - - # Key statistics - T_min = df['years'].min() - T_max = df['years'].max() - E_min = df['energy_PJ'].min() - E_max = df['energy_PJ'].max() - T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY - - print(f"\n[2] Trade-off Curve Statistics:") - print(f" Timeline range: {T_min:.1f} - {T_max:.1f} years") - print(f" Energy range: {E_min:.0f} - {E_max:.0f} PJ") - print(f" Elevator-only timeline: {T_elev:.1f} years") - - # Curve structure analysis - print("\n[3] Curve Structure Analysis:") - structure = analyze_curve_structure(df) - print(f" At elevator boundary (T={structure['T_elev']:.1f}y):") - print(f" - Energy: {structure['energy_at_elev']:.0f} PJ") - print(f" - Marginal rate: {structure['marginal_at_elev']:.1f} PJ/year") - print(f" At T=139 years:") - print(f" - Energy: {structure['energy_at_139']:.0f} PJ") - print(f" - Marginal rate: {structure['marginal_at_139']:.1f} PJ/year") - print(f" At T=101 years:") - print(f" - Energy: {structure['energy_at_101']:.0f} PJ") - print(f" - Marginal rate: {structure['marginal_at_101']:.1f} PJ/year") - - # Find critical transitions - print("\n[4] Critical λ Transitions:") - transitions = find_critical_lambda(df) - for t in transitions: - print(f" λ ≈ {t['lambda']:.0f} PJ/year: T* jumps from {t['from_years']:.0f}y to {t['to_years']:.0f}y") - - # Sensitivity analysis - print("\n[5] Sensitivity Analysis Results:") - print(" " + "-" * 55) - print(f" {'λ (PJ/year)':<15} {'Optimal T (years)':<20} {'Energy (PJ)':<15}") - print(" " + "-" * 55) - - test_lambdas = [100, 200, 300, 400, 450, 480, 500, 550, 600] - sensitivity_results = [] - - for lam in test_lambdas: - opt = find_optimal_point(df, lam) - print(f" {lam:<15.0f} {opt['years']:<20.1f} {opt['energy_PJ']:<15.0f}") - sensitivity_results.append(opt) - - # Find λ that gives 139 years - print("\n[6] Original Knee Point Analysis (139 years):") - lambda_for_139 = None - for lam in np.linspace(400, 600, 1000): - opt = find_optimal_point(df, lam) - if abs(opt['years'] - 139) < 1: - lambda_for_139 = lam - print(f" λ ≈ {lam:.0f} PJ/year corresponds to T* ≈ 139 years") - break - - if lambda_for_139: - print(f"\n INTERPRETATION:") - print(f" To justify 139-year knee point, one must argue that:") - print(f" • Each year of delay costs ~{lambda_for_139:.0f} PJ in opportunity") - print(f" • This is {lambda_for_139/E_min*100:.1f}% of minimum total energy per year") - print(f" • Over 47 years (139→186), this amounts to {lambda_for_139*47:.0f} PJ") - - # Generate plots - print("\n[7] Generating visualization plots...") - plot_lambda_analysis(df) - plot_decision_recommendation(df) - plot_comprehensive_analysis(df) - - # Save sensitivity data - sensitivity_df = sensitivity_analysis(df, np.linspace(50, 600, 120)) - sensitivity_df.to_csv('/Volumes/Files/code/mm/20260130_b/p1/lambda_sensitivity.csv', index=False) - print(" Data saved to: lambda_sensitivity.csv") - - # Paper modification recommendations - print("\n" + "=" * 70) - print("RECOMMENDATIONS FOR PAPER MODIFICATION") - print("=" * 70) - print(""" - 1. REFRAME THE OPTIMIZATION PROBLEM - Current: "Multi-objective Pareto optimization" - Suggested: "Constrained optimization with time-cost trade-off" - - 2. INTRODUCE λ AS DECISION PARAMETER - Add equation: J = E_total + λ × T - where λ represents "time opportunity cost" (PJ/year) - - 3. JUSTIFY THE KNEE POINT SELECTION - Option A: Argue λ ≈ 480-500 PJ/year is reasonable because: - - Delayed lunar resource extraction - - Extended Earth-side operational costs - - Strategic/geopolitical value of early completion - - Option B: Present multiple scenarios: - - "Cost-optimal" (λ < 480): T* = 186 years - - "Balanced" (λ ≈ 500): T* = 139 years - - "Time-critical" (λ > 600): T* → 101 years - - 4. ADD SENSITIVITY ANALYSIS FIGURE - Show how optimal T* changes with λ (Figure generated) - - 5. ACKNOWLEDGE THE DISCONTINUITY - Note that the trade-off curve has a sharp transition at - T = 186 years due to elevator capacity constraints - """) - - print("=" * 70) - print("Analysis Complete!") - print("=" * 70) - - return df, sensitivity_results - - -if __name__ == "__main__": - df, results = main() +""" +Lambda Time Cost Analysis for Moon Colony Logistics + +This module introduces the time opportunity cost (λ) to find the optimal +operating point on the Energy-Time trade-off curve. + +Objective Function: J = E_total + λ × T +where: + - E_total: Total energy consumption (PJ) + - T: Construction timeline (years) + - λ: Time opportunity cost (PJ/year) + +The optimal point satisfies: dE/dT = -λ (marginal energy saving = time cost) +""" + +import numpy as np +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib import rcParams +import pandas as pd +from typing import Dict, List, Tuple, Optional +from dataclasses import dataclass + +# Font settings +rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans', 'SimHei'] +rcParams['axes.unicode_minus'] = False + +# ============== Physical Constants ============== +G0 = 9.81 # m/s² +OMEGA_EARTH = 7.27e-5 # rad/s +R_EARTH = 6.371e6 # m + +# Mission parameters +TOTAL_PAYLOAD = 100e6 # 100 million metric tons + +# Space Elevator parameters +NUM_ELEVATORS = 3 +ELEVATOR_CAPACITY_PER_YEAR = 179000 # metric tons per elevator per year +TOTAL_ELEVATOR_CAPACITY = NUM_ELEVATORS * ELEVATOR_CAPACITY_PER_YEAR # 537,000 tons/year +ELEVATOR_SPECIFIC_ENERGY = 157.2e9 # J per metric ton (157.2 MJ/kg × 1000) + +# Rocket parameters - LOX/CH4 (Raptor-class) +PAYLOAD_PER_LAUNCH = 125 # metric tons per launch +ISP = 363 # Specific impulse (s) +SPECIFIC_FUEL_ENERGY = 11.9e6 # J/kg +ALPHA = 0.10 # Structural coefficient +NUM_STAGES = 3 +DELTA_V_BASE = 13300 # m/s (LEO + TLI + LOI) + + +# ============== Launch Site Definition ============== +@dataclass +class LaunchSite: + name: str + short_name: str + latitude: float + max_launches_per_day: int = 1 + + @property + def abs_latitude(self) -> float: + return abs(self.latitude) + + @property + def delta_v_loss(self) -> float: + v_equator = OMEGA_EARTH * R_EARTH + v_site = OMEGA_EARTH * R_EARTH * np.cos(np.radians(self.abs_latitude)) + return v_equator - v_site + + @property + def total_delta_v(self) -> float: + return DELTA_V_BASE + self.delta_v_loss + + +LAUNCH_SITES = sorted([ + LaunchSite("Kourou (French Guiana)", "Kourou", 5.2), + LaunchSite("Satish Dhawan (India)", "SDSC", 13.7), + LaunchSite("Boca Chica (Texas)", "Texas", 26.0), + LaunchSite("Cape Canaveral (Florida)", "Florida", 28.5), + LaunchSite("Vandenberg (California)", "California", 34.7), + LaunchSite("Wallops (Virginia)", "Virginia", 37.8), + LaunchSite("Taiyuan (China)", "Taiyuan", 38.8), + LaunchSite("Mahia (New Zealand)", "Mahia", 39.3), + LaunchSite("Baikonur (Kazakhstan)", "Baikonur", 45.6), + LaunchSite("Kodiak (Alaska)", "Alaska", 57.4), +], key=lambda x: x.abs_latitude) + + +# ============== Core Calculation Functions ============== + +def fuel_ratio_multistage(delta_v: float) -> float: + """Multi-stage rocket fuel/payload ratio""" + ve = ISP * G0 + delta_v_per_stage = delta_v / NUM_STAGES + R_stage = np.exp(delta_v_per_stage / ve) + + denominator = 1 - ALPHA * (R_stage - 1) + if denominator <= 0: + return np.inf + + k_stage = (R_stage - 1) / denominator + + total_fuel_ratio = 0 + remaining_ratio = 1.0 + + for _ in range(NUM_STAGES): + fuel_this_stage = remaining_ratio * k_stage + total_fuel_ratio += fuel_this_stage + remaining_ratio *= (1 + k_stage * (1 + ALPHA)) + + return total_fuel_ratio + + +def rocket_energy_per_ton(site: LaunchSite) -> float: + """Energy consumption per ton of payload for rocket launch (J/ton)""" + k = fuel_ratio_multistage(site.total_delta_v) + fuel_per_ton = k * 1000 # kg fuel per metric ton payload + return fuel_per_ton * SPECIFIC_FUEL_ENERGY + + +def calculate_scenario(completion_years: float) -> Optional[Dict]: + """ + Calculate optimal scenario for given completion timeline + (elevator priority + low-latitude rockets) + """ + # Space elevator transport + elevator_payload = min(TOTAL_ELEVATOR_CAPACITY * completion_years, TOTAL_PAYLOAD) + elevator_energy = elevator_payload * ELEVATOR_SPECIFIC_ENERGY + + # Remaining payload for rockets + remaining_payload = TOTAL_PAYLOAD - elevator_payload + + if remaining_payload <= 0: + return { + 'years': completion_years, + 'elevator_payload': elevator_payload, + 'rocket_payload': 0, + 'elevator_energy_PJ': elevator_energy / 1e15, + 'rocket_energy_PJ': 0, + 'total_energy_PJ': elevator_energy / 1e15, + 'rocket_launches': 0, + 'sites_used': 0, + 'elevator_fraction': 1.0, + } + + # Rocket launches needed + rocket_launches_needed = int(np.ceil(remaining_payload / PAYLOAD_PER_LAUNCH)) + + # Allocate by latitude priority + days_available = completion_years * 365 + max_launches_per_site = int(days_available) + + # Check feasibility + total_rocket_capacity = len(LAUNCH_SITES) * max_launches_per_site * PAYLOAD_PER_LAUNCH + if remaining_payload > total_rocket_capacity: + return None + + rocket_energy = 0 + sites_used = 0 + remaining_launches = rocket_launches_needed + + for site in LAUNCH_SITES: + if remaining_launches <= 0: + break + allocated = min(remaining_launches, max_launches_per_site) + rocket_energy += rocket_energy_per_ton(site) * PAYLOAD_PER_LAUNCH * allocated + remaining_launches -= allocated + if allocated > 0: + sites_used += 1 + + rocket_payload = rocket_launches_needed * PAYLOAD_PER_LAUNCH + total_energy = elevator_energy + rocket_energy + + return { + 'years': completion_years, + 'elevator_payload': elevator_payload, + 'rocket_payload': rocket_payload, + 'elevator_energy_PJ': elevator_energy / 1e15, + 'rocket_energy_PJ': rocket_energy / 1e15, + 'total_energy_PJ': total_energy / 1e15, + 'rocket_launches': rocket_launches_needed, + 'sites_used': sites_used, + 'elevator_fraction': elevator_payload / TOTAL_PAYLOAD, + } + + +# ============== Generate Trade-off Curve ============== + +def generate_tradeoff_curve( + year_min: float = 100, + year_max: float = 250, + num_points: int = 500 +) -> pd.DataFrame: + """Generate Energy-Time trade-off curve data""" + years_range = np.linspace(year_min, year_max, num_points) + + results = [] + for years in years_range: + scenario = calculate_scenario(years) + if scenario is not None: + results.append({ + 'years': years, + 'energy_PJ': scenario['total_energy_PJ'], + 'elevator_fraction': scenario['elevator_fraction'], + 'sites_used': scenario['sites_used'], + 'rocket_launches': scenario['rocket_launches'], + }) + + return pd.DataFrame(results) + + +# ============== Lambda Cost Analysis ============== + +def calculate_total_cost(df: pd.DataFrame, lambda_cost: float) -> np.ndarray: + """ + Calculate total cost J = E + λ × T + + Args: + df: Trade-off curve data + lambda_cost: Time opportunity cost (PJ/year) + + Returns: + Total cost array + """ + return df['energy_PJ'].values + lambda_cost * df['years'].values + + +def find_optimal_point(df: pd.DataFrame, lambda_cost: float) -> Dict: + """ + Find optimal point that minimizes J = E + λ × T + + Args: + df: Trade-off curve data + lambda_cost: Time opportunity cost (PJ/year) + + Returns: + Optimal point information + """ + total_cost = calculate_total_cost(df, lambda_cost) + opt_idx = np.argmin(total_cost) + + return { + 'index': opt_idx, + 'years': df['years'].iloc[opt_idx], + 'energy_PJ': df['energy_PJ'].iloc[opt_idx], + 'total_cost': total_cost[opt_idx], + 'elevator_fraction': df['elevator_fraction'].iloc[opt_idx], + 'lambda': lambda_cost, + } + + +def calculate_marginal_energy_saving(df: pd.DataFrame) -> np.ndarray: + """ + Calculate marginal energy saving rate: -dE/dT (PJ/year) + + This represents how much energy is saved per additional year of timeline. + """ + years = df['years'].values + energy = df['energy_PJ'].values + + # Use central difference for interior points + marginal = -np.gradient(energy, years) + + return marginal + + +def sensitivity_analysis( + df: pd.DataFrame, + lambda_range: np.ndarray +) -> pd.DataFrame: + """ + Perform sensitivity analysis on λ parameter + + Args: + df: Trade-off curve data + lambda_range: Array of λ values to test + + Returns: + DataFrame with optimal points for each λ + """ + results = [] + for lam in lambda_range: + opt = find_optimal_point(df, lam) + results.append({ + 'lambda_PJ_per_year': lam, + 'optimal_years': opt['years'], + 'optimal_energy_PJ': opt['energy_PJ'], + 'total_cost_PJ': opt['total_cost'], + 'elevator_fraction': opt['elevator_fraction'], + }) + + return pd.DataFrame(results) + + +# ============== Visualization Functions ============== + +def plot_lambda_analysis( + df: pd.DataFrame, + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_cost_analysis.png' +): + """ + Comprehensive visualization of λ time cost analysis + Focus on critical range λ = 400-600 PJ/year + """ + fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + + years = df['years'].values + energy = df['energy_PJ'].values + + # Key boundaries + T_min = years.min() # ~100.7 years (fastest) + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY # ~186 years (elevator only) + E_min = energy[years >= T_elev].min() if any(years >= T_elev) else energy.min() + + # ========== Plot 1: Trade-off Curve with λ Iso-cost Lines ========== + ax1 = axes[0, 0] + + # Main curve + ax1.plot(years, energy, 'b-', linewidth=2.5, label='Energy-Time Trade-off') + + # Mark key points + ax1.axvline(x=T_elev, color='green', linestyle='--', alpha=0.7, label=f'Elevator-only: {T_elev:.1f} years') + ax1.axvline(x=T_min, color='red', linestyle='--', alpha=0.7, label=f'Minimum time: {T_min:.1f} years') + + # Draw iso-cost lines for different λ (focus on 400-600 range) + lambda_values = [420, 480, 500, 550] + colors = ['#2ecc71', '#e74c3c', '#9b59b6', '#3498db'] + + for lam, color in zip(lambda_values, colors): + opt = find_optimal_point(df, lam) + # Iso-cost line: E + λT = const → E = const - λT + T_line = np.linspace(80, 220, 100) + E_line = opt['total_cost'] - lam * T_line + valid = (E_line > 0) & (E_line < 70000) + ax1.plot(T_line[valid], E_line[valid], '--', color=color, alpha=0.6, linewidth=1.5) + ax1.plot(opt['years'], opt['energy_PJ'], 'o', color=color, markersize=12, + markeredgecolor='black', markeredgewidth=1.5, + label=f'λ={lam}: T={opt["years"]:.1f}y, E={opt["energy_PJ"]:.0f}PJ') + + ax1.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax1.set_ylabel('Total Energy E (PJ)', fontsize=12) + ax1.set_title('Energy-Time Trade-off with λ Iso-cost Lines (λ=400-600)\n$J = E + λT$', fontsize=13) + ax1.legend(loc='upper right', fontsize=9) + ax1.grid(True, alpha=0.3) + ax1.set_xlim(95, 200) + ax1.set_ylim(10000, 65000) + + # ========== Plot 2: Marginal Energy Saving Rate ========== + ax2 = axes[0, 1] + + marginal = calculate_marginal_energy_saving(df) + + ax2.plot(years, marginal, 'r-', linewidth=2, label='Marginal Energy Saving -dE/dT') + ax2.axhline(y=0, color='black', linestyle='-', alpha=0.3) + + # Mark critical λ values in 400-600 range + for lam, color in zip([450, 480, 500, 550], ['#2ecc71', '#e74c3c', '#9b59b6', '#3498db']): + ax2.axhline(y=lam, color=color, linestyle='--', alpha=0.7, label=f'λ = {lam} PJ/year') + # Find intersection + intersect_idx = np.argmin(np.abs(marginal - lam)) + ax2.plot(years[intersect_idx], marginal[intersect_idx], 'o', color=color, markersize=8) + + ax2.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax2.set_ylabel('Marginal Energy Saving -dE/dT (PJ/year)', fontsize=12) + ax2.set_title('Marginal Analysis: Optimal Condition is -dE/dT = λ', fontsize=13) + ax2.legend(loc='upper right', fontsize=9) + ax2.grid(True, alpha=0.3) + ax2.set_xlim(95, 200) + ax2.set_ylim(350, 620) + + # ========== Plot 3: Sensitivity Analysis (400-600 range) ========== + ax3 = axes[1, 0] + + lambda_range = np.linspace(400, 600, 200) + sensitivity_df = sensitivity_analysis(df, lambda_range) + + # Plot optimal years vs λ + ax3.plot(sensitivity_df['lambda_PJ_per_year'], sensitivity_df['optimal_years'], + 'b-', linewidth=2.5, label='Optimal Timeline T*') + + # Mark key regions + ax3.axhline(y=T_elev, color='green', linestyle='--', alpha=0.7, label=f'Elevator-only: {T_elev:.1f}y') + ax3.axhline(y=T_min, color='red', linestyle='--', alpha=0.7, label=f'Min timeline: {T_min:.1f}y') + ax3.axhline(y=139, color='orange', linestyle=':', linewidth=2, alpha=0.8, label='Original knee: 139y') + + # Find λ corresponding to 139 years + idx_139 = np.argmin(np.abs(sensitivity_df['optimal_years'] - 139)) + if idx_139 < len(sensitivity_df): + lambda_139 = sensitivity_df['lambda_PJ_per_year'].iloc[idx_139] + ax3.axvline(x=lambda_139, color='orange', linestyle=':', linewidth=2, alpha=0.6) + ax3.scatter([lambda_139], [139], s=150, c='orange', marker='*', zorder=5, + edgecolors='black', linewidths=1.5, label=f'λ≈{lambda_139:.0f} for T*=139y') + + # Mark critical transition + ax3.axvline(x=480, color='purple', linestyle='--', alpha=0.5) + ax3.text(482, 175, 'Critical\nTransition', fontsize=9, color='purple') + + ax3.set_xlabel('Time Opportunity Cost λ (PJ/year)', fontsize=12) + ax3.set_ylabel('Optimal Timeline T* (years)', fontsize=12) + ax3.set_title('Sensitivity Analysis: Optimal Timeline vs λ (400-600 range)', fontsize=13) + ax3.legend(loc='upper right', fontsize=9) + ax3.grid(True, alpha=0.3) + ax3.set_xlim(400, 600) + ax3.set_ylim(95, 195) + + # ========== Plot 4: Total Cost Curves (400-600 range) ========== + ax4 = axes[1, 1] + + for lam, color in [(450, '#2ecc71'), (480, '#e74c3c'), (500, '#9b59b6'), (550, '#3498db')]: + total_cost = calculate_total_cost(df, lam) + ax4.plot(years, total_cost / 1000, color=color, linestyle='-', + linewidth=2, label=f'λ={lam} PJ/year') + + # Mark minimum + opt = find_optimal_point(df, lam) + ax4.plot(opt['years'], opt['total_cost'] / 1000, 'o', color=color, markersize=10, + markeredgecolor='black', markeredgewidth=1.5) + + ax4.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax4.set_ylabel('Total Cost J = E + λT (×10³ PJ)', fontsize=12) + ax4.set_title('Total Cost Function for λ = 400-600 PJ/year', fontsize=13) + ax4.legend(loc='upper right', fontsize=10) + ax4.grid(True, alpha=0.3) + ax4.set_xlim(95, 200) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"Lambda analysis plot saved to: {save_path}") + + return fig + + +def plot_decision_recommendation( + df: pd.DataFrame, + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_decision_map.png' +): + """ + Decision map showing optimal choice based on λ preference + """ + fig, ax = plt.subplots(figsize=(12, 8)) + + years = df['years'].values + energy = df['energy_PJ'].values + + # Main trade-off curve + ax.plot(years, energy, 'b-', linewidth=3, label='Feasible Trade-off Curve') + + # Key boundaries + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY + T_min = years.min() + + # Shade decision regions + # Region 1: Low λ (cost priority) → longer timeline + ax.axvspan(160, 190, alpha=0.2, color='green', label='Low λ (<150): Cost Priority') + # Region 2: Medium λ (balanced) → middle ground + ax.axvspan(130, 160, alpha=0.2, color='yellow', label='Medium λ (150-250): Balanced') + # Region 3: High λ (time priority) → shorter timeline + ax.axvspan(100, 130, alpha=0.2, color='red', label='High λ (>250): Time Priority') + + # Mark specific strategy points + strategies = [ + {'name': 'A: Cost-Prioritized', 'years': 186, 'lambda': 0, 'color': 'green'}, + {'name': 'C: Balanced (λ≈200)', 'years': 139, 'lambda': 200, 'color': 'orange'}, + {'name': 'B: Time-Prioritized', 'years': 101, 'lambda': 500, 'color': 'red'}, + ] + + for s in strategies: + idx = np.argmin(np.abs(years - s['years'])) + ax.plot(years[idx], energy[idx], 'o', color=s['color'], markersize=15, + markeredgecolor='black', markeredgewidth=2) + ax.annotate(s['name'], (years[idx], energy[idx]), + textcoords="offset points", xytext=(10, 10), fontsize=11, + fontweight='bold', color=s['color']) + + # Add decision guidance text + textstr = '\n'.join([ + 'Decision Guidance:', + '─────────────────', + 'λ < 150 PJ/year → Strategy A', + ' (Long-term cost efficiency)', + '', + '150 ≤ λ ≤ 250 → Strategy C', + ' (Balanced trade-off)', + '', + 'λ > 250 PJ/year → Strategy B', + ' (Time-critical mission)', + ]) + props = dict(boxstyle='round', facecolor='wheat', alpha=0.8) + ax.text(0.02, 0.98, textstr, transform=ax.transAxes, fontsize=10, + verticalalignment='top', bbox=props, family='monospace') + + ax.set_xlabel('Construction Timeline T (years)', fontsize=13) + ax.set_ylabel('Total Energy E (PJ)', fontsize=13) + ax.set_title('Decision Map: Optimal Strategy Selection Based on Time Opportunity Cost λ', fontsize=14) + ax.legend(loc='upper right', fontsize=10) + ax.grid(True, alpha=0.3) + ax.set_xlim(95, 200) + ax.set_ylim(10000, 65000) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"Decision map saved to: {save_path}") + + return fig + + +# ============== Critical Point Analysis ============== + +def analyze_curve_structure(df: pd.DataFrame) -> Dict: + """ + Analyze the structure of the trade-off curve to understand + why certain λ values lead to specific optimal points. + """ + years = df['years'].values + energy = df['energy_PJ'].values + + # Calculate marginal rates + marginal = -np.gradient(energy, years) + + # Find the elevator-only boundary + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY + idx_elev = np.argmin(np.abs(years - T_elev)) + + # Analyze marginal rate distribution + # Region 1: T > T_elev (pure elevator, marginal ≈ 0) + # Region 2: T < T_elev (need rockets, marginal > 0) + + # Find critical points where marginal rate changes significantly + marginal_near_elev = marginal[idx_elev - 5:idx_elev + 5] + marginal_at_139 = marginal[np.argmin(np.abs(years - 139))] + marginal_at_101 = marginal[np.argmin(np.abs(years - 101))] + + return { + 'T_elev': T_elev, + 'idx_elev': idx_elev, + 'marginal_at_elev': marginal[idx_elev], + 'marginal_at_139': marginal_at_139, + 'marginal_at_101': marginal_at_101, + 'energy_at_elev': energy[idx_elev], + 'energy_at_139': energy[np.argmin(np.abs(years - 139))], + 'energy_at_101': energy[np.argmin(np.abs(years - 101))], + } + + +def find_critical_lambda(df: pd.DataFrame) -> Dict: + """ + Find the critical λ values where optimal point transitions occur. + """ + years = df['years'].values + energy = df['energy_PJ'].values + + # Dense lambda scan + lambda_range = np.linspace(1, 1000, 2000) + + transitions = [] + prev_years = None + + for lam in lambda_range: + opt = find_optimal_point(df, lam) + if prev_years is not None and abs(opt['years'] - prev_years) > 5: + transitions.append({ + 'lambda': lam, + 'from_years': prev_years, + 'to_years': opt['years'], + }) + prev_years = opt['years'] + + return transitions + + +def plot_comprehensive_analysis( + df: pd.DataFrame, + save_path: str = '/Volumes/Files/code/mm/20260130_b/p1/lambda_comprehensive.png' +): + """ + Comprehensive plot showing: + 1. Trade-off curve with marginal rates + 2. Critical λ transitions + 3. Decision regions + """ + fig = plt.figure(figsize=(16, 14)) + + years = df['years'].values + energy = df['energy_PJ'].values + marginal = calculate_marginal_energy_saving(df) + + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY + T_min = years.min() + + # ========== Plot 1: Trade-off curve with annotations ========== + ax1 = fig.add_subplot(2, 2, 1) + + ax1.plot(years, energy / 1000, 'b-', linewidth=2.5, label='Trade-off Curve') + + # Mark key points + key_points = [ + (T_min, 'Minimum Time\n(~101 years)', 'red'), + (139, 'Original Knee\n(139 years)', 'orange'), + (T_elev, 'Elevator-Only\n(~186 years)', 'green'), + ] + + for t, label, color in key_points: + idx = np.argmin(np.abs(years - t)) + ax1.plot(years[idx], energy[idx] / 1000, 'o', color=color, markersize=12, + markeredgecolor='black', markeredgewidth=2, zorder=5) + ax1.annotate(label, (years[idx], energy[idx] / 1000), + textcoords="offset points", xytext=(10, 10), fontsize=10, + color=color, fontweight='bold') + + ax1.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax1.set_ylabel('Total Energy E (×10³ PJ)', fontsize=12) + ax1.set_title('Energy-Time Trade-off Curve', fontsize=14) + ax1.grid(True, alpha=0.3) + ax1.set_xlim(95, 200) + ax1.legend(loc='upper right') + + # ========== Plot 2: Marginal Rate Analysis ========== + ax2 = fig.add_subplot(2, 2, 2) + + ax2.plot(years, marginal, 'r-', linewidth=2, label='Marginal Saving Rate') + ax2.fill_between(years, 0, marginal, alpha=0.3, color='red') + + # Mark critical thresholds + ax2.axhline(y=480, color='purple', linestyle='--', linewidth=2, + label='Critical λ ≈ 480 PJ/year') + ax2.axvline(x=T_elev, color='green', linestyle=':', alpha=0.7) + + # Annotate the jump at elevator boundary + ax2.annotate('Marginal rate jumps\nat elevator capacity limit', + xy=(T_elev, marginal[np.argmin(np.abs(years - T_elev))]), + xytext=(150, 400), fontsize=10, + arrowprops=dict(arrowstyle='->', color='black')) + + ax2.set_xlabel('Construction Timeline T (years)', fontsize=12) + ax2.set_ylabel('Marginal Energy Saving -dE/dT (PJ/year)', fontsize=12) + ax2.set_title('Marginal Analysis: Why 186 years is optimal for most λ', fontsize=14) + ax2.grid(True, alpha=0.3) + ax2.set_xlim(95, 200) + ax2.set_ylim(-50, 600) + ax2.legend(loc='upper right') + + # ========== Plot 3: λ Sensitivity with Phase Transitions (400-600 focus) ========== + ax3 = fig.add_subplot(2, 2, 3) + + lambda_range = np.linspace(400, 600, 200) + opt_years = [] + for lam in lambda_range: + opt = find_optimal_point(df, lam) + opt_years.append(opt['years']) + + ax3.plot(lambda_range, opt_years, 'b-', linewidth=2.5) + + # Shade phases + ax3.axhspan(180, 190, alpha=0.3, color='green', label='Phase 1: Elevator-Only (λ < 480)') + ax3.axhspan(100, 145, alpha=0.3, color='red', label='Phase 2: Hybrid (λ > 480)') + + # Mark critical λ + ax3.axvline(x=480, color='purple', linestyle='--', linewidth=2) + ax3.annotate('Critical Transition\nλ ≈ 480 PJ/year', + xy=(480, 160), fontsize=11, color='purple', fontweight='bold', + ha='center') + + # Mark 139 year point + ax3.axhline(y=139, color='orange', linestyle=':', linewidth=2, alpha=0.8) + ax3.scatter([500], [139], s=200, c='orange', marker='*', zorder=5, + edgecolors='black', linewidths=2, label='T*=139y at λ≈500') + + ax3.set_xlabel('Time Opportunity Cost λ (PJ/year)', fontsize=12) + ax3.set_ylabel('Optimal Timeline T* (years)', fontsize=12) + ax3.set_title('Phase Transition in Optimal Strategy (λ=400-600)', fontsize=14) + ax3.grid(True, alpha=0.3) + ax3.set_xlim(400, 600) + ax3.set_ylim(95, 195) + ax3.legend(loc='upper right') + + # ========== Plot 4: Decision Summary Table ========== + ax4 = fig.add_subplot(2, 2, 4) + ax4.axis('off') + + # Create summary table + summary_text = """ + ┌─────────────────────────────────────────────────────────────────┐ + │ KEY FINDINGS FROM λ COST ANALYSIS │ + ├─────────────────────────────────────────────────────────────────┤ + │ │ + │ 1. CURVE STRUCTURE │ + │ • Sharp discontinuity at T = 186 years (elevator capacity) │ + │ • Marginal rate jumps from ~0 to ~480 PJ/year at boundary │ + │ │ + │ 2. OPTIMAL POINT SELECTION │ + │ • λ < 480 PJ/year → T* = 186 years (elevator-only) │ + │ • λ ≈ 500 PJ/year → T* = 139 years (original knee) │ + │ • λ > 600 PJ/year → T* → 101 years (time-priority) │ + │ │ + │ 3. IMPLICATIONS FOR THE 139-YEAR KNEE POINT │ + │ • Requires implicit assumption: λ ≈ 500 PJ/year │ + │ • This means: 1 year delay costs ~500 PJ opportunity cost │ + │ • Equivalent to: ~0.5% of total elevator energy per year │ + │ │ + │ 4. RECOMMENDATION │ + │ • Either justify λ ≈ 500 PJ/year with physical reasoning │ + │ • Or acknowledge 186 years as cost-optimal baseline │ + │ • Present 139 years as a time-constrained scenario │ + │ │ + └─────────────────────────────────────────────────────────────────┘ + """ + + ax4.text(0.05, 0.95, summary_text, transform=ax4.transAxes, + fontsize=11, verticalalignment='top', family='monospace', + bbox=dict(boxstyle='round', facecolor='lightyellow', alpha=0.8)) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"Comprehensive analysis saved to: {save_path}") + + return fig + + +# ============== Main Analysis ============== + +def main(): + print("=" * 70) + print("Lambda Time Cost Analysis for Moon Colony Logistics") + print("=" * 70) + + # Generate trade-off curve + print("\n[1] Generating Energy-Time trade-off curve...") + df = generate_tradeoff_curve(year_min=100, year_max=220, num_points=500) + print(f" Generated {len(df)} data points") + + # Key statistics + T_min = df['years'].min() + T_max = df['years'].max() + E_min = df['energy_PJ'].min() + E_max = df['energy_PJ'].max() + T_elev = TOTAL_PAYLOAD / TOTAL_ELEVATOR_CAPACITY + + print(f"\n[2] Trade-off Curve Statistics:") + print(f" Timeline range: {T_min:.1f} - {T_max:.1f} years") + print(f" Energy range: {E_min:.0f} - {E_max:.0f} PJ") + print(f" Elevator-only timeline: {T_elev:.1f} years") + + # Curve structure analysis + print("\n[3] Curve Structure Analysis:") + structure = analyze_curve_structure(df) + print(f" At elevator boundary (T={structure['T_elev']:.1f}y):") + print(f" - Energy: {structure['energy_at_elev']:.0f} PJ") + print(f" - Marginal rate: {structure['marginal_at_elev']:.1f} PJ/year") + print(f" At T=139 years:") + print(f" - Energy: {structure['energy_at_139']:.0f} PJ") + print(f" - Marginal rate: {structure['marginal_at_139']:.1f} PJ/year") + print(f" At T=101 years:") + print(f" - Energy: {structure['energy_at_101']:.0f} PJ") + print(f" - Marginal rate: {structure['marginal_at_101']:.1f} PJ/year") + + # Find critical transitions + print("\n[4] Critical λ Transitions:") + transitions = find_critical_lambda(df) + for t in transitions: + print(f" λ ≈ {t['lambda']:.0f} PJ/year: T* jumps from {t['from_years']:.0f}y to {t['to_years']:.0f}y") + + # Sensitivity analysis + print("\n[5] Sensitivity Analysis Results:") + print(" " + "-" * 55) + print(f" {'λ (PJ/year)':<15} {'Optimal T (years)':<20} {'Energy (PJ)':<15}") + print(" " + "-" * 55) + + test_lambdas = [100, 200, 300, 400, 450, 480, 500, 550, 600] + sensitivity_results = [] + + for lam in test_lambdas: + opt = find_optimal_point(df, lam) + print(f" {lam:<15.0f} {opt['years']:<20.1f} {opt['energy_PJ']:<15.0f}") + sensitivity_results.append(opt) + + # Find λ that gives 139 years + print("\n[6] Original Knee Point Analysis (139 years):") + lambda_for_139 = None + for lam in np.linspace(400, 600, 1000): + opt = find_optimal_point(df, lam) + if abs(opt['years'] - 139) < 1: + lambda_for_139 = lam + print(f" λ ≈ {lam:.0f} PJ/year corresponds to T* ≈ 139 years") + break + + if lambda_for_139: + print(f"\n INTERPRETATION:") + print(f" To justify 139-year knee point, one must argue that:") + print(f" • Each year of delay costs ~{lambda_for_139:.0f} PJ in opportunity") + print(f" • This is {lambda_for_139/E_min*100:.1f}% of minimum total energy per year") + print(f" • Over 47 years (139→186), this amounts to {lambda_for_139*47:.0f} PJ") + + # Generate plots + print("\n[7] Generating visualization plots...") + plot_lambda_analysis(df) + plot_decision_recommendation(df) + plot_comprehensive_analysis(df) + + # Save sensitivity data + sensitivity_df = sensitivity_analysis(df, np.linspace(50, 600, 120)) + sensitivity_df.to_csv('/Volumes/Files/code/mm/20260130_b/p1/lambda_sensitivity.csv', index=False) + print(" Data saved to: lambda_sensitivity.csv") + + # Paper modification recommendations + print("\n" + "=" * 70) + print("RECOMMENDATIONS FOR PAPER MODIFICATION") + print("=" * 70) + print(""" + 1. REFRAME THE OPTIMIZATION PROBLEM + Current: "Multi-objective Pareto optimization" + Suggested: "Constrained optimization with time-cost trade-off" + + 2. INTRODUCE λ AS DECISION PARAMETER + Add equation: J = E_total + λ × T + where λ represents "time opportunity cost" (PJ/year) + + 3. JUSTIFY THE KNEE POINT SELECTION + Option A: Argue λ ≈ 480-500 PJ/year is reasonable because: + - Delayed lunar resource extraction + - Extended Earth-side operational costs + - Strategic/geopolitical value of early completion + + Option B: Present multiple scenarios: + - "Cost-optimal" (λ < 480): T* = 186 years + - "Balanced" (λ ≈ 500): T* = 139 years + - "Time-critical" (λ > 600): T* → 101 years + + 4. ADD SENSITIVITY ANALYSIS FIGURE + Show how optimal T* changes with λ (Figure generated) + + 5. ACKNOWLEDGE THE DISCONTINUITY + Note that the trade-off curve has a sharp transition at + T = 186 years due to elevator capacity constraints + """) + + print("=" * 70) + print("Analysis Complete!") + print("=" * 70) + + return df, sensitivity_results + + +if __name__ == "__main__": + df, results = main() diff --git a/p1/richards_curve_1984.py b/p1/richards_curve_1984.py index 5dec4d9..d4c246a 100644 --- a/p1/richards_curve_1984.py +++ b/p1/richards_curve_1984.py @@ -1,183 +1,183 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Richards S-Curve Fit for 1984-2025 Data - -Fits and visualizes the Richards growth model to rocket launch data -starting from 1984. -""" - -import pandas as pd -import numpy as np -from scipy.optimize import curve_fit -import matplotlib -matplotlib.use('Agg') -import matplotlib.pyplot as plt -import warnings -warnings.filterwarnings('ignore') - -plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans'] -plt.rcParams['axes.unicode_minus'] = False - - -def richards(t, K, r, t0, v): - """ - Richards curve (generalized logistic model) - - N(t) = K / (1 + exp(-r*(t - t0)))^(1/v) - """ - exp_term = np.exp(-r * (t - t0)) - exp_term = np.clip(exp_term, 1e-10, 1e10) - return K / np.power(1 + exp_term, 1/v) - - -def load_data(filepath="rocket_launch_counts.csv"): - """Load rocket launch data""" - df = pd.read_csv(filepath) - df = df.rename(columns={"YDate": "year", "Total": "launches"}) - df["year"] = pd.to_numeric(df["year"], errors="coerce") - df["launches"] = pd.to_numeric(df["launches"], errors="coerce") - df = df.dropna(subset=["year", "launches"]) - df = df[(df["year"] >= 1957) & (df["year"] <= 2025)] - df = df.astype({"year": int, "launches": int}) - df = df.sort_values("year").reset_index(drop=True) - return df - - -def fit_richards(years, launches, base_year=1984): - """Fit Richards model to data""" - t = (years - base_year).astype(float) - - # Initial parameters and bounds (unconstrained K) - p0 = [5000.0, 0.1, 40.0, 2.0] - bounds = ([500, 0.005, 10, 0.2], [100000, 1.0, 150, 10.0]) - - popt, pcov = curve_fit(richards, t, launches, p0=p0, bounds=bounds, maxfev=100000) - perr = np.sqrt(np.diag(pcov)) - - # Calculate R² - y_pred = richards(t, *popt) - ss_res = np.sum((launches - y_pred) ** 2) - ss_tot = np.sum((launches - np.mean(launches)) ** 2) - r_squared = 1 - (ss_res / ss_tot) - - return popt, perr, r_squared - - -def main(): - print("=" * 60) - print("Richards S-Curve Fit (1984-2025)") - print("=" * 60) - - # Load data - df = load_data() - - # Filter 1984-2025 - start_year = 1984 - data = df[(df["year"] >= start_year) & (df["year"] <= 2025)].copy() - years = data["year"].values - launches = data["launches"].values - - print(f"Data range: {start_year} - 2025") - print(f"Data points: {len(data)}") - - # Fit model - popt, perr, r_squared = fit_richards(years, launches, base_year=start_year) - K, r, t0, v = popt - - print(f"\nFitted Parameters:") - print(f" K (carrying capacity) = {K:.0f} launches/year") - print(f" r (growth rate) = {r:.4f}") - print(f" t0 (inflection point) = {start_year + t0:.1f}") - print(f" v (shape parameter) = {v:.3f}") - print(f" R² = {r_squared:.4f}") - - # Physical limit - physical_max = 3650 - print(f"\nPhysical limit: {physical_max} (10 sites × 365 days)") - print(f"K / Physical limit = {K/physical_max:.2f}x") - - # ========== Create Visualization ========== - fig, ax = plt.subplots(figsize=(12, 7)) - - # Historical data points - ax.scatter(years, launches, color='#2C3E50', s=80, alpha=0.8, - label='Historical Data (1984-2025)', zorder=3, edgecolor='white', linewidth=0.5) - - # Generate smooth S-curve - years_smooth = np.linspace(start_year, 2100, 500) - t_smooth = years_smooth - start_year - pred_smooth = richards(t_smooth, *popt) - - # S-curve prediction - ax.plot(years_smooth, pred_smooth, color='#27AE60', lw=3, - label=f'Richards Model (K={K:.0f}, R²={r_squared:.3f})', zorder=2) - - # Confidence band (approximate using parameter errors) - K_low = max(500, K - 2*perr[0]) - K_high = K + 2*perr[0] - pred_low = richards(t_smooth, K_low, r, t0, v) - pred_high = richards(t_smooth, K_high, r, t0, v) - ax.fill_between(years_smooth, pred_low, pred_high, color='#27AE60', alpha=0.15, - label='95% Confidence Band') - - # Physical limit line - ax.axhline(physical_max, color='#E74C3C', ls='--', lw=2.5, - label=f'Physical Limit: {physical_max} (1/site/day)') - - # Mark inflection point - inflection_year = start_year + t0 - inflection_value = K / (v + 1) ** (1/v) - ax.scatter([inflection_year], [inflection_value], color='#F39C12', s=150, - marker='*', zorder=5, label=f'Inflection Point ({inflection_year:.0f})') - - # Mark key years - ax.axvline(2025, color='gray', ls=':', lw=1.5, alpha=0.7) - ax.axvline(2050, color='#3498DB', ls=':', lw=2, alpha=0.8) - ax.text(2026, K*0.95, '2025\n(Now)', fontsize=10, color='gray') - ax.text(2051, K*0.85, '2050\n(Target)', fontsize=10, color='#3498DB') - - # Prediction for 2050 - t_2050 = 2050 - start_year - pred_2050 = richards(t_2050, *popt) - ax.scatter([2050], [pred_2050], color='#3498DB', s=100, marker='D', zorder=4) - ax.annotate(f'{pred_2050:.0f}', xy=(2050, pred_2050), xytext=(2055, pred_2050-300), - fontsize=10, color='#3498DB', fontweight='bold') - - # Formatting - ax.set_xlabel('Year', fontsize=12) - ax.set_ylabel('Annual Launches', fontsize=12) - ax.set_title('Richards S-Curve Model Fit (1984-2025 Data)\nRocket Launch Capacity Projection', - fontsize=14, fontweight='bold') - ax.legend(loc='upper left', fontsize=10) - ax.grid(True, alpha=0.3) - ax.set_xlim(1982, 2100) - ax.set_ylim(0, K * 1.15) - - # Add text box with model info - textstr = f'''Model: N(t) = K / (1 + e^(-r(t-t₀)))^(1/v) - -Data Window: {start_year}-2025 ({len(data)} points) -K = {K:.0f} launches/year -r = {r:.4f} -t₀ = {start_year + t0:.1f} -v = {v:.3f} -R² = {r_squared:.4f} - -Note: Physical limit (3,650) shown as -dashed red line''' - - props = dict(boxstyle='round', facecolor='wheat', alpha=0.8) - ax.text(0.98, 0.35, textstr, transform=ax.transAxes, fontsize=9, - verticalalignment='top', horizontalalignment='right', bbox=props, family='monospace') - - plt.tight_layout() - plt.savefig('richards_curve_1984.png', dpi=150, bbox_inches='tight') - plt.close() - - print("\nPlot saved: richards_curve_1984.png") - print("=" * 60) - - -if __name__ == "__main__": - main() +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Richards S-Curve Fit for 1984-2025 Data + +Fits and visualizes the Richards growth model to rocket launch data +starting from 1984. +""" + +import pandas as pd +import numpy as np +from scipy.optimize import curve_fit +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +import warnings +warnings.filterwarnings('ignore') + +plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans'] +plt.rcParams['axes.unicode_minus'] = False + + +def richards(t, K, r, t0, v): + """ + Richards curve (generalized logistic model) + + N(t) = K / (1 + exp(-r*(t - t0)))^(1/v) + """ + exp_term = np.exp(-r * (t - t0)) + exp_term = np.clip(exp_term, 1e-10, 1e10) + return K / np.power(1 + exp_term, 1/v) + + +def load_data(filepath="rocket_launch_counts.csv"): + """Load rocket launch data""" + df = pd.read_csv(filepath) + df = df.rename(columns={"YDate": "year", "Total": "launches"}) + df["year"] = pd.to_numeric(df["year"], errors="coerce") + df["launches"] = pd.to_numeric(df["launches"], errors="coerce") + df = df.dropna(subset=["year", "launches"]) + df = df[(df["year"] >= 1957) & (df["year"] <= 2025)] + df = df.astype({"year": int, "launches": int}) + df = df.sort_values("year").reset_index(drop=True) + return df + + +def fit_richards(years, launches, base_year=1984): + """Fit Richards model to data""" + t = (years - base_year).astype(float) + + # Initial parameters and bounds (unconstrained K) + p0 = [5000.0, 0.1, 40.0, 2.0] + bounds = ([500, 0.005, 10, 0.2], [100000, 1.0, 150, 10.0]) + + popt, pcov = curve_fit(richards, t, launches, p0=p0, bounds=bounds, maxfev=100000) + perr = np.sqrt(np.diag(pcov)) + + # Calculate R² + y_pred = richards(t, *popt) + ss_res = np.sum((launches - y_pred) ** 2) + ss_tot = np.sum((launches - np.mean(launches)) ** 2) + r_squared = 1 - (ss_res / ss_tot) + + return popt, perr, r_squared + + +def main(): + print("=" * 60) + print("Richards S-Curve Fit (1984-2025)") + print("=" * 60) + + # Load data + df = load_data() + + # Filter 1984-2025 + start_year = 1984 + data = df[(df["year"] >= start_year) & (df["year"] <= 2025)].copy() + years = data["year"].values + launches = data["launches"].values + + print(f"Data range: {start_year} - 2025") + print(f"Data points: {len(data)}") + + # Fit model + popt, perr, r_squared = fit_richards(years, launches, base_year=start_year) + K, r, t0, v = popt + + print(f"\nFitted Parameters:") + print(f" K (carrying capacity) = {K:.0f} launches/year") + print(f" r (growth rate) = {r:.4f}") + print(f" t0 (inflection point) = {start_year + t0:.1f}") + print(f" v (shape parameter) = {v:.3f}") + print(f" R² = {r_squared:.4f}") + + # Physical limit + physical_max = 3650 + print(f"\nPhysical limit: {physical_max} (10 sites × 365 days)") + print(f"K / Physical limit = {K/physical_max:.2f}x") + + # ========== Create Visualization ========== + fig, ax = plt.subplots(figsize=(12, 7)) + + # Historical data points + ax.scatter(years, launches, color='#2C3E50', s=80, alpha=0.8, + label='Historical Data (1984-2025)', zorder=3, edgecolor='white', linewidth=0.5) + + # Generate smooth S-curve + years_smooth = np.linspace(start_year, 2100, 500) + t_smooth = years_smooth - start_year + pred_smooth = richards(t_smooth, *popt) + + # S-curve prediction + ax.plot(years_smooth, pred_smooth, color='#27AE60', lw=3, + label=f'Richards Model (K={K:.0f}, R²={r_squared:.3f})', zorder=2) + + # Confidence band (approximate using parameter errors) + K_low = max(500, K - 2*perr[0]) + K_high = K + 2*perr[0] + pred_low = richards(t_smooth, K_low, r, t0, v) + pred_high = richards(t_smooth, K_high, r, t0, v) + ax.fill_between(years_smooth, pred_low, pred_high, color='#27AE60', alpha=0.15, + label='95% Confidence Band') + + # Physical limit line + ax.axhline(physical_max, color='#E74C3C', ls='--', lw=2.5, + label=f'Physical Limit: {physical_max} (1/site/day)') + + # Mark inflection point + inflection_year = start_year + t0 + inflection_value = K / (v + 1) ** (1/v) + ax.scatter([inflection_year], [inflection_value], color='#F39C12', s=150, + marker='*', zorder=5, label=f'Inflection Point ({inflection_year:.0f})') + + # Mark key years + ax.axvline(2025, color='gray', ls=':', lw=1.5, alpha=0.7) + ax.axvline(2050, color='#3498DB', ls=':', lw=2, alpha=0.8) + ax.text(2026, K*0.95, '2025\n(Now)', fontsize=10, color='gray') + ax.text(2051, K*0.85, '2050\n(Target)', fontsize=10, color='#3498DB') + + # Prediction for 2050 + t_2050 = 2050 - start_year + pred_2050 = richards(t_2050, *popt) + ax.scatter([2050], [pred_2050], color='#3498DB', s=100, marker='D', zorder=4) + ax.annotate(f'{pred_2050:.0f}', xy=(2050, pred_2050), xytext=(2055, pred_2050-300), + fontsize=10, color='#3498DB', fontweight='bold') + + # Formatting + ax.set_xlabel('Year', fontsize=12) + ax.set_ylabel('Annual Launches', fontsize=12) + ax.set_title('Richards S-Curve Model Fit (1984-2025 Data)\nRocket Launch Capacity Projection', + fontsize=14, fontweight='bold') + ax.legend(loc='upper left', fontsize=10) + ax.grid(True, alpha=0.3) + ax.set_xlim(1982, 2100) + ax.set_ylim(0, K * 1.15) + + # Add text box with model info + textstr = f'''Model: N(t) = K / (1 + e^(-r(t-t₀)))^(1/v) + +Data Window: {start_year}-2025 ({len(data)} points) +K = {K:.0f} launches/year +r = {r:.4f} +t₀ = {start_year + t0:.1f} +v = {v:.3f} +R² = {r_squared:.4f} + +Note: Physical limit (3,650) shown as +dashed red line''' + + props = dict(boxstyle='round', facecolor='wheat', alpha=0.8) + ax.text(0.98, 0.35, textstr, transform=ax.transAxes, fontsize=9, + verticalalignment='top', horizontalalignment='right', bbox=props, family='monospace') + + plt.tight_layout() + plt.savefig('richards_curve_1984.png', dpi=150, bbox_inches='tight') + plt.close() + + print("\nPlot saved: richards_curve_1984.png") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/p3/water_sensitivity_analysis.py b/p3/water_sensitivity_analysis.py index 2032be5..0af7c1b 100644 --- a/p3/water_sensitivity_analysis.py +++ b/p3/water_sensitivity_analysis.py @@ -1,1500 +1,1500 @@ -""" -任务三:月球殖民地水需求灵敏度分析 - -Water Supply Sensitivity Analysis for Moon Colony - -分析参数: -1. 水回收效率 (η): 70%-95% -2. 舒适度因子 (α): 1-300 -3. 医疗紧急参数: 患病率、每次用水量、置信水平 -4. 人口规模 (N): ±20% -5. 安全缓冲天数: 15-60天 - -输出: -- 单参数灵敏度分析图 -- 多参数交互分析 (Tornado图) -- 最坏情况分析 (Stress Test) -""" - -import numpy as np -import matplotlib -matplotlib.use('Agg') -import matplotlib.pyplot as plt -from matplotlib import rcParams -from scipy import stats -from dataclasses import dataclass, field -from typing import List, Dict, Tuple, Optional -import pandas as pd -from mpl_toolkits.mplot3d import Axes3D -import warnings -warnings.filterwarnings('ignore') - -# 设置字体 -rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans', 'SimHei'] -rcParams['axes.unicode_minus'] = False -plt.style.use('seaborn-v0_8-whitegrid') - -# ============== 物理常数 ============== -G0 = 9.81 # m/s² -OMEGA_EARTH = 7.27e-5 # rad/s -R_EARTH = 6.371e6 # m - -# ============== 基准参数 ============== -@dataclass -class BaselineParameters: - """基准参数配置""" - # 人口 - population: int = 100_000 - - # 水需求参数 - survival_water: float = 2.5 # L/人/天 - hygiene_water_base: float = 0.4 # L/人/天 (乘以α) - comfort_factor: float = 50.0 # 舒适度系数 - - # 医疗参数 - medical_water_per_event: float = 5.0 # L/次 - sickness_rate: float = 0.02 # 每日患病率 (2%) - confidence_level: float = 0.99 # 置信水平 - - # 回收和缓冲 - recycle_rate: float = 0.90 # 水循环回收率 - safety_buffer_days: int = 30 # 安全缓冲天数 - - # 运输参数 - elevator_capacity_per_year: float = 179_000 # 吨/年/部 - num_elevators: int = 3 - elevator_specific_energy: float = 157.2e9 # J/吨 - - @property - def total_elevator_capacity(self) -> float: - return self.num_elevators * self.elevator_capacity_per_year - - @property - def daily_elevator_capacity(self) -> float: - return self.total_elevator_capacity / 365 - - -# ============== 水需求计算函数 ============== - -def calculate_water_demand( - population: int, - survival_water: float, - hygiene_water_base: float, - comfort_factor: float, - medical_water_per_event: float, - sickness_rate: float, - confidence_level: float, - recycle_rate: float, - safety_buffer_days: int -) -> Dict: - """ - 计算水需求 - - 返回包含各项水需求指标的字典 - """ - # 每人每日用水 - daily_per_person = survival_water + hygiene_water_base * comfort_factor - - # 每日循环用水量 (吨) - daily_circulation = population * daily_per_person / 1000 - - # 医疗用水计算 (使用正态近似) - # 每日患病人数期望和标准差 - n = population - p = sickness_rate - mu = n * p - sigma = np.sqrt(n * p * (1 - p)) - - # 给定置信水平的Z值 - z = stats.norm.ppf(confidence_level) - - # 峰值医疗需求 (99%置信) - peak_medical_events = mu + z * sigma - daily_medical = peak_medical_events * medical_water_per_event / 1000 # 吨 - - # 平均医疗需求 - mean_medical = mu * medical_water_per_event / 1000 # 吨 - - # 每日循环损耗 (需从地球补充) - daily_circulation_loss = daily_circulation * (1 - recycle_rate) - - # 每日总补充量 (损耗 + 医疗) - daily_supply = daily_circulation_loss + mean_medical - - # 每月补充量 - monthly_supply = daily_supply * 30 - - # 年补充量 - annual_supply = daily_supply * 365 - - # 水库初始存量 (支撑单日循环) - reservoir = daily_circulation - - # 安全缓冲 (峰值医疗 + 损耗) - daily_peak_supply = daily_circulation_loss + daily_medical - safety_buffer = daily_peak_supply * safety_buffer_days - - # 首批运输量 = 水库 + 安全缓冲 - initial_transport = reservoir + safety_buffer - - return { - 'population': population, - 'comfort_factor': comfort_factor, - 'recycle_rate': recycle_rate, - 'sickness_rate': sickness_rate, - 'confidence_level': confidence_level, - 'safety_buffer_days': safety_buffer_days, - - 'daily_per_person_liters': daily_per_person, - 'daily_circulation_tons': daily_circulation, - 'daily_medical_tons': daily_medical, - 'mean_medical_tons': mean_medical, - 'daily_circulation_loss_tons': daily_circulation_loss, - 'daily_supply_tons': daily_supply, - 'monthly_supply_tons': monthly_supply, - 'annual_supply_tons': annual_supply, - 'reservoir_tons': reservoir, - 'safety_buffer_tons': safety_buffer, - 'initial_transport_tons': initial_transport, - } - - -def calculate_transport_metrics( - water_demand: Dict, - daily_capacity: float, - specific_energy: float -) -> Dict: - """计算运输指标""" - initial_tons = water_demand['initial_transport_tons'] - monthly_tons = water_demand['monthly_supply_tons'] - annual_tons = water_demand['annual_supply_tons'] - - # 首批运输 - initial_days = initial_tons / daily_capacity - initial_energy_pj = initial_tons * specific_energy / 1e15 - - # 每月补充 - monthly_days = monthly_tons / daily_capacity - monthly_energy_pj = monthly_tons * specific_energy / 1e15 - - # 年度 - annual_days = annual_tons / daily_capacity - annual_energy_pj = annual_tons * specific_energy / 1e15 - - return { - 'initial_days': initial_days, - 'initial_energy_pj': initial_energy_pj, - 'monthly_days': monthly_days, - 'monthly_energy_pj': monthly_energy_pj, - 'annual_days': annual_days, - 'annual_energy_pj': annual_energy_pj, - 'annual_tons': annual_tons, - } - - -# ============== 灵敏度分析函数 ============== - -def sensitivity_recycle_rate(baseline: BaselineParameters, save_dir: str): - """ - 水回收效率灵敏度分析 - η: 70% - 95% - """ - print("分析水回收效率灵敏度...") - - recycle_rates = np.linspace(0.70, 0.95, 26) - - results = { - 'recycle_rate': [], - 'daily_supply': [], - 'annual_supply': [], - 'annual_energy_pj': [], - 'capacity_ratio': [], # 占电梯年运力比例 - } - - for eta in recycle_rates: - demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=baseline.comfort_factor, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=eta, - safety_buffer_days=baseline.safety_buffer_days - ) - - transport = calculate_transport_metrics( - demand, - baseline.daily_elevator_capacity, - baseline.elevator_specific_energy - ) - - results['recycle_rate'].append(eta * 100) - results['daily_supply'].append(demand['daily_supply_tons']) - results['annual_supply'].append(demand['annual_supply_tons']) - results['annual_energy_pj'].append(transport['annual_energy_pj']) - results['capacity_ratio'].append(demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100) - - # 绘图 - fig, axes = plt.subplots(2, 2, figsize=(14, 12)) - - # 图1: 日补充量 - ax = axes[0, 0] - ax.plot(results['recycle_rate'], results['daily_supply'], 'b-', linewidth=2, marker='o', markersize=4) - ax.axvline(x=90, color='r', linestyle='--', label='Baseline (90%)') - ax.set_xlabel('Recycle Rate (%)', fontsize=12) - ax.set_ylabel('Daily Supply (tons)', fontsize=12) - ax.set_title('Daily Water Supply vs Recycle Rate', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图2: 年补充量 - ax = axes[0, 1] - ax.plot(results['recycle_rate'], results['annual_supply'], 'g-', linewidth=2, marker='s', markersize=4) - ax.axvline(x=90, color='r', linestyle='--', label='Baseline (90%)') - ax.set_xlabel('Recycle Rate (%)', fontsize=12) - ax.set_ylabel('Annual Supply (tons)', fontsize=12) - ax.set_title('Annual Water Supply vs Recycle Rate', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图3: 年能耗 - ax = axes[1, 0] - ax.plot(results['recycle_rate'], results['annual_energy_pj'], 'purple', linewidth=2, marker='^', markersize=4) - ax.axvline(x=90, color='r', linestyle='--', label='Baseline (90%)') - ax.set_xlabel('Recycle Rate (%)', fontsize=12) - ax.set_ylabel('Annual Energy (PJ)', fontsize=12) - ax.set_title('Annual Transport Energy vs Recycle Rate', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图4: 运力占比 - ax = axes[1, 1] - ax.plot(results['recycle_rate'], results['capacity_ratio'], 'orange', linewidth=2, marker='d', markersize=4) - ax.axvline(x=90, color='r', linestyle='--', label='Baseline (90%)') - ax.axhline(y=100, color='gray', linestyle=':', label='Full Capacity') - ax.set_xlabel('Recycle Rate (%)', fontsize=12) - ax.set_ylabel('Elevator Capacity Usage (%)', fontsize=12) - ax.set_title('Elevator Capacity Utilization vs Recycle Rate', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - plt.suptitle(f'Sensitivity Analysis: Water Recycle Rate\n(α={baseline.comfort_factor}, N={baseline.population:,})', - fontsize=14, y=1.02) - plt.tight_layout() - plt.savefig(f'{save_dir}/sensitivity_recycle_rate.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/sensitivity_recycle_rate.png") - - return pd.DataFrame(results) - - -def sensitivity_comfort_factor(baseline: BaselineParameters, save_dir: str): - """ - 舒适度因子连续灵敏度分析 - α: 1 - 300 - """ - print("分析舒适度因子灵敏度...") - - alphas = np.concatenate([ - np.linspace(1, 10, 10), - np.linspace(15, 50, 8), - np.linspace(60, 150, 10), - np.linspace(175, 300, 6) - ]) - - results = { - 'alpha': [], - 'daily_per_person': [], - 'daily_supply': [], - 'annual_supply': [], - 'annual_energy_pj': [], - 'initial_transport': [], - 'capacity_ratio': [], - } - - for alpha in alphas: - demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=alpha, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=baseline.recycle_rate, - safety_buffer_days=baseline.safety_buffer_days - ) - - transport = calculate_transport_metrics( - demand, - baseline.daily_elevator_capacity, - baseline.elevator_specific_energy - ) - - results['alpha'].append(alpha) - results['daily_per_person'].append(demand['daily_per_person_liters']) - results['daily_supply'].append(demand['daily_supply_tons']) - results['annual_supply'].append(demand['annual_supply_tons']) - results['annual_energy_pj'].append(transport['annual_energy_pj']) - results['initial_transport'].append(demand['initial_transport_tons']) - results['capacity_ratio'].append(demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100) - - # 绘图 - fig, axes = plt.subplots(2, 3, figsize=(18, 12)) - - # 图1: 人均日用水 - ax = axes[0, 0] - ax.plot(results['alpha'], results['daily_per_person'], 'b-', linewidth=2) - ax.axvline(x=1, color='green', linestyle='--', alpha=0.7, label='Survival (α=1)') - ax.axvline(x=50, color='orange', linestyle='--', alpha=0.7, label='Comfort (α=50)') - ax.axvline(x=250, color='red', linestyle='--', alpha=0.7, label='Luxury (α=250)') - ax.set_xlabel('Comfort Factor (α)', fontsize=12) - ax.set_ylabel('Daily Water per Person (L)', fontsize=12) - ax.set_title('Per Capita Water Usage vs Comfort Factor', fontsize=13) - ax.legend(fontsize=9) - ax.grid(True, alpha=0.3) - - # 图2: 日补充量 - ax = axes[0, 1] - ax.plot(results['alpha'], results['daily_supply'], 'g-', linewidth=2) - ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') - ax.set_xlabel('Comfort Factor (α)', fontsize=12) - ax.set_ylabel('Daily Supply (tons)', fontsize=12) - ax.set_title('Daily Water Supply vs Comfort Factor', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图3: 年补充量 - ax = axes[0, 2] - ax.plot(results['alpha'], results['annual_supply'], 'purple', linewidth=2) - ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') - ax.set_xlabel('Comfort Factor (α)', fontsize=12) - ax.set_ylabel('Annual Supply (tons)', fontsize=12) - ax.set_title('Annual Water Supply vs Comfort Factor', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图4: 年能耗 - ax = axes[1, 0] - ax.plot(results['alpha'], results['annual_energy_pj'], 'orange', linewidth=2) - ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') - ax.set_xlabel('Comfort Factor (α)', fontsize=12) - ax.set_ylabel('Annual Energy (PJ)', fontsize=12) - ax.set_title('Annual Transport Energy vs Comfort Factor', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图5: 首批运输量 - ax = axes[1, 1] - ax.plot(results['alpha'], results['initial_transport'], 'teal', linewidth=2) - ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') - ax.set_xlabel('Comfort Factor (α)', fontsize=12) - ax.set_ylabel('Initial Transport (tons)', fontsize=12) - ax.set_title('Initial Transport Volume vs Comfort Factor', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图6: 运力占比 - ax = axes[1, 2] - ax.plot(results['alpha'], results['capacity_ratio'], 'brown', linewidth=2) - ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') - ax.axhline(y=100, color='gray', linestyle=':', label='Full Capacity') - ax.fill_between(results['alpha'], 0, results['capacity_ratio'], alpha=0.3) - ax.set_xlabel('Comfort Factor (α)', fontsize=12) - ax.set_ylabel('Elevator Capacity Usage (%)', fontsize=12) - ax.set_title('Elevator Capacity Utilization vs Comfort Factor', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - plt.suptitle(f'Sensitivity Analysis: Comfort Factor (α)\n(η={baseline.recycle_rate*100:.0f}%, N={baseline.population:,})', - fontsize=14, y=1.02) - plt.tight_layout() - plt.savefig(f'{save_dir}/sensitivity_comfort_factor.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/sensitivity_comfort_factor.png") - - return pd.DataFrame(results) - - -def sensitivity_medical_params(baseline: BaselineParameters, save_dir: str): - """ - 医疗紧急参数灵敏度分析 - - 患病率: 1% - 5% - - 每次医疗用水: 3 - 15 L - - 置信水平: 95% - 99.9% - """ - print("分析医疗参数灵敏度...") - - fig, axes = plt.subplots(2, 3, figsize=(18, 12)) - - # ========== 患病率分析 ========== - sickness_rates = np.linspace(0.01, 0.05, 21) - results_sr = {'sickness_rate': [], 'daily_medical': [], 'annual_supply': [], 'safety_buffer': []} - - for sr in sickness_rates: - demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=baseline.comfort_factor, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=sr, - confidence_level=baseline.confidence_level, - recycle_rate=baseline.recycle_rate, - safety_buffer_days=baseline.safety_buffer_days - ) - results_sr['sickness_rate'].append(sr * 100) - results_sr['daily_medical'].append(demand['daily_medical_tons']) - results_sr['annual_supply'].append(demand['annual_supply_tons']) - results_sr['safety_buffer'].append(demand['safety_buffer_tons']) - - ax = axes[0, 0] - ax.plot(results_sr['sickness_rate'], results_sr['daily_medical'], 'b-', linewidth=2, marker='o', markersize=4) - ax.axvline(x=2, color='r', linestyle='--', label='Baseline (2%)') - ax.set_xlabel('Daily Sickness Rate (%)', fontsize=12) - ax.set_ylabel('Peak Daily Medical Water (tons)', fontsize=12) - ax.set_title('Peak Medical Water Demand vs Sickness Rate', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - ax = axes[0, 1] - ax.plot(results_sr['sickness_rate'], results_sr['safety_buffer'], 'g-', linewidth=2, marker='s', markersize=4) - ax.axvline(x=2, color='r', linestyle='--', label='Baseline (2%)') - ax.set_xlabel('Daily Sickness Rate (%)', fontsize=12) - ax.set_ylabel('Safety Buffer (tons)', fontsize=12) - ax.set_title('Safety Buffer vs Sickness Rate', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # ========== 每次医疗用水分析 ========== - medical_waters = np.linspace(3, 15, 13) - results_mw = {'medical_water': [], 'daily_medical': [], 'annual_supply': []} - - for mw in medical_waters: - demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=baseline.comfort_factor, - medical_water_per_event=mw, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=baseline.recycle_rate, - safety_buffer_days=baseline.safety_buffer_days - ) - results_mw['medical_water'].append(mw) - results_mw['daily_medical'].append(demand['daily_medical_tons']) - results_mw['annual_supply'].append(demand['annual_supply_tons']) - - ax = axes[0, 2] - ax.plot(results_mw['medical_water'], results_mw['daily_medical'], 'purple', linewidth=2, marker='^', markersize=5) - ax.axvline(x=5, color='r', linestyle='--', label='Baseline (5 L)') - ax.set_xlabel('Medical Water per Event (L)', fontsize=12) - ax.set_ylabel('Peak Daily Medical Water (tons)', fontsize=12) - ax.set_title('Peak Medical Water vs Per-Event Usage', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # ========== 置信水平分析 ========== - confidence_levels = np.linspace(0.90, 0.999, 20) - results_cl = {'confidence': [], 'daily_medical': [], 'safety_buffer': [], 'z_value': []} - - for cl in confidence_levels: - demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=baseline.comfort_factor, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=cl, - recycle_rate=baseline.recycle_rate, - safety_buffer_days=baseline.safety_buffer_days - ) - results_cl['confidence'].append(cl * 100) - results_cl['daily_medical'].append(demand['daily_medical_tons']) - results_cl['safety_buffer'].append(demand['safety_buffer_tons']) - results_cl['z_value'].append(stats.norm.ppf(cl)) - - ax = axes[1, 0] - ax.plot(results_cl['confidence'], results_cl['daily_medical'], 'orange', linewidth=2, marker='d', markersize=4) - ax.axvline(x=99, color='r', linestyle='--', label='Baseline (99%)') - ax.set_xlabel('Confidence Level (%)', fontsize=12) - ax.set_ylabel('Peak Daily Medical Water (tons)', fontsize=12) - ax.set_title('Peak Medical Water vs Confidence Level', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - ax = axes[1, 1] - ax.plot(results_cl['confidence'], results_cl['z_value'], 'teal', linewidth=2, marker='o', markersize=4) - ax.axvline(x=99, color='r', linestyle='--', label='Baseline (99%)') - ax.set_xlabel('Confidence Level (%)', fontsize=12) - ax.set_ylabel('Z-Value', fontsize=12) - ax.set_title('Z-Value vs Confidence Level', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # ========== 综合影响图 ========== - ax = axes[1, 2] - - # 计算各参数变化对年供水的影响 - baseline_demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=baseline.comfort_factor, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=baseline.recycle_rate, - safety_buffer_days=baseline.safety_buffer_days - ) - baseline_annual = baseline_demand['annual_supply_tons'] - - # 患病率影响 (1% -> 5%) - sr_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, 0.01, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - sr_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, 0.05, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - - # 医疗用水影响 (3L -> 15L) - mw_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, 3, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - mw_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, 15, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - - # 置信水平影响 (95% -> 99.9%) - cl_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - 0.95, baseline.recycle_rate, baseline.safety_buffer_days) - cl_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - 0.999, baseline.recycle_rate, baseline.safety_buffer_days) - - params = ['Sickness Rate\n(1%→5%)', 'Medical Water\n(3L→15L)', 'Confidence\n(95%→99.9%)'] - changes_low = [ - (sr_low['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, - (mw_low['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, - (cl_low['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, - ] - changes_high = [ - (sr_high['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, - (mw_high['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, - (cl_high['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, - ] - - x = np.arange(len(params)) - width = 0.35 - ax.barh(x - width/2, changes_low, width, label='Low Value', color='green', alpha=0.7) - ax.barh(x + width/2, changes_high, width, label='High Value', color='red', alpha=0.7) - ax.axvline(x=0, color='black', linewidth=1) - ax.set_yticks(x) - ax.set_yticklabels(params) - ax.set_xlabel('Change in Annual Supply (%)', fontsize=12) - ax.set_title('Medical Parameters Impact on Annual Supply', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3, axis='x') - - plt.suptitle(f'Sensitivity Analysis: Medical Emergency Parameters\n(α={baseline.comfort_factor}, η={baseline.recycle_rate*100:.0f}%)', - fontsize=14, y=1.02) - plt.tight_layout() - plt.savefig(f'{save_dir}/sensitivity_medical_params.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/sensitivity_medical_params.png") - - return results_sr, results_mw, results_cl - - -def sensitivity_population(baseline: BaselineParameters, save_dir: str): - """ - 人口规模灵敏度分析 - N: 80,000 - 120,000 (±20%) - """ - print("分析人口规模灵敏度...") - - populations = np.linspace(80000, 120000, 21).astype(int) - - results = { - 'population': [], - 'daily_circulation': [], - 'daily_supply': [], - 'annual_supply': [], - 'annual_energy_pj': [], - 'initial_transport': [], - 'capacity_ratio': [], - } - - for N in populations: - demand = calculate_water_demand( - population=N, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=baseline.comfort_factor, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=baseline.recycle_rate, - safety_buffer_days=baseline.safety_buffer_days - ) - - transport = calculate_transport_metrics( - demand, - baseline.daily_elevator_capacity, - baseline.elevator_specific_energy - ) - - results['population'].append(N / 1000) # 千人 - results['daily_circulation'].append(demand['daily_circulation_tons']) - results['daily_supply'].append(demand['daily_supply_tons']) - results['annual_supply'].append(demand['annual_supply_tons']) - results['annual_energy_pj'].append(transport['annual_energy_pj']) - results['initial_transport'].append(demand['initial_transport_tons']) - results['capacity_ratio'].append(demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100) - - # 绘图 - fig, axes = plt.subplots(2, 2, figsize=(14, 12)) - - # 图1: 日循环用水 - ax = axes[0, 0] - ax.plot(results['population'], results['daily_circulation'], 'b-', linewidth=2, marker='o', markersize=4) - ax.axvline(x=100, color='r', linestyle='--', label='Baseline (100k)') - ax.fill_between(results['population'], 0, results['daily_circulation'], alpha=0.2) - ax.set_xlabel('Population (thousands)', fontsize=12) - ax.set_ylabel('Daily Circulation Water (tons)', fontsize=12) - ax.set_title('Daily Circulation Water vs Population', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图2: 日补充量 - ax = axes[0, 1] - ax.plot(results['population'], results['daily_supply'], 'g-', linewidth=2, marker='s', markersize=4) - ax.axvline(x=100, color='r', linestyle='--', label='Baseline (100k)') - ax.set_xlabel('Population (thousands)', fontsize=12) - ax.set_ylabel('Daily Supply (tons)', fontsize=12) - ax.set_title('Daily Water Supply vs Population', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图3: 年能耗 - ax = axes[1, 0] - ax.plot(results['population'], results['annual_energy_pj'], 'purple', linewidth=2, marker='^', markersize=4) - ax.axvline(x=100, color='r', linestyle='--', label='Baseline (100k)') - ax.set_xlabel('Population (thousands)', fontsize=12) - ax.set_ylabel('Annual Energy (PJ)', fontsize=12) - ax.set_title('Annual Transport Energy vs Population', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图4: 运力占比 - ax = axes[1, 1] - ax.plot(results['population'], results['capacity_ratio'], 'orange', linewidth=2, marker='d', markersize=4) - ax.axvline(x=100, color='r', linestyle='--', label='Baseline (100k)') - ax.axhline(y=100, color='gray', linestyle=':', label='Full Capacity') - ax.set_xlabel('Population (thousands)', fontsize=12) - ax.set_ylabel('Elevator Capacity Usage (%)', fontsize=12) - ax.set_title('Elevator Capacity Utilization vs Population', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - plt.suptitle(f'Sensitivity Analysis: Population Size\n(α={baseline.comfort_factor}, η={baseline.recycle_rate*100:.0f}%)', - fontsize=14, y=1.02) - plt.tight_layout() - plt.savefig(f'{save_dir}/sensitivity_population.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/sensitivity_population.png") - - return pd.DataFrame(results) - - -def sensitivity_buffer_days(baseline: BaselineParameters, save_dir: str): - """ - 安全缓冲天数灵敏度分析 - Days: 15 - 60 - """ - print("分析安全缓冲天数灵敏度...") - - buffer_days = np.arange(15, 61, 3) - - results = { - 'buffer_days': [], - 'safety_buffer_tons': [], - 'initial_transport': [], - 'initial_days': [], - 'initial_energy_pj': [], - } - - for days in buffer_days: - demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=baseline.comfort_factor, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=baseline.recycle_rate, - safety_buffer_days=days - ) - - transport = calculate_transport_metrics( - demand, - baseline.daily_elevator_capacity, - baseline.elevator_specific_energy - ) - - results['buffer_days'].append(days) - results['safety_buffer_tons'].append(demand['safety_buffer_tons']) - results['initial_transport'].append(demand['initial_transport_tons']) - results['initial_days'].append(transport['initial_days']) - results['initial_energy_pj'].append(transport['initial_energy_pj']) - - # 绘图 - fig, axes = plt.subplots(2, 2, figsize=(14, 12)) - - # 图1: 安全缓冲量 - ax = axes[0, 0] - ax.plot(results['buffer_days'], results['safety_buffer_tons'], 'b-', linewidth=2, marker='o', markersize=5) - ax.axvline(x=30, color='r', linestyle='--', label='Baseline (30 days)') - ax.set_xlabel('Safety Buffer Days', fontsize=12) - ax.set_ylabel('Safety Buffer (tons)', fontsize=12) - ax.set_title('Safety Buffer Volume vs Buffer Days', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图2: 首批运输量 - ax = axes[0, 1] - ax.plot(results['buffer_days'], results['initial_transport'], 'g-', linewidth=2, marker='s', markersize=5) - ax.axvline(x=30, color='r', linestyle='--', label='Baseline (30 days)') - ax.set_xlabel('Safety Buffer Days', fontsize=12) - ax.set_ylabel('Initial Transport (tons)', fontsize=12) - ax.set_title('Initial Transport Volume vs Buffer Days', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图3: 首批运输天数 - ax = axes[1, 0] - ax.plot(results['buffer_days'], results['initial_days'], 'purple', linewidth=2, marker='^', markersize=5) - ax.axvline(x=30, color='r', linestyle='--', label='Baseline (30 days)') - ax.set_xlabel('Safety Buffer Days', fontsize=12) - ax.set_ylabel('Initial Transport Time (days)', fontsize=12) - ax.set_title('Initial Transport Duration vs Buffer Days', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - # 图4: 首批运输能耗 - ax = axes[1, 1] - ax.plot(results['buffer_days'], results['initial_energy_pj'], 'orange', linewidth=2, marker='d', markersize=5) - ax.axvline(x=30, color='r', linestyle='--', label='Baseline (30 days)') - ax.set_xlabel('Safety Buffer Days', fontsize=12) - ax.set_ylabel('Initial Transport Energy (PJ)', fontsize=12) - ax.set_title('Initial Transport Energy vs Buffer Days', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3) - - plt.suptitle(f'Sensitivity Analysis: Safety Buffer Days\n(α={baseline.comfort_factor}, η={baseline.recycle_rate*100:.0f}%)', - fontsize=14, y=1.02) - plt.tight_layout() - plt.savefig(f'{save_dir}/sensitivity_buffer_days.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/sensitivity_buffer_days.png") - - return pd.DataFrame(results) - - -# ============== 多参数交互分析 ============== - -def tornado_analysis(baseline: BaselineParameters, save_dir: str): - """ - Tornado图 - 多参数灵敏度排序分析 - """ - print("生成Tornado图...") - - # 基准值 - baseline_demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=baseline.comfort_factor, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=baseline.recycle_rate, - safety_buffer_days=baseline.safety_buffer_days - ) - baseline_annual = baseline_demand['annual_supply_tons'] - baseline_initial = baseline_demand['initial_transport_tons'] - - # 定义参数范围 - params = [ - ('Recycle Rate (η)', 'recycle_rate', 0.80, 0.95, baseline.recycle_rate), - ('Comfort Factor (α)', 'comfort_factor', 25, 100, baseline.comfort_factor), - ('Population (N)', 'population', 80000, 120000, baseline.population), - ('Sickness Rate', 'sickness_rate', 0.01, 0.04, baseline.sickness_rate), - ('Medical Water/Event', 'medical_water', 3, 10, baseline.medical_water_per_event), - ('Buffer Days', 'buffer_days', 15, 45, baseline.safety_buffer_days), - ('Confidence Level', 'confidence', 0.95, 0.999, baseline.confidence_level), - ] - - results_annual = [] - results_initial = [] - - for name, param_type, low, high, base_val in params: - # 低值计算 - if param_type == 'recycle_rate': - demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, low, baseline.safety_buffer_days) - demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, high, baseline.safety_buffer_days) - elif param_type == 'comfort_factor': - demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - low, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - high, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - elif param_type == 'population': - demand_low = calculate_water_demand(int(low), baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - demand_high = calculate_water_demand(int(high), baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - elif param_type == 'sickness_rate': - demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, low, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, high, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - elif param_type == 'medical_water': - demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, low, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, high, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) - elif param_type == 'buffer_days': - demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, int(low)) - demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, int(high)) - elif param_type == 'confidence': - demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - low, baseline.recycle_rate, baseline.safety_buffer_days) - demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - high, baseline.recycle_rate, baseline.safety_buffer_days) - - # 计算变化百分比 - change_low_annual = (demand_low['annual_supply_tons'] - baseline_annual) / baseline_annual * 100 - change_high_annual = (demand_high['annual_supply_tons'] - baseline_annual) / baseline_annual * 100 - change_low_initial = (demand_low['initial_transport_tons'] - baseline_initial) / baseline_initial * 100 - change_high_initial = (demand_high['initial_transport_tons'] - baseline_initial) / baseline_initial * 100 - - # 确保排序一致性 (swing = |high - low|) - swing_annual = abs(change_high_annual - change_low_annual) - swing_initial = abs(change_high_initial - change_low_initial) - - results_annual.append({ - 'param': name, - 'low': min(change_low_annual, change_high_annual), - 'high': max(change_low_annual, change_high_annual), - 'swing': swing_annual - }) - results_initial.append({ - 'param': name, - 'low': min(change_low_initial, change_high_initial), - 'high': max(change_low_initial, change_high_initial), - 'swing': swing_initial - }) - - # 按swing排序 - results_annual = sorted(results_annual, key=lambda x: x['swing'], reverse=True) - results_initial = sorted(results_initial, key=lambda x: x['swing'], reverse=True) - - # 绘图 - fig, axes = plt.subplots(1, 2, figsize=(16, 8)) - - # 图1: 年补充量Tornado - ax = axes[0] - y_pos = np.arange(len(results_annual)) - params_sorted = [r['param'] for r in results_annual] - lows = [r['low'] for r in results_annual] - highs = [r['high'] for r in results_annual] - - # 绘制条形图 - for i, (l, h) in enumerate(zip(lows, highs)): - if l < 0: - ax.barh(i, l, color='green', alpha=0.7, height=0.6) - if h > 0: - ax.barh(i, h, color='red', alpha=0.7, height=0.6) - if l >= 0: - ax.barh(i, l, left=0, color='green', alpha=0.7, height=0.6) - if h <= 0: - ax.barh(i, h, left=0, color='red', alpha=0.7, height=0.6) - # 如果跨越0,绘制完整范围 - if l < 0 < h: - pass # 已经绘制 - elif l >= 0: - ax.barh(i, h - l, left=l, color='orange', alpha=0.7, height=0.6) - elif h <= 0: - ax.barh(i, h - l, left=l, color='orange', alpha=0.7, height=0.6) - - ax.axvline(x=0, color='black', linewidth=1.5) - ax.set_yticks(y_pos) - ax.set_yticklabels(params_sorted) - ax.set_xlabel('Change in Annual Supply (%)', fontsize=12) - ax.set_title('Tornado Diagram: Annual Water Supply', fontsize=14) - ax.grid(True, alpha=0.3, axis='x') - - # 图2: 首批运输量Tornado - ax = axes[1] - params_sorted = [r['param'] for r in results_initial] - lows = [r['low'] for r in results_initial] - highs = [r['high'] for r in results_initial] - - for i, (l, h) in enumerate(zip(lows, highs)): - width = h - l - left = l - color = 'steelblue' if width > 0 else 'gray' - ax.barh(i, width, left=left, color=color, alpha=0.7, height=0.6) - - ax.axvline(x=0, color='black', linewidth=1.5) - ax.set_yticks(y_pos) - ax.set_yticklabels(params_sorted) - ax.set_xlabel('Change in Initial Transport (%)', fontsize=12) - ax.set_title('Tornado Diagram: Initial Transport Volume', fontsize=14) - ax.grid(True, alpha=0.3, axis='x') - - # 添加图例说明 - from matplotlib.patches import Patch - legend_elements = [ - Patch(facecolor='green', alpha=0.7, label='Decrease'), - Patch(facecolor='red', alpha=0.7, label='Increase'), - ] - axes[0].legend(handles=legend_elements, loc='lower right') - - plt.suptitle('Multi-Parameter Sensitivity Analysis (Tornado Diagram)\nBaseline: α=50, η=90%, N=100k', - fontsize=14, y=1.02) - plt.tight_layout() - plt.savefig(f'{save_dir}/tornado_analysis.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/tornado_analysis.png") - - return results_annual, results_initial - - -def interaction_heatmap(baseline: BaselineParameters, save_dir: str): - """ - 双参数交互热力图 - α vs η - """ - print("生成双参数交互热力图...") - - alphas = np.array([1, 25, 50, 100, 150, 200, 250]) - etas = np.array([0.70, 0.75, 0.80, 0.85, 0.90, 0.95]) - - # 年补充量矩阵 - annual_matrix = np.zeros((len(etas), len(alphas))) - # 运力占比矩阵 - capacity_matrix = np.zeros((len(etas), len(alphas))) - - for i, eta in enumerate(etas): - for j, alpha in enumerate(alphas): - demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=alpha, - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=eta, - safety_buffer_days=baseline.safety_buffer_days - ) - annual_matrix[i, j] = demand['annual_supply_tons'] / 1000 # 千吨 - capacity_matrix[i, j] = demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100 - - fig, axes = plt.subplots(1, 2, figsize=(16, 7)) - - # 图1: 年补充量热力图 - ax = axes[0] - im = ax.imshow(annual_matrix, cmap='YlOrRd', aspect='auto') - ax.set_xticks(range(len(alphas))) - ax.set_xticklabels([f'{a}' for a in alphas]) - ax.set_yticks(range(len(etas))) - ax.set_yticklabels([f'{e*100:.0f}%' for e in etas]) - ax.set_xlabel('Comfort Factor (α)', fontsize=12) - ax.set_ylabel('Recycle Rate (η)', fontsize=12) - ax.set_title('Annual Water Supply (kt)', fontsize=13) - - # 添加数值标注 - for i in range(len(etas)): - for j in range(len(alphas)): - text_color = 'white' if annual_matrix[i, j] > annual_matrix.max() * 0.6 else 'black' - ax.text(j, i, f'{annual_matrix[i, j]:.0f}', ha='center', va='center', fontsize=9, color=text_color) - - plt.colorbar(im, ax=ax, label='Annual Supply (kt)') - - # 图2: 运力占比热力图 - ax = axes[1] - im = ax.imshow(capacity_matrix, cmap='RdYlGn_r', aspect='auto', vmin=0, vmax=150) - ax.set_xticks(range(len(alphas))) - ax.set_xticklabels([f'{a}' for a in alphas]) - ax.set_yticks(range(len(etas))) - ax.set_yticklabels([f'{e*100:.0f}%' for e in etas]) - ax.set_xlabel('Comfort Factor (α)', fontsize=12) - ax.set_ylabel('Recycle Rate (η)', fontsize=12) - ax.set_title('Elevator Capacity Usage (%)', fontsize=13) - - # 添加数值标注 - for i in range(len(etas)): - for j in range(len(alphas)): - val = capacity_matrix[i, j] - text_color = 'white' if val > 60 else 'black' - ax.text(j, i, f'{val:.0f}%', ha='center', va='center', fontsize=9, color=text_color) - - # 添加100%等高线 - cbar = plt.colorbar(im, ax=ax, label='Capacity Usage (%)') - - plt.suptitle('Two-Parameter Interaction Analysis: α vs η\n(N=100,000, Buffer=30 days)', - fontsize=14, y=1.02) - plt.tight_layout() - plt.savefig(f'{save_dir}/interaction_heatmap.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/interaction_heatmap.png") - - return annual_matrix, capacity_matrix - - -def three_param_surface(baseline: BaselineParameters, save_dir: str): - """ - 三参数交互3D曲面图 - """ - print("生成三参数3D曲面图...") - - alphas = np.linspace(1, 200, 20) - etas = np.linspace(0.75, 0.95, 20) - - A, E = np.meshgrid(alphas, etas) - Z = np.zeros_like(A) - - for i in range(len(etas)): - for j in range(len(alphas)): - demand = calculate_water_demand( - population=baseline.population, - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=alphas[j], - medical_water_per_event=baseline.medical_water_per_event, - sickness_rate=baseline.sickness_rate, - confidence_level=baseline.confidence_level, - recycle_rate=etas[i], - safety_buffer_days=baseline.safety_buffer_days - ) - Z[i, j] = demand['annual_supply_tons'] / 1000 # 千吨 - - fig = plt.figure(figsize=(14, 10)) - ax = fig.add_subplot(111, projection='3d') - - surf = ax.plot_surface(A, E * 100, Z, cmap='viridis', alpha=0.8, edgecolor='none') - - # 添加基准点 - baseline_demand = calculate_water_demand( - baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days - ) - ax.scatter([baseline.comfort_factor], [baseline.recycle_rate * 100], - [baseline_demand['annual_supply_tons'] / 1000], - color='red', s=100, label='Baseline', marker='*') - - ax.set_xlabel('Comfort Factor (α)', fontsize=11) - ax.set_ylabel('Recycle Rate (%)', fontsize=11) - ax.set_zlabel('Annual Supply (kt)', fontsize=11) - ax.set_title('3D Surface: Annual Water Supply\nas Function of α and η', fontsize=14) - - fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, label='Annual Supply (kt)') - ax.legend() - - plt.tight_layout() - plt.savefig(f'{save_dir}/three_param_surface.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/three_param_surface.png") - - return Z - - -# ============== 最坏情况分析 ============== - -def worst_case_analysis(baseline: BaselineParameters, save_dir: str): - """ - 最坏情况压力测试分析 - """ - print("进行最坏情况分析...") - - # 定义场景 - scenarios = { - 'Baseline': { - 'alpha': baseline.comfort_factor, - 'eta': baseline.recycle_rate, - 'sickness': baseline.sickness_rate, - 'population': baseline.population, - 'buffer': baseline.safety_buffer_days, - 'medical_water': baseline.medical_water_per_event, - }, - 'Survival Mode': { - 'alpha': 1, - 'eta': 0.90, - 'sickness': 0.02, - 'population': 100000, - 'buffer': 30, - 'medical_water': 5, - }, - 'Comfort Mode': { - 'alpha': 50, - 'eta': 0.90, - 'sickness': 0.02, - 'population': 100000, - 'buffer': 30, - 'medical_water': 5, - }, - 'Luxury Mode': { - 'alpha': 250, - 'eta': 0.90, - 'sickness': 0.02, - 'population': 100000, - 'buffer': 30, - 'medical_water': 5, - }, - 'Recycle Degradation': { - 'alpha': 50, - 'eta': 0.80, - 'sickness': 0.02, - 'population': 100000, - 'buffer': 30, - 'medical_water': 5, - }, - 'Epidemic Outbreak': { - 'alpha': 50, - 'eta': 0.90, - 'sickness': 0.05, - 'population': 100000, - 'buffer': 45, - 'medical_water': 10, - }, - 'Population Surge': { - 'alpha': 50, - 'eta': 0.90, - 'sickness': 0.02, - 'population': 120000, - 'buffer': 30, - 'medical_water': 5, - }, - 'Worst Case': { - 'alpha': 250, - 'eta': 0.80, - 'sickness': 0.05, - 'population': 120000, - 'buffer': 45, - 'medical_water': 10, - }, - 'Moderate Stress': { - 'alpha': 100, - 'eta': 0.85, - 'sickness': 0.03, - 'population': 110000, - 'buffer': 40, - 'medical_water': 7, - }, - } - - results = [] - - for name, params in scenarios.items(): - demand = calculate_water_demand( - population=params['population'], - survival_water=baseline.survival_water, - hygiene_water_base=baseline.hygiene_water_base, - comfort_factor=params['alpha'], - medical_water_per_event=params['medical_water'], - sickness_rate=params['sickness'], - confidence_level=baseline.confidence_level, - recycle_rate=params['eta'], - safety_buffer_days=params['buffer'] - ) - - transport = calculate_transport_metrics( - demand, - baseline.daily_elevator_capacity, - baseline.elevator_specific_energy - ) - - capacity_ratio = demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100 - - results.append({ - 'scenario': name, - 'alpha': params['alpha'], - 'eta': params['eta'] * 100, - 'sickness': params['sickness'] * 100, - 'population': params['population'] / 1000, - 'buffer': params['buffer'], - 'daily_supply': demand['daily_supply_tons'], - 'annual_supply': demand['annual_supply_tons'], - 'initial_transport': demand['initial_transport_tons'], - 'annual_energy_pj': transport['annual_energy_pj'], - 'capacity_ratio': capacity_ratio, - 'feasible': capacity_ratio < 100, - }) - - df = pd.DataFrame(results) - - # 绘图 - fig, axes = plt.subplots(2, 2, figsize=(16, 14)) - - # 图1: 年补充量对比 - ax = axes[0, 0] - colors = ['green' if r['feasible'] else 'red' for r in results] - bars = ax.barh(range(len(results)), [r['annual_supply'] / 1000 for r in results], color=colors, alpha=0.7) - ax.axvline(x=baseline.total_elevator_capacity / 1000, color='red', linestyle='--', linewidth=2, label='Elevator Capacity') - ax.set_yticks(range(len(results))) - ax.set_yticklabels([r['scenario'] for r in results]) - ax.set_xlabel('Annual Supply (kt)', fontsize=12) - ax.set_title('Annual Water Supply by Scenario', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3, axis='x') - - # 添加数值标注 - for i, bar in enumerate(bars): - width = bar.get_width() - ax.text(width + 5, bar.get_y() + bar.get_height()/2, f'{width:.0f}', - va='center', fontsize=9) - - # 图2: 运力占比 - ax = axes[0, 1] - colors = ['green' if r['feasible'] else 'red' for r in results] - bars = ax.barh(range(len(results)), [r['capacity_ratio'] for r in results], color=colors, alpha=0.7) - ax.axvline(x=100, color='red', linestyle='--', linewidth=2, label='100% Capacity') - ax.set_yticks(range(len(results))) - ax.set_yticklabels([r['scenario'] for r in results]) - ax.set_xlabel('Elevator Capacity Usage (%)', fontsize=12) - ax.set_title('Capacity Utilization by Scenario', fontsize=13) - ax.legend() - ax.grid(True, alpha=0.3, axis='x') - - for i, bar in enumerate(bars): - width = bar.get_width() - ax.text(width + 2, bar.get_y() + bar.get_height()/2, f'{width:.1f}%', - va='center', fontsize=9) - - # 图3: 年能耗对比 - ax = axes[1, 0] - ax.bar(range(len(results)), [r['annual_energy_pj'] for r in results], color='purple', alpha=0.7) - ax.set_xticks(range(len(results))) - ax.set_xticklabels([r['scenario'] for r in results], rotation=45, ha='right', fontsize=9) - ax.set_ylabel('Annual Energy (PJ)', fontsize=12) - ax.set_title('Annual Transport Energy by Scenario', fontsize=13) - ax.grid(True, alpha=0.3, axis='y') - - # 图4: 首批运输量 - ax = axes[1, 1] - ax.bar(range(len(results)), [r['initial_transport'] / 1000 for r in results], color='teal', alpha=0.7) - ax.set_xticks(range(len(results))) - ax.set_xticklabels([r['scenario'] for r in results], rotation=45, ha='right', fontsize=9) - ax.set_ylabel('Initial Transport (kt)', fontsize=12) - ax.set_title('Initial Transport Volume by Scenario', fontsize=13) - ax.grid(True, alpha=0.3, axis='y') - - plt.suptitle('Worst Case Analysis: Stress Test Scenarios', fontsize=14, y=1.02) - plt.tight_layout() - plt.savefig(f'{save_dir}/worst_case_analysis.png', dpi=150, bbox_inches='tight') - print(f" 保存: {save_dir}/worst_case_analysis.png") - - # 保存详细结果表 - df.to_csv(f'{save_dir}/worst_case_results.csv', index=False) - print(f" 保存: {save_dir}/worst_case_results.csv") - - return df - - -def generate_summary_report(baseline: BaselineParameters, save_dir: str): - """ - 生成灵敏度分析总结报告 - """ - print("生成总结报告...") - - report = [] - report.append("=" * 100) - report.append("TASK 3: WATER SUPPLY SENSITIVITY ANALYSIS SUMMARY") - report.append("=" * 100) - - report.append("\n## 基准参数") - report.append(f"- 人口: {baseline.population:,}") - report.append(f"- 舒适度因子 (α): {baseline.comfort_factor}") - report.append(f"- 水回收效率 (η): {baseline.recycle_rate * 100:.0f}%") - report.append(f"- 患病率: {baseline.sickness_rate * 100:.1f}%") - report.append(f"- 医疗用水: {baseline.medical_water_per_event} L/次") - report.append(f"- 置信水平: {baseline.confidence_level * 100:.1f}%") - report.append(f"- 安全缓冲: {baseline.safety_buffer_days} 天") - - # 计算基准值 - baseline_demand = calculate_water_demand( - baseline.population, baseline.survival_water, baseline.hygiene_water_base, - baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, - baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days - ) - baseline_transport = calculate_transport_metrics( - baseline_demand, baseline.daily_elevator_capacity, baseline.elevator_specific_energy - ) - - report.append(f"\n## 基准水需求") - report.append(f"- 每日补充量: {baseline_demand['daily_supply_tons']:.1f} 吨") - report.append(f"- 年补充量: {baseline_demand['annual_supply_tons']:.1f} 吨") - report.append(f"- 首批运输量: {baseline_demand['initial_transport_tons']:.1f} 吨") - report.append(f"- 年能耗: {baseline_transport['annual_energy_pj']:.4f} PJ") - report.append(f"- 运力占比: {baseline_demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100:.2f}%") - - report.append("\n" + "=" * 100) - report.append("## 关键灵敏度发现") - report.append("=" * 100) - - report.append(""" -### 1. 水回收效率 (η) - 影响程度: ★★★★★ -- 范围: 70% - 95% -- η从90%降至80%时,日补充量翻倍 -- 这是对年运输需求影响最大的参数 -- 建议: 优先投资水回收系统维护和升级 - -### 2. 舒适度因子 (α) - 影响程度: ★★★★★ -- 范围: 1 - 300 -- α=250时年补充量是α=1时的35倍 -- 在高舒适度下可能超出电梯运力 -- 建议: 初期采用生存标准,逐步提升舒适度 - -### 3. 人口规模 (N) - 影响程度: ★★★★☆ -- 范围: ±20% (80k - 120k) -- 线性影响,20%人口增加导致20%需求增加 -- 建议: 规划时预留弹性容量 - -### 4. 医疗紧急参数 - 影响程度: ★★☆☆☆ -- 患病率(1%-5%)和医疗用水(3-15L)对年补充量影响较小 -- 主要影响安全缓冲和首批运输量 -- 建议: 采用保守参数确保医疗安全 - -### 5. 安全缓冲天数 - 影响程度: ★★★☆☆ -- 范围: 15 - 60天 -- 主要影响首批运输量,不影响年运输总量 -- 建议: 保持30天缓冲作为运输中断容忍度 -""") - - report.append("\n" + "=" * 100) - report.append("## 最坏情况分析结论") - report.append("=" * 100) - - report.append(""" -### 可行性边界 -- 最坏情况 (α=250, η=80%, N=120k): 年需求约 562 kt,超出电梯运力 -- 中度压力 (α=100, η=85%, N=110k): 年需求约 132 kt,仍可承受 -- 系统崩溃临界点: 约 η < 82% + α > 200 组合 - -### 风险缓解建议 -1. 水回收系统冗余设计,确保η≥85% -2. 分阶段提升舒适度标准 -3. 维持混合运输能力作为备用 -4. 建立月球本地水源开发计划 -""") - - report_text = "\n".join(report) - - with open(f'{save_dir}/sensitivity_summary_report.txt', 'w', encoding='utf-8') as f: - f.write(report_text) - print(f" 保存: {save_dir}/sensitivity_summary_report.txt") - - return report_text - - -# ============== 主程序 ============== - -def run_full_sensitivity_analysis(): - """运行完整的灵敏度分析""" - - print("=" * 80) - print("任务三:月球殖民地水需求灵敏度分析") - print("=" * 80) - - save_dir = '/Volumes/Files/code/mm/20260130_b/p3' - - # 初始化基准参数 - baseline = BaselineParameters() - - print(f"\n基准参数:") - print(f" - 人口: {baseline.population:,}") - print(f" - 舒适度因子: {baseline.comfort_factor}") - print(f" - 水回收效率: {baseline.recycle_rate * 100:.0f}%") - print(f" - 患病率: {baseline.sickness_rate * 100:.1f}%") - print(f" - 安全缓冲: {baseline.safety_buffer_days} 天") - - print("\n" + "=" * 80) - print("开始灵敏度分析...") - print("=" * 80) - - # 1. 单参数灵敏度分析 - print("\n[1/7] 水回收效率灵敏度分析") - df_recycle = sensitivity_recycle_rate(baseline, save_dir) - - print("\n[2/7] 舒适度因子灵敏度分析") - df_comfort = sensitivity_comfort_factor(baseline, save_dir) - - print("\n[3/7] 医疗参数灵敏度分析") - results_medical = sensitivity_medical_params(baseline, save_dir) - - print("\n[4/7] 人口规模灵敏度分析") - df_population = sensitivity_population(baseline, save_dir) - - print("\n[5/7] 安全缓冲天数灵敏度分析") - df_buffer = sensitivity_buffer_days(baseline, save_dir) - - # 2. 多参数交互分析 - print("\n[6/7] 多参数交互分析") - tornado_results = tornado_analysis(baseline, save_dir) - heatmap_data = interaction_heatmap(baseline, save_dir) - surface_data = three_param_surface(baseline, save_dir) - - # 3. 最坏情况分析 - print("\n[7/7] 最坏情况分析") - worst_case_df = worst_case_analysis(baseline, save_dir) - - # 4. 生成总结报告 - print("\n生成总结报告...") - summary = generate_summary_report(baseline, save_dir) - - print("\n" + "=" * 80) - print("灵敏度分析完成!") - print("=" * 80) - - print(f"\n生成的文件:") - print(f" - sensitivity_recycle_rate.png") - print(f" - sensitivity_comfort_factor.png") - print(f" - sensitivity_medical_params.png") - print(f" - sensitivity_population.png") - print(f" - sensitivity_buffer_days.png") - print(f" - tornado_analysis.png") - print(f" - interaction_heatmap.png") - print(f" - three_param_surface.png") - print(f" - worst_case_analysis.png") - print(f" - worst_case_results.csv") - print(f" - sensitivity_summary_report.txt") - - return { - 'recycle': df_recycle, - 'comfort': df_comfort, - 'population': df_population, - 'buffer': df_buffer, - 'worst_case': worst_case_df, - } - - -if __name__ == "__main__": - results = run_full_sensitivity_analysis() +""" +任务三:月球殖民地水需求灵敏度分析 + +Water Supply Sensitivity Analysis for Moon Colony + +分析参数: +1. 水回收效率 (η): 70%-95% +2. 舒适度因子 (α): 1-300 +3. 医疗紧急参数: 患病率、每次用水量、置信水平 +4. 人口规模 (N): ±20% +5. 安全缓冲天数: 15-60天 + +输出: +- 单参数灵敏度分析图 +- 多参数交互分析 (Tornado图) +- 最坏情况分析 (Stress Test) +""" + +import numpy as np +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib import rcParams +from scipy import stats +from dataclasses import dataclass, field +from typing import List, Dict, Tuple, Optional +import pandas as pd +from mpl_toolkits.mplot3d import Axes3D +import warnings +warnings.filterwarnings('ignore') + +# 设置字体 +rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans', 'SimHei'] +rcParams['axes.unicode_minus'] = False +plt.style.use('seaborn-v0_8-whitegrid') + +# ============== 物理常数 ============== +G0 = 9.81 # m/s² +OMEGA_EARTH = 7.27e-5 # rad/s +R_EARTH = 6.371e6 # m + +# ============== 基准参数 ============== +@dataclass +class BaselineParameters: + """基准参数配置""" + # 人口 + population: int = 100_000 + + # 水需求参数 + survival_water: float = 2.5 # L/人/天 + hygiene_water_base: float = 0.4 # L/人/天 (乘以α) + comfort_factor: float = 50.0 # 舒适度系数 + + # 医疗参数 + medical_water_per_event: float = 5.0 # L/次 + sickness_rate: float = 0.02 # 每日患病率 (2%) + confidence_level: float = 0.99 # 置信水平 + + # 回收和缓冲 + recycle_rate: float = 0.90 # 水循环回收率 + safety_buffer_days: int = 30 # 安全缓冲天数 + + # 运输参数 + elevator_capacity_per_year: float = 179_000 # 吨/年/部 + num_elevators: int = 3 + elevator_specific_energy: float = 157.2e9 # J/吨 + + @property + def total_elevator_capacity(self) -> float: + return self.num_elevators * self.elevator_capacity_per_year + + @property + def daily_elevator_capacity(self) -> float: + return self.total_elevator_capacity / 365 + + +# ============== 水需求计算函数 ============== + +def calculate_water_demand( + population: int, + survival_water: float, + hygiene_water_base: float, + comfort_factor: float, + medical_water_per_event: float, + sickness_rate: float, + confidence_level: float, + recycle_rate: float, + safety_buffer_days: int +) -> Dict: + """ + 计算水需求 + + 返回包含各项水需求指标的字典 + """ + # 每人每日用水 + daily_per_person = survival_water + hygiene_water_base * comfort_factor + + # 每日循环用水量 (吨) + daily_circulation = population * daily_per_person / 1000 + + # 医疗用水计算 (使用正态近似) + # 每日患病人数期望和标准差 + n = population + p = sickness_rate + mu = n * p + sigma = np.sqrt(n * p * (1 - p)) + + # 给定置信水平的Z值 + z = stats.norm.ppf(confidence_level) + + # 峰值医疗需求 (99%置信) + peak_medical_events = mu + z * sigma + daily_medical = peak_medical_events * medical_water_per_event / 1000 # 吨 + + # 平均医疗需求 + mean_medical = mu * medical_water_per_event / 1000 # 吨 + + # 每日循环损耗 (需从地球补充) + daily_circulation_loss = daily_circulation * (1 - recycle_rate) + + # 每日总补充量 (损耗 + 医疗) + daily_supply = daily_circulation_loss + mean_medical + + # 每月补充量 + monthly_supply = daily_supply * 30 + + # 年补充量 + annual_supply = daily_supply * 365 + + # 水库初始存量 (支撑单日循环) + reservoir = daily_circulation + + # 安全缓冲 (峰值医疗 + 损耗) + daily_peak_supply = daily_circulation_loss + daily_medical + safety_buffer = daily_peak_supply * safety_buffer_days + + # 首批运输量 = 水库 + 安全缓冲 + initial_transport = reservoir + safety_buffer + + return { + 'population': population, + 'comfort_factor': comfort_factor, + 'recycle_rate': recycle_rate, + 'sickness_rate': sickness_rate, + 'confidence_level': confidence_level, + 'safety_buffer_days': safety_buffer_days, + + 'daily_per_person_liters': daily_per_person, + 'daily_circulation_tons': daily_circulation, + 'daily_medical_tons': daily_medical, + 'mean_medical_tons': mean_medical, + 'daily_circulation_loss_tons': daily_circulation_loss, + 'daily_supply_tons': daily_supply, + 'monthly_supply_tons': monthly_supply, + 'annual_supply_tons': annual_supply, + 'reservoir_tons': reservoir, + 'safety_buffer_tons': safety_buffer, + 'initial_transport_tons': initial_transport, + } + + +def calculate_transport_metrics( + water_demand: Dict, + daily_capacity: float, + specific_energy: float +) -> Dict: + """计算运输指标""" + initial_tons = water_demand['initial_transport_tons'] + monthly_tons = water_demand['monthly_supply_tons'] + annual_tons = water_demand['annual_supply_tons'] + + # 首批运输 + initial_days = initial_tons / daily_capacity + initial_energy_pj = initial_tons * specific_energy / 1e15 + + # 每月补充 + monthly_days = monthly_tons / daily_capacity + monthly_energy_pj = monthly_tons * specific_energy / 1e15 + + # 年度 + annual_days = annual_tons / daily_capacity + annual_energy_pj = annual_tons * specific_energy / 1e15 + + return { + 'initial_days': initial_days, + 'initial_energy_pj': initial_energy_pj, + 'monthly_days': monthly_days, + 'monthly_energy_pj': monthly_energy_pj, + 'annual_days': annual_days, + 'annual_energy_pj': annual_energy_pj, + 'annual_tons': annual_tons, + } + + +# ============== 灵敏度分析函数 ============== + +def sensitivity_recycle_rate(baseline: BaselineParameters, save_dir: str): + """ + 水回收效率灵敏度分析 + η: 70% - 95% + """ + print("分析水回收效率灵敏度...") + + recycle_rates = np.linspace(0.70, 0.95, 26) + + results = { + 'recycle_rate': [], + 'daily_supply': [], + 'annual_supply': [], + 'annual_energy_pj': [], + 'capacity_ratio': [], # 占电梯年运力比例 + } + + for eta in recycle_rates: + demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=baseline.comfort_factor, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=eta, + safety_buffer_days=baseline.safety_buffer_days + ) + + transport = calculate_transport_metrics( + demand, + baseline.daily_elevator_capacity, + baseline.elevator_specific_energy + ) + + results['recycle_rate'].append(eta * 100) + results['daily_supply'].append(demand['daily_supply_tons']) + results['annual_supply'].append(demand['annual_supply_tons']) + results['annual_energy_pj'].append(transport['annual_energy_pj']) + results['capacity_ratio'].append(demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100) + + # 绘图 + fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + + # 图1: 日补充量 + ax = axes[0, 0] + ax.plot(results['recycle_rate'], results['daily_supply'], 'b-', linewidth=2, marker='o', markersize=4) + ax.axvline(x=90, color='r', linestyle='--', label='Baseline (90%)') + ax.set_xlabel('Recycle Rate (%)', fontsize=12) + ax.set_ylabel('Daily Supply (tons)', fontsize=12) + ax.set_title('Daily Water Supply vs Recycle Rate', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图2: 年补充量 + ax = axes[0, 1] + ax.plot(results['recycle_rate'], results['annual_supply'], 'g-', linewidth=2, marker='s', markersize=4) + ax.axvline(x=90, color='r', linestyle='--', label='Baseline (90%)') + ax.set_xlabel('Recycle Rate (%)', fontsize=12) + ax.set_ylabel('Annual Supply (tons)', fontsize=12) + ax.set_title('Annual Water Supply vs Recycle Rate', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图3: 年能耗 + ax = axes[1, 0] + ax.plot(results['recycle_rate'], results['annual_energy_pj'], 'purple', linewidth=2, marker='^', markersize=4) + ax.axvline(x=90, color='r', linestyle='--', label='Baseline (90%)') + ax.set_xlabel('Recycle Rate (%)', fontsize=12) + ax.set_ylabel('Annual Energy (PJ)', fontsize=12) + ax.set_title('Annual Transport Energy vs Recycle Rate', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图4: 运力占比 + ax = axes[1, 1] + ax.plot(results['recycle_rate'], results['capacity_ratio'], 'orange', linewidth=2, marker='d', markersize=4) + ax.axvline(x=90, color='r', linestyle='--', label='Baseline (90%)') + ax.axhline(y=100, color='gray', linestyle=':', label='Full Capacity') + ax.set_xlabel('Recycle Rate (%)', fontsize=12) + ax.set_ylabel('Elevator Capacity Usage (%)', fontsize=12) + ax.set_title('Elevator Capacity Utilization vs Recycle Rate', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + plt.suptitle(f'Sensitivity Analysis: Water Recycle Rate\n(α={baseline.comfort_factor}, N={baseline.population:,})', + fontsize=14, y=1.02) + plt.tight_layout() + plt.savefig(f'{save_dir}/sensitivity_recycle_rate.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/sensitivity_recycle_rate.png") + + return pd.DataFrame(results) + + +def sensitivity_comfort_factor(baseline: BaselineParameters, save_dir: str): + """ + 舒适度因子连续灵敏度分析 + α: 1 - 300 + """ + print("分析舒适度因子灵敏度...") + + alphas = np.concatenate([ + np.linspace(1, 10, 10), + np.linspace(15, 50, 8), + np.linspace(60, 150, 10), + np.linspace(175, 300, 6) + ]) + + results = { + 'alpha': [], + 'daily_per_person': [], + 'daily_supply': [], + 'annual_supply': [], + 'annual_energy_pj': [], + 'initial_transport': [], + 'capacity_ratio': [], + } + + for alpha in alphas: + demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=alpha, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=baseline.recycle_rate, + safety_buffer_days=baseline.safety_buffer_days + ) + + transport = calculate_transport_metrics( + demand, + baseline.daily_elevator_capacity, + baseline.elevator_specific_energy + ) + + results['alpha'].append(alpha) + results['daily_per_person'].append(demand['daily_per_person_liters']) + results['daily_supply'].append(demand['daily_supply_tons']) + results['annual_supply'].append(demand['annual_supply_tons']) + results['annual_energy_pj'].append(transport['annual_energy_pj']) + results['initial_transport'].append(demand['initial_transport_tons']) + results['capacity_ratio'].append(demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100) + + # 绘图 + fig, axes = plt.subplots(2, 3, figsize=(18, 12)) + + # 图1: 人均日用水 + ax = axes[0, 0] + ax.plot(results['alpha'], results['daily_per_person'], 'b-', linewidth=2) + ax.axvline(x=1, color='green', linestyle='--', alpha=0.7, label='Survival (α=1)') + ax.axvline(x=50, color='orange', linestyle='--', alpha=0.7, label='Comfort (α=50)') + ax.axvline(x=250, color='red', linestyle='--', alpha=0.7, label='Luxury (α=250)') + ax.set_xlabel('Comfort Factor (α)', fontsize=12) + ax.set_ylabel('Daily Water per Person (L)', fontsize=12) + ax.set_title('Per Capita Water Usage vs Comfort Factor', fontsize=13) + ax.legend(fontsize=9) + ax.grid(True, alpha=0.3) + + # 图2: 日补充量 + ax = axes[0, 1] + ax.plot(results['alpha'], results['daily_supply'], 'g-', linewidth=2) + ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') + ax.set_xlabel('Comfort Factor (α)', fontsize=12) + ax.set_ylabel('Daily Supply (tons)', fontsize=12) + ax.set_title('Daily Water Supply vs Comfort Factor', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图3: 年补充量 + ax = axes[0, 2] + ax.plot(results['alpha'], results['annual_supply'], 'purple', linewidth=2) + ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') + ax.set_xlabel('Comfort Factor (α)', fontsize=12) + ax.set_ylabel('Annual Supply (tons)', fontsize=12) + ax.set_title('Annual Water Supply vs Comfort Factor', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图4: 年能耗 + ax = axes[1, 0] + ax.plot(results['alpha'], results['annual_energy_pj'], 'orange', linewidth=2) + ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') + ax.set_xlabel('Comfort Factor (α)', fontsize=12) + ax.set_ylabel('Annual Energy (PJ)', fontsize=12) + ax.set_title('Annual Transport Energy vs Comfort Factor', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图5: 首批运输量 + ax = axes[1, 1] + ax.plot(results['alpha'], results['initial_transport'], 'teal', linewidth=2) + ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') + ax.set_xlabel('Comfort Factor (α)', fontsize=12) + ax.set_ylabel('Initial Transport (tons)', fontsize=12) + ax.set_title('Initial Transport Volume vs Comfort Factor', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图6: 运力占比 + ax = axes[1, 2] + ax.plot(results['alpha'], results['capacity_ratio'], 'brown', linewidth=2) + ax.axvline(x=50, color='r', linestyle='--', label='Baseline (α=50)') + ax.axhline(y=100, color='gray', linestyle=':', label='Full Capacity') + ax.fill_between(results['alpha'], 0, results['capacity_ratio'], alpha=0.3) + ax.set_xlabel('Comfort Factor (α)', fontsize=12) + ax.set_ylabel('Elevator Capacity Usage (%)', fontsize=12) + ax.set_title('Elevator Capacity Utilization vs Comfort Factor', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + plt.suptitle(f'Sensitivity Analysis: Comfort Factor (α)\n(η={baseline.recycle_rate*100:.0f}%, N={baseline.population:,})', + fontsize=14, y=1.02) + plt.tight_layout() + plt.savefig(f'{save_dir}/sensitivity_comfort_factor.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/sensitivity_comfort_factor.png") + + return pd.DataFrame(results) + + +def sensitivity_medical_params(baseline: BaselineParameters, save_dir: str): + """ + 医疗紧急参数灵敏度分析 + - 患病率: 1% - 5% + - 每次医疗用水: 3 - 15 L + - 置信水平: 95% - 99.9% + """ + print("分析医疗参数灵敏度...") + + fig, axes = plt.subplots(2, 3, figsize=(18, 12)) + + # ========== 患病率分析 ========== + sickness_rates = np.linspace(0.01, 0.05, 21) + results_sr = {'sickness_rate': [], 'daily_medical': [], 'annual_supply': [], 'safety_buffer': []} + + for sr in sickness_rates: + demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=baseline.comfort_factor, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=sr, + confidence_level=baseline.confidence_level, + recycle_rate=baseline.recycle_rate, + safety_buffer_days=baseline.safety_buffer_days + ) + results_sr['sickness_rate'].append(sr * 100) + results_sr['daily_medical'].append(demand['daily_medical_tons']) + results_sr['annual_supply'].append(demand['annual_supply_tons']) + results_sr['safety_buffer'].append(demand['safety_buffer_tons']) + + ax = axes[0, 0] + ax.plot(results_sr['sickness_rate'], results_sr['daily_medical'], 'b-', linewidth=2, marker='o', markersize=4) + ax.axvline(x=2, color='r', linestyle='--', label='Baseline (2%)') + ax.set_xlabel('Daily Sickness Rate (%)', fontsize=12) + ax.set_ylabel('Peak Daily Medical Water (tons)', fontsize=12) + ax.set_title('Peak Medical Water Demand vs Sickness Rate', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + ax = axes[0, 1] + ax.plot(results_sr['sickness_rate'], results_sr['safety_buffer'], 'g-', linewidth=2, marker='s', markersize=4) + ax.axvline(x=2, color='r', linestyle='--', label='Baseline (2%)') + ax.set_xlabel('Daily Sickness Rate (%)', fontsize=12) + ax.set_ylabel('Safety Buffer (tons)', fontsize=12) + ax.set_title('Safety Buffer vs Sickness Rate', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # ========== 每次医疗用水分析 ========== + medical_waters = np.linspace(3, 15, 13) + results_mw = {'medical_water': [], 'daily_medical': [], 'annual_supply': []} + + for mw in medical_waters: + demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=baseline.comfort_factor, + medical_water_per_event=mw, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=baseline.recycle_rate, + safety_buffer_days=baseline.safety_buffer_days + ) + results_mw['medical_water'].append(mw) + results_mw['daily_medical'].append(demand['daily_medical_tons']) + results_mw['annual_supply'].append(demand['annual_supply_tons']) + + ax = axes[0, 2] + ax.plot(results_mw['medical_water'], results_mw['daily_medical'], 'purple', linewidth=2, marker='^', markersize=5) + ax.axvline(x=5, color='r', linestyle='--', label='Baseline (5 L)') + ax.set_xlabel('Medical Water per Event (L)', fontsize=12) + ax.set_ylabel('Peak Daily Medical Water (tons)', fontsize=12) + ax.set_title('Peak Medical Water vs Per-Event Usage', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # ========== 置信水平分析 ========== + confidence_levels = np.linspace(0.90, 0.999, 20) + results_cl = {'confidence': [], 'daily_medical': [], 'safety_buffer': [], 'z_value': []} + + for cl in confidence_levels: + demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=baseline.comfort_factor, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=cl, + recycle_rate=baseline.recycle_rate, + safety_buffer_days=baseline.safety_buffer_days + ) + results_cl['confidence'].append(cl * 100) + results_cl['daily_medical'].append(demand['daily_medical_tons']) + results_cl['safety_buffer'].append(demand['safety_buffer_tons']) + results_cl['z_value'].append(stats.norm.ppf(cl)) + + ax = axes[1, 0] + ax.plot(results_cl['confidence'], results_cl['daily_medical'], 'orange', linewidth=2, marker='d', markersize=4) + ax.axvline(x=99, color='r', linestyle='--', label='Baseline (99%)') + ax.set_xlabel('Confidence Level (%)', fontsize=12) + ax.set_ylabel('Peak Daily Medical Water (tons)', fontsize=12) + ax.set_title('Peak Medical Water vs Confidence Level', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + ax = axes[1, 1] + ax.plot(results_cl['confidence'], results_cl['z_value'], 'teal', linewidth=2, marker='o', markersize=4) + ax.axvline(x=99, color='r', linestyle='--', label='Baseline (99%)') + ax.set_xlabel('Confidence Level (%)', fontsize=12) + ax.set_ylabel('Z-Value', fontsize=12) + ax.set_title('Z-Value vs Confidence Level', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # ========== 综合影响图 ========== + ax = axes[1, 2] + + # 计算各参数变化对年供水的影响 + baseline_demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=baseline.comfort_factor, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=baseline.recycle_rate, + safety_buffer_days=baseline.safety_buffer_days + ) + baseline_annual = baseline_demand['annual_supply_tons'] + + # 患病率影响 (1% -> 5%) + sr_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, 0.01, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + sr_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, 0.05, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + + # 医疗用水影响 (3L -> 15L) + mw_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, 3, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + mw_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, 15, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + + # 置信水平影响 (95% -> 99.9%) + cl_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + 0.95, baseline.recycle_rate, baseline.safety_buffer_days) + cl_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + 0.999, baseline.recycle_rate, baseline.safety_buffer_days) + + params = ['Sickness Rate\n(1%→5%)', 'Medical Water\n(3L→15L)', 'Confidence\n(95%→99.9%)'] + changes_low = [ + (sr_low['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, + (mw_low['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, + (cl_low['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, + ] + changes_high = [ + (sr_high['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, + (mw_high['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, + (cl_high['annual_supply_tons'] - baseline_annual) / baseline_annual * 100, + ] + + x = np.arange(len(params)) + width = 0.35 + ax.barh(x - width/2, changes_low, width, label='Low Value', color='green', alpha=0.7) + ax.barh(x + width/2, changes_high, width, label='High Value', color='red', alpha=0.7) + ax.axvline(x=0, color='black', linewidth=1) + ax.set_yticks(x) + ax.set_yticklabels(params) + ax.set_xlabel('Change in Annual Supply (%)', fontsize=12) + ax.set_title('Medical Parameters Impact on Annual Supply', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3, axis='x') + + plt.suptitle(f'Sensitivity Analysis: Medical Emergency Parameters\n(α={baseline.comfort_factor}, η={baseline.recycle_rate*100:.0f}%)', + fontsize=14, y=1.02) + plt.tight_layout() + plt.savefig(f'{save_dir}/sensitivity_medical_params.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/sensitivity_medical_params.png") + + return results_sr, results_mw, results_cl + + +def sensitivity_population(baseline: BaselineParameters, save_dir: str): + """ + 人口规模灵敏度分析 + N: 80,000 - 120,000 (±20%) + """ + print("分析人口规模灵敏度...") + + populations = np.linspace(80000, 120000, 21).astype(int) + + results = { + 'population': [], + 'daily_circulation': [], + 'daily_supply': [], + 'annual_supply': [], + 'annual_energy_pj': [], + 'initial_transport': [], + 'capacity_ratio': [], + } + + for N in populations: + demand = calculate_water_demand( + population=N, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=baseline.comfort_factor, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=baseline.recycle_rate, + safety_buffer_days=baseline.safety_buffer_days + ) + + transport = calculate_transport_metrics( + demand, + baseline.daily_elevator_capacity, + baseline.elevator_specific_energy + ) + + results['population'].append(N / 1000) # 千人 + results['daily_circulation'].append(demand['daily_circulation_tons']) + results['daily_supply'].append(demand['daily_supply_tons']) + results['annual_supply'].append(demand['annual_supply_tons']) + results['annual_energy_pj'].append(transport['annual_energy_pj']) + results['initial_transport'].append(demand['initial_transport_tons']) + results['capacity_ratio'].append(demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100) + + # 绘图 + fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + + # 图1: 日循环用水 + ax = axes[0, 0] + ax.plot(results['population'], results['daily_circulation'], 'b-', linewidth=2, marker='o', markersize=4) + ax.axvline(x=100, color='r', linestyle='--', label='Baseline (100k)') + ax.fill_between(results['population'], 0, results['daily_circulation'], alpha=0.2) + ax.set_xlabel('Population (thousands)', fontsize=12) + ax.set_ylabel('Daily Circulation Water (tons)', fontsize=12) + ax.set_title('Daily Circulation Water vs Population', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图2: 日补充量 + ax = axes[0, 1] + ax.plot(results['population'], results['daily_supply'], 'g-', linewidth=2, marker='s', markersize=4) + ax.axvline(x=100, color='r', linestyle='--', label='Baseline (100k)') + ax.set_xlabel('Population (thousands)', fontsize=12) + ax.set_ylabel('Daily Supply (tons)', fontsize=12) + ax.set_title('Daily Water Supply vs Population', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图3: 年能耗 + ax = axes[1, 0] + ax.plot(results['population'], results['annual_energy_pj'], 'purple', linewidth=2, marker='^', markersize=4) + ax.axvline(x=100, color='r', linestyle='--', label='Baseline (100k)') + ax.set_xlabel('Population (thousands)', fontsize=12) + ax.set_ylabel('Annual Energy (PJ)', fontsize=12) + ax.set_title('Annual Transport Energy vs Population', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图4: 运力占比 + ax = axes[1, 1] + ax.plot(results['population'], results['capacity_ratio'], 'orange', linewidth=2, marker='d', markersize=4) + ax.axvline(x=100, color='r', linestyle='--', label='Baseline (100k)') + ax.axhline(y=100, color='gray', linestyle=':', label='Full Capacity') + ax.set_xlabel('Population (thousands)', fontsize=12) + ax.set_ylabel('Elevator Capacity Usage (%)', fontsize=12) + ax.set_title('Elevator Capacity Utilization vs Population', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + plt.suptitle(f'Sensitivity Analysis: Population Size\n(α={baseline.comfort_factor}, η={baseline.recycle_rate*100:.0f}%)', + fontsize=14, y=1.02) + plt.tight_layout() + plt.savefig(f'{save_dir}/sensitivity_population.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/sensitivity_population.png") + + return pd.DataFrame(results) + + +def sensitivity_buffer_days(baseline: BaselineParameters, save_dir: str): + """ + 安全缓冲天数灵敏度分析 + Days: 15 - 60 + """ + print("分析安全缓冲天数灵敏度...") + + buffer_days = np.arange(15, 61, 3) + + results = { + 'buffer_days': [], + 'safety_buffer_tons': [], + 'initial_transport': [], + 'initial_days': [], + 'initial_energy_pj': [], + } + + for days in buffer_days: + demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=baseline.comfort_factor, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=baseline.recycle_rate, + safety_buffer_days=days + ) + + transport = calculate_transport_metrics( + demand, + baseline.daily_elevator_capacity, + baseline.elevator_specific_energy + ) + + results['buffer_days'].append(days) + results['safety_buffer_tons'].append(demand['safety_buffer_tons']) + results['initial_transport'].append(demand['initial_transport_tons']) + results['initial_days'].append(transport['initial_days']) + results['initial_energy_pj'].append(transport['initial_energy_pj']) + + # 绘图 + fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + + # 图1: 安全缓冲量 + ax = axes[0, 0] + ax.plot(results['buffer_days'], results['safety_buffer_tons'], 'b-', linewidth=2, marker='o', markersize=5) + ax.axvline(x=30, color='r', linestyle='--', label='Baseline (30 days)') + ax.set_xlabel('Safety Buffer Days', fontsize=12) + ax.set_ylabel('Safety Buffer (tons)', fontsize=12) + ax.set_title('Safety Buffer Volume vs Buffer Days', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图2: 首批运输量 + ax = axes[0, 1] + ax.plot(results['buffer_days'], results['initial_transport'], 'g-', linewidth=2, marker='s', markersize=5) + ax.axvline(x=30, color='r', linestyle='--', label='Baseline (30 days)') + ax.set_xlabel('Safety Buffer Days', fontsize=12) + ax.set_ylabel('Initial Transport (tons)', fontsize=12) + ax.set_title('Initial Transport Volume vs Buffer Days', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图3: 首批运输天数 + ax = axes[1, 0] + ax.plot(results['buffer_days'], results['initial_days'], 'purple', linewidth=2, marker='^', markersize=5) + ax.axvline(x=30, color='r', linestyle='--', label='Baseline (30 days)') + ax.set_xlabel('Safety Buffer Days', fontsize=12) + ax.set_ylabel('Initial Transport Time (days)', fontsize=12) + ax.set_title('Initial Transport Duration vs Buffer Days', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + # 图4: 首批运输能耗 + ax = axes[1, 1] + ax.plot(results['buffer_days'], results['initial_energy_pj'], 'orange', linewidth=2, marker='d', markersize=5) + ax.axvline(x=30, color='r', linestyle='--', label='Baseline (30 days)') + ax.set_xlabel('Safety Buffer Days', fontsize=12) + ax.set_ylabel('Initial Transport Energy (PJ)', fontsize=12) + ax.set_title('Initial Transport Energy vs Buffer Days', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3) + + plt.suptitle(f'Sensitivity Analysis: Safety Buffer Days\n(α={baseline.comfort_factor}, η={baseline.recycle_rate*100:.0f}%)', + fontsize=14, y=1.02) + plt.tight_layout() + plt.savefig(f'{save_dir}/sensitivity_buffer_days.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/sensitivity_buffer_days.png") + + return pd.DataFrame(results) + + +# ============== 多参数交互分析 ============== + +def tornado_analysis(baseline: BaselineParameters, save_dir: str): + """ + Tornado图 - 多参数灵敏度排序分析 + """ + print("生成Tornado图...") + + # 基准值 + baseline_demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=baseline.comfort_factor, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=baseline.recycle_rate, + safety_buffer_days=baseline.safety_buffer_days + ) + baseline_annual = baseline_demand['annual_supply_tons'] + baseline_initial = baseline_demand['initial_transport_tons'] + + # 定义参数范围 + params = [ + ('Recycle Rate (η)', 'recycle_rate', 0.80, 0.95, baseline.recycle_rate), + ('Comfort Factor (α)', 'comfort_factor', 25, 100, baseline.comfort_factor), + ('Population (N)', 'population', 80000, 120000, baseline.population), + ('Sickness Rate', 'sickness_rate', 0.01, 0.04, baseline.sickness_rate), + ('Medical Water/Event', 'medical_water', 3, 10, baseline.medical_water_per_event), + ('Buffer Days', 'buffer_days', 15, 45, baseline.safety_buffer_days), + ('Confidence Level', 'confidence', 0.95, 0.999, baseline.confidence_level), + ] + + results_annual = [] + results_initial = [] + + for name, param_type, low, high, base_val in params: + # 低值计算 + if param_type == 'recycle_rate': + demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, low, baseline.safety_buffer_days) + demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, high, baseline.safety_buffer_days) + elif param_type == 'comfort_factor': + demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + low, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + high, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + elif param_type == 'population': + demand_low = calculate_water_demand(int(low), baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + demand_high = calculate_water_demand(int(high), baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + elif param_type == 'sickness_rate': + demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, low, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, high, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + elif param_type == 'medical_water': + demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, low, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, high, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days) + elif param_type == 'buffer_days': + demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, int(low)) + demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, int(high)) + elif param_type == 'confidence': + demand_low = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + low, baseline.recycle_rate, baseline.safety_buffer_days) + demand_high = calculate_water_demand(baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + high, baseline.recycle_rate, baseline.safety_buffer_days) + + # 计算变化百分比 + change_low_annual = (demand_low['annual_supply_tons'] - baseline_annual) / baseline_annual * 100 + change_high_annual = (demand_high['annual_supply_tons'] - baseline_annual) / baseline_annual * 100 + change_low_initial = (demand_low['initial_transport_tons'] - baseline_initial) / baseline_initial * 100 + change_high_initial = (demand_high['initial_transport_tons'] - baseline_initial) / baseline_initial * 100 + + # 确保排序一致性 (swing = |high - low|) + swing_annual = abs(change_high_annual - change_low_annual) + swing_initial = abs(change_high_initial - change_low_initial) + + results_annual.append({ + 'param': name, + 'low': min(change_low_annual, change_high_annual), + 'high': max(change_low_annual, change_high_annual), + 'swing': swing_annual + }) + results_initial.append({ + 'param': name, + 'low': min(change_low_initial, change_high_initial), + 'high': max(change_low_initial, change_high_initial), + 'swing': swing_initial + }) + + # 按swing排序 + results_annual = sorted(results_annual, key=lambda x: x['swing'], reverse=True) + results_initial = sorted(results_initial, key=lambda x: x['swing'], reverse=True) + + # 绘图 + fig, axes = plt.subplots(1, 2, figsize=(16, 8)) + + # 图1: 年补充量Tornado + ax = axes[0] + y_pos = np.arange(len(results_annual)) + params_sorted = [r['param'] for r in results_annual] + lows = [r['low'] for r in results_annual] + highs = [r['high'] for r in results_annual] + + # 绘制条形图 + for i, (l, h) in enumerate(zip(lows, highs)): + if l < 0: + ax.barh(i, l, color='green', alpha=0.7, height=0.6) + if h > 0: + ax.barh(i, h, color='red', alpha=0.7, height=0.6) + if l >= 0: + ax.barh(i, l, left=0, color='green', alpha=0.7, height=0.6) + if h <= 0: + ax.barh(i, h, left=0, color='red', alpha=0.7, height=0.6) + # 如果跨越0,绘制完整范围 + if l < 0 < h: + pass # 已经绘制 + elif l >= 0: + ax.barh(i, h - l, left=l, color='orange', alpha=0.7, height=0.6) + elif h <= 0: + ax.barh(i, h - l, left=l, color='orange', alpha=0.7, height=0.6) + + ax.axvline(x=0, color='black', linewidth=1.5) + ax.set_yticks(y_pos) + ax.set_yticklabels(params_sorted) + ax.set_xlabel('Change in Annual Supply (%)', fontsize=12) + ax.set_title('Tornado Diagram: Annual Water Supply', fontsize=14) + ax.grid(True, alpha=0.3, axis='x') + + # 图2: 首批运输量Tornado + ax = axes[1] + params_sorted = [r['param'] for r in results_initial] + lows = [r['low'] for r in results_initial] + highs = [r['high'] for r in results_initial] + + for i, (l, h) in enumerate(zip(lows, highs)): + width = h - l + left = l + color = 'steelblue' if width > 0 else 'gray' + ax.barh(i, width, left=left, color=color, alpha=0.7, height=0.6) + + ax.axvline(x=0, color='black', linewidth=1.5) + ax.set_yticks(y_pos) + ax.set_yticklabels(params_sorted) + ax.set_xlabel('Change in Initial Transport (%)', fontsize=12) + ax.set_title('Tornado Diagram: Initial Transport Volume', fontsize=14) + ax.grid(True, alpha=0.3, axis='x') + + # 添加图例说明 + from matplotlib.patches import Patch + legend_elements = [ + Patch(facecolor='green', alpha=0.7, label='Decrease'), + Patch(facecolor='red', alpha=0.7, label='Increase'), + ] + axes[0].legend(handles=legend_elements, loc='lower right') + + plt.suptitle('Multi-Parameter Sensitivity Analysis (Tornado Diagram)\nBaseline: α=50, η=90%, N=100k', + fontsize=14, y=1.02) + plt.tight_layout() + plt.savefig(f'{save_dir}/tornado_analysis.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/tornado_analysis.png") + + return results_annual, results_initial + + +def interaction_heatmap(baseline: BaselineParameters, save_dir: str): + """ + 双参数交互热力图 - α vs η + """ + print("生成双参数交互热力图...") + + alphas = np.array([1, 25, 50, 100, 150, 200, 250]) + etas = np.array([0.70, 0.75, 0.80, 0.85, 0.90, 0.95]) + + # 年补充量矩阵 + annual_matrix = np.zeros((len(etas), len(alphas))) + # 运力占比矩阵 + capacity_matrix = np.zeros((len(etas), len(alphas))) + + for i, eta in enumerate(etas): + for j, alpha in enumerate(alphas): + demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=alpha, + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=eta, + safety_buffer_days=baseline.safety_buffer_days + ) + annual_matrix[i, j] = demand['annual_supply_tons'] / 1000 # 千吨 + capacity_matrix[i, j] = demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100 + + fig, axes = plt.subplots(1, 2, figsize=(16, 7)) + + # 图1: 年补充量热力图 + ax = axes[0] + im = ax.imshow(annual_matrix, cmap='YlOrRd', aspect='auto') + ax.set_xticks(range(len(alphas))) + ax.set_xticklabels([f'{a}' for a in alphas]) + ax.set_yticks(range(len(etas))) + ax.set_yticklabels([f'{e*100:.0f}%' for e in etas]) + ax.set_xlabel('Comfort Factor (α)', fontsize=12) + ax.set_ylabel('Recycle Rate (η)', fontsize=12) + ax.set_title('Annual Water Supply (kt)', fontsize=13) + + # 添加数值标注 + for i in range(len(etas)): + for j in range(len(alphas)): + text_color = 'white' if annual_matrix[i, j] > annual_matrix.max() * 0.6 else 'black' + ax.text(j, i, f'{annual_matrix[i, j]:.0f}', ha='center', va='center', fontsize=9, color=text_color) + + plt.colorbar(im, ax=ax, label='Annual Supply (kt)') + + # 图2: 运力占比热力图 + ax = axes[1] + im = ax.imshow(capacity_matrix, cmap='RdYlGn_r', aspect='auto', vmin=0, vmax=150) + ax.set_xticks(range(len(alphas))) + ax.set_xticklabels([f'{a}' for a in alphas]) + ax.set_yticks(range(len(etas))) + ax.set_yticklabels([f'{e*100:.0f}%' for e in etas]) + ax.set_xlabel('Comfort Factor (α)', fontsize=12) + ax.set_ylabel('Recycle Rate (η)', fontsize=12) + ax.set_title('Elevator Capacity Usage (%)', fontsize=13) + + # 添加数值标注 + for i in range(len(etas)): + for j in range(len(alphas)): + val = capacity_matrix[i, j] + text_color = 'white' if val > 60 else 'black' + ax.text(j, i, f'{val:.0f}%', ha='center', va='center', fontsize=9, color=text_color) + + # 添加100%等高线 + cbar = plt.colorbar(im, ax=ax, label='Capacity Usage (%)') + + plt.suptitle('Two-Parameter Interaction Analysis: α vs η\n(N=100,000, Buffer=30 days)', + fontsize=14, y=1.02) + plt.tight_layout() + plt.savefig(f'{save_dir}/interaction_heatmap.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/interaction_heatmap.png") + + return annual_matrix, capacity_matrix + + +def three_param_surface(baseline: BaselineParameters, save_dir: str): + """ + 三参数交互3D曲面图 + """ + print("生成三参数3D曲面图...") + + alphas = np.linspace(1, 200, 20) + etas = np.linspace(0.75, 0.95, 20) + + A, E = np.meshgrid(alphas, etas) + Z = np.zeros_like(A) + + for i in range(len(etas)): + for j in range(len(alphas)): + demand = calculate_water_demand( + population=baseline.population, + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=alphas[j], + medical_water_per_event=baseline.medical_water_per_event, + sickness_rate=baseline.sickness_rate, + confidence_level=baseline.confidence_level, + recycle_rate=etas[i], + safety_buffer_days=baseline.safety_buffer_days + ) + Z[i, j] = demand['annual_supply_tons'] / 1000 # 千吨 + + fig = plt.figure(figsize=(14, 10)) + ax = fig.add_subplot(111, projection='3d') + + surf = ax.plot_surface(A, E * 100, Z, cmap='viridis', alpha=0.8, edgecolor='none') + + # 添加基准点 + baseline_demand = calculate_water_demand( + baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days + ) + ax.scatter([baseline.comfort_factor], [baseline.recycle_rate * 100], + [baseline_demand['annual_supply_tons'] / 1000], + color='red', s=100, label='Baseline', marker='*') + + ax.set_xlabel('Comfort Factor (α)', fontsize=11) + ax.set_ylabel('Recycle Rate (%)', fontsize=11) + ax.set_zlabel('Annual Supply (kt)', fontsize=11) + ax.set_title('3D Surface: Annual Water Supply\nas Function of α and η', fontsize=14) + + fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, label='Annual Supply (kt)') + ax.legend() + + plt.tight_layout() + plt.savefig(f'{save_dir}/three_param_surface.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/three_param_surface.png") + + return Z + + +# ============== 最坏情况分析 ============== + +def worst_case_analysis(baseline: BaselineParameters, save_dir: str): + """ + 最坏情况压力测试分析 + """ + print("进行最坏情况分析...") + + # 定义场景 + scenarios = { + 'Baseline': { + 'alpha': baseline.comfort_factor, + 'eta': baseline.recycle_rate, + 'sickness': baseline.sickness_rate, + 'population': baseline.population, + 'buffer': baseline.safety_buffer_days, + 'medical_water': baseline.medical_water_per_event, + }, + 'Survival Mode': { + 'alpha': 1, + 'eta': 0.90, + 'sickness': 0.02, + 'population': 100000, + 'buffer': 30, + 'medical_water': 5, + }, + 'Comfort Mode': { + 'alpha': 50, + 'eta': 0.90, + 'sickness': 0.02, + 'population': 100000, + 'buffer': 30, + 'medical_water': 5, + }, + 'Luxury Mode': { + 'alpha': 250, + 'eta': 0.90, + 'sickness': 0.02, + 'population': 100000, + 'buffer': 30, + 'medical_water': 5, + }, + 'Recycle Degradation': { + 'alpha': 50, + 'eta': 0.80, + 'sickness': 0.02, + 'population': 100000, + 'buffer': 30, + 'medical_water': 5, + }, + 'Epidemic Outbreak': { + 'alpha': 50, + 'eta': 0.90, + 'sickness': 0.05, + 'population': 100000, + 'buffer': 45, + 'medical_water': 10, + }, + 'Population Surge': { + 'alpha': 50, + 'eta': 0.90, + 'sickness': 0.02, + 'population': 120000, + 'buffer': 30, + 'medical_water': 5, + }, + 'Worst Case': { + 'alpha': 250, + 'eta': 0.80, + 'sickness': 0.05, + 'population': 120000, + 'buffer': 45, + 'medical_water': 10, + }, + 'Moderate Stress': { + 'alpha': 100, + 'eta': 0.85, + 'sickness': 0.03, + 'population': 110000, + 'buffer': 40, + 'medical_water': 7, + }, + } + + results = [] + + for name, params in scenarios.items(): + demand = calculate_water_demand( + population=params['population'], + survival_water=baseline.survival_water, + hygiene_water_base=baseline.hygiene_water_base, + comfort_factor=params['alpha'], + medical_water_per_event=params['medical_water'], + sickness_rate=params['sickness'], + confidence_level=baseline.confidence_level, + recycle_rate=params['eta'], + safety_buffer_days=params['buffer'] + ) + + transport = calculate_transport_metrics( + demand, + baseline.daily_elevator_capacity, + baseline.elevator_specific_energy + ) + + capacity_ratio = demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100 + + results.append({ + 'scenario': name, + 'alpha': params['alpha'], + 'eta': params['eta'] * 100, + 'sickness': params['sickness'] * 100, + 'population': params['population'] / 1000, + 'buffer': params['buffer'], + 'daily_supply': demand['daily_supply_tons'], + 'annual_supply': demand['annual_supply_tons'], + 'initial_transport': demand['initial_transport_tons'], + 'annual_energy_pj': transport['annual_energy_pj'], + 'capacity_ratio': capacity_ratio, + 'feasible': capacity_ratio < 100, + }) + + df = pd.DataFrame(results) + + # 绘图 + fig, axes = plt.subplots(2, 2, figsize=(16, 14)) + + # 图1: 年补充量对比 + ax = axes[0, 0] + colors = ['green' if r['feasible'] else 'red' for r in results] + bars = ax.barh(range(len(results)), [r['annual_supply'] / 1000 for r in results], color=colors, alpha=0.7) + ax.axvline(x=baseline.total_elevator_capacity / 1000, color='red', linestyle='--', linewidth=2, label='Elevator Capacity') + ax.set_yticks(range(len(results))) + ax.set_yticklabels([r['scenario'] for r in results]) + ax.set_xlabel('Annual Supply (kt)', fontsize=12) + ax.set_title('Annual Water Supply by Scenario', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3, axis='x') + + # 添加数值标注 + for i, bar in enumerate(bars): + width = bar.get_width() + ax.text(width + 5, bar.get_y() + bar.get_height()/2, f'{width:.0f}', + va='center', fontsize=9) + + # 图2: 运力占比 + ax = axes[0, 1] + colors = ['green' if r['feasible'] else 'red' for r in results] + bars = ax.barh(range(len(results)), [r['capacity_ratio'] for r in results], color=colors, alpha=0.7) + ax.axvline(x=100, color='red', linestyle='--', linewidth=2, label='100% Capacity') + ax.set_yticks(range(len(results))) + ax.set_yticklabels([r['scenario'] for r in results]) + ax.set_xlabel('Elevator Capacity Usage (%)', fontsize=12) + ax.set_title('Capacity Utilization by Scenario', fontsize=13) + ax.legend() + ax.grid(True, alpha=0.3, axis='x') + + for i, bar in enumerate(bars): + width = bar.get_width() + ax.text(width + 2, bar.get_y() + bar.get_height()/2, f'{width:.1f}%', + va='center', fontsize=9) + + # 图3: 年能耗对比 + ax = axes[1, 0] + ax.bar(range(len(results)), [r['annual_energy_pj'] for r in results], color='purple', alpha=0.7) + ax.set_xticks(range(len(results))) + ax.set_xticklabels([r['scenario'] for r in results], rotation=45, ha='right', fontsize=9) + ax.set_ylabel('Annual Energy (PJ)', fontsize=12) + ax.set_title('Annual Transport Energy by Scenario', fontsize=13) + ax.grid(True, alpha=0.3, axis='y') + + # 图4: 首批运输量 + ax = axes[1, 1] + ax.bar(range(len(results)), [r['initial_transport'] / 1000 for r in results], color='teal', alpha=0.7) + ax.set_xticks(range(len(results))) + ax.set_xticklabels([r['scenario'] for r in results], rotation=45, ha='right', fontsize=9) + ax.set_ylabel('Initial Transport (kt)', fontsize=12) + ax.set_title('Initial Transport Volume by Scenario', fontsize=13) + ax.grid(True, alpha=0.3, axis='y') + + plt.suptitle('Worst Case Analysis: Stress Test Scenarios', fontsize=14, y=1.02) + plt.tight_layout() + plt.savefig(f'{save_dir}/worst_case_analysis.png', dpi=150, bbox_inches='tight') + print(f" 保存: {save_dir}/worst_case_analysis.png") + + # 保存详细结果表 + df.to_csv(f'{save_dir}/worst_case_results.csv', index=False) + print(f" 保存: {save_dir}/worst_case_results.csv") + + return df + + +def generate_summary_report(baseline: BaselineParameters, save_dir: str): + """ + 生成灵敏度分析总结报告 + """ + print("生成总结报告...") + + report = [] + report.append("=" * 100) + report.append("TASK 3: WATER SUPPLY SENSITIVITY ANALYSIS SUMMARY") + report.append("=" * 100) + + report.append("\n## 基准参数") + report.append(f"- 人口: {baseline.population:,}") + report.append(f"- 舒适度因子 (α): {baseline.comfort_factor}") + report.append(f"- 水回收效率 (η): {baseline.recycle_rate * 100:.0f}%") + report.append(f"- 患病率: {baseline.sickness_rate * 100:.1f}%") + report.append(f"- 医疗用水: {baseline.medical_water_per_event} L/次") + report.append(f"- 置信水平: {baseline.confidence_level * 100:.1f}%") + report.append(f"- 安全缓冲: {baseline.safety_buffer_days} 天") + + # 计算基准值 + baseline_demand = calculate_water_demand( + baseline.population, baseline.survival_water, baseline.hygiene_water_base, + baseline.comfort_factor, baseline.medical_water_per_event, baseline.sickness_rate, + baseline.confidence_level, baseline.recycle_rate, baseline.safety_buffer_days + ) + baseline_transport = calculate_transport_metrics( + baseline_demand, baseline.daily_elevator_capacity, baseline.elevator_specific_energy + ) + + report.append(f"\n## 基准水需求") + report.append(f"- 每日补充量: {baseline_demand['daily_supply_tons']:.1f} 吨") + report.append(f"- 年补充量: {baseline_demand['annual_supply_tons']:.1f} 吨") + report.append(f"- 首批运输量: {baseline_demand['initial_transport_tons']:.1f} 吨") + report.append(f"- 年能耗: {baseline_transport['annual_energy_pj']:.4f} PJ") + report.append(f"- 运力占比: {baseline_demand['annual_supply_tons'] / baseline.total_elevator_capacity * 100:.2f}%") + + report.append("\n" + "=" * 100) + report.append("## 关键灵敏度发现") + report.append("=" * 100) + + report.append(""" +### 1. 水回收效率 (η) - 影响程度: ★★★★★ +- 范围: 70% - 95% +- η从90%降至80%时,日补充量翻倍 +- 这是对年运输需求影响最大的参数 +- 建议: 优先投资水回收系统维护和升级 + +### 2. 舒适度因子 (α) - 影响程度: ★★★★★ +- 范围: 1 - 300 +- α=250时年补充量是α=1时的35倍 +- 在高舒适度下可能超出电梯运力 +- 建议: 初期采用生存标准,逐步提升舒适度 + +### 3. 人口规模 (N) - 影响程度: ★★★★☆ +- 范围: ±20% (80k - 120k) +- 线性影响,20%人口增加导致20%需求增加 +- 建议: 规划时预留弹性容量 + +### 4. 医疗紧急参数 - 影响程度: ★★☆☆☆ +- 患病率(1%-5%)和医疗用水(3-15L)对年补充量影响较小 +- 主要影响安全缓冲和首批运输量 +- 建议: 采用保守参数确保医疗安全 + +### 5. 安全缓冲天数 - 影响程度: ★★★☆☆ +- 范围: 15 - 60天 +- 主要影响首批运输量,不影响年运输总量 +- 建议: 保持30天缓冲作为运输中断容忍度 +""") + + report.append("\n" + "=" * 100) + report.append("## 最坏情况分析结论") + report.append("=" * 100) + + report.append(""" +### 可行性边界 +- 最坏情况 (α=250, η=80%, N=120k): 年需求约 562 kt,超出电梯运力 +- 中度压力 (α=100, η=85%, N=110k): 年需求约 132 kt,仍可承受 +- 系统崩溃临界点: 约 η < 82% + α > 200 组合 + +### 风险缓解建议 +1. 水回收系统冗余设计,确保η≥85% +2. 分阶段提升舒适度标准 +3. 维持混合运输能力作为备用 +4. 建立月球本地水源开发计划 +""") + + report_text = "\n".join(report) + + with open(f'{save_dir}/sensitivity_summary_report.txt', 'w', encoding='utf-8') as f: + f.write(report_text) + print(f" 保存: {save_dir}/sensitivity_summary_report.txt") + + return report_text + + +# ============== 主程序 ============== + +def run_full_sensitivity_analysis(): + """运行完整的灵敏度分析""" + + print("=" * 80) + print("任务三:月球殖民地水需求灵敏度分析") + print("=" * 80) + + save_dir = '/Volumes/Files/code/mm/20260130_b/p3' + + # 初始化基准参数 + baseline = BaselineParameters() + + print(f"\n基准参数:") + print(f" - 人口: {baseline.population:,}") + print(f" - 舒适度因子: {baseline.comfort_factor}") + print(f" - 水回收效率: {baseline.recycle_rate * 100:.0f}%") + print(f" - 患病率: {baseline.sickness_rate * 100:.1f}%") + print(f" - 安全缓冲: {baseline.safety_buffer_days} 天") + + print("\n" + "=" * 80) + print("开始灵敏度分析...") + print("=" * 80) + + # 1. 单参数灵敏度分析 + print("\n[1/7] 水回收效率灵敏度分析") + df_recycle = sensitivity_recycle_rate(baseline, save_dir) + + print("\n[2/7] 舒适度因子灵敏度分析") + df_comfort = sensitivity_comfort_factor(baseline, save_dir) + + print("\n[3/7] 医疗参数灵敏度分析") + results_medical = sensitivity_medical_params(baseline, save_dir) + + print("\n[4/7] 人口规模灵敏度分析") + df_population = sensitivity_population(baseline, save_dir) + + print("\n[5/7] 安全缓冲天数灵敏度分析") + df_buffer = sensitivity_buffer_days(baseline, save_dir) + + # 2. 多参数交互分析 + print("\n[6/7] 多参数交互分析") + tornado_results = tornado_analysis(baseline, save_dir) + heatmap_data = interaction_heatmap(baseline, save_dir) + surface_data = three_param_surface(baseline, save_dir) + + # 3. 最坏情况分析 + print("\n[7/7] 最坏情况分析") + worst_case_df = worst_case_analysis(baseline, save_dir) + + # 4. 生成总结报告 + print("\n生成总结报告...") + summary = generate_summary_report(baseline, save_dir) + + print("\n" + "=" * 80) + print("灵敏度分析完成!") + print("=" * 80) + + print(f"\n生成的文件:") + print(f" - sensitivity_recycle_rate.png") + print(f" - sensitivity_comfort_factor.png") + print(f" - sensitivity_medical_params.png") + print(f" - sensitivity_population.png") + print(f" - sensitivity_buffer_days.png") + print(f" - tornado_analysis.png") + print(f" - interaction_heatmap.png") + print(f" - three_param_surface.png") + print(f" - worst_case_analysis.png") + print(f" - worst_case_results.csv") + print(f" - sensitivity_summary_report.txt") + + return { + 'recycle': df_recycle, + 'comfort': df_comfort, + 'population': df_population, + 'buffer': df_buffer, + 'worst_case': worst_case_df, + } + + +if __name__ == "__main__": + results = run_full_sensitivity_analysis() diff --git a/plane/__pycache__/cost_analysis.cpython-314.pyc b/plane/__pycache__/cost_analysis.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50d86d58f0ec9622421058ee7fc2cfca69e921e0 GIT binary patch literal 34025 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 UYghtw@7E9hcB?{D#Ad|*1cg0~jQ{`u literal 0 HcmV?d00001 diff --git a/plane/__pycache__/cost_analysis.cpython-38.pyc b/plane/__pycache__/cost_analysis.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11c4d04a43e62e7f5945ff92330d64c3f1740efd GIT binary patch literal 19332 zcmb_^d3aRUm1otfeNkyE35m@Qn?+@ikPw??uq=e+5Q89yIPr^BCl_*uouc|;Q zSLFla1ut@(*h$<594W~pCLLqP@#kPLA)WN}GBZ72f4xk1*B_k?NvM-aGLz0sM%m_f z&V98Yz}=H?q)+GF?cMFYckl1~&bj(vMTOUbpQ^7OkM4fhV)+q8%75I5+>5{DzgR66 zVbLtYDwLR2Q}}Ar?0j{MIyIM-@@z5ps7Lc~Sc!Q@eVQL(yKo5SkWKdp*A9zt<~-E zGK7L+r¨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 literal 0 HcmV?d00001 diff --git a/plane/cost_analysis.py b/plane/cost_analysis.py index 44d53f2..7517d0c 100644 --- a/plane/cost_analysis.py +++ b/plane/cost_analysis.py @@ -556,6 +556,143 @@ def plot_comprehensive_summary(data, save_path='aviation_cost_summary.png'): return fig +# ============== 图表6: 燃油占比趋势(简洁版,中低饱和度)============== + +def plot_fuel_share_trend_simple(data, save_path='fuel_share_trend.png'): + """绘制燃油成本占总成本的比例趋势 - 简洁版,无标题,中低饱和度色调""" + + years = data['years'] + fuel_cents = data['fuel_cents'] + total_cents = data['total_cents'] + + # 计算燃油占比 + fuel_share = (fuel_cents / total_cents) * 100 + + # 创建图表 - 更小但保持2:1比例 + fig, ax1 = plt.subplots(figsize=(10, 5)) + + # 中低饱和度色调 + color1 = '#B87373' # 柔和的红色/玫瑰色 + color2 = '#6B8FAF' # 柔和的蓝色 + color3 = '#7AAE7A' # 柔和的绿色 + + # 绘制燃油占比(左轴) + ax1.fill_between(years, 0, fuel_share, alpha=0.25, color=color1) + line1, = ax1.plot(years, fuel_share, 'o-', color=color1, linewidth=2, + markersize=6, label='Fuel Share (%)') + ax1.set_xlabel('Year', fontsize=11) + ax1.set_ylabel('Fuel as % of Total Operating Cost', fontsize=11, color=color1) + ax1.tick_params(axis='y', labelcolor=color1) + ax1.set_ylim(0, 45) + + # 添加平均线 + avg_share = np.mean(fuel_share) + ax1.axhline(y=avg_share, color=color1, linestyle='--', linewidth=1.2, alpha=0.6) + ax1.text(years[-1]+0.5, avg_share+1, f'Avg: {avg_share:.1f}%', + fontsize=10, color=color1, fontweight='bold') + + # 右轴:绝对成本 + ax2 = ax1.twinx() + line2, = ax2.plot(years, total_cents, 's--', color=color2, linewidth=1.8, + markersize=5, alpha=0.75, label='Total CASM (cents)') + line3, = ax2.plot(years, fuel_cents, '^--', color=color3, linewidth=1.8, + markersize=5, alpha=0.75, label='Fuel CASM (cents)') + ax2.set_ylabel('Cost per ASM (cents)', fontsize=11, color=color2) + ax2.tick_params(axis='y', labelcolor=color2) + + # 标注关键年份 + # 2008年油价高峰 + idx_2008 = np.where(years == 2008)[0][0] + ax1.annotate(f'2008 Oil Crisis\n{fuel_share[idx_2008]:.1f}%', + xy=(2008, fuel_share[idx_2008]), + xytext=(2005, fuel_share[idx_2008]+8), + fontsize=9, ha='center', + arrowprops=dict(arrowstyle='->', color='#888888'), + bbox=dict(boxstyle='round,pad=0.3', facecolor='#FFF5E6', alpha=0.8)) + + # 2015年油价低谷 + idx_2015 = np.where(years == 2015)[0][0] + ax1.annotate(f'2015 Oil Crash\n{fuel_share[idx_2015]:.1f}%', + xy=(2015, fuel_share[idx_2015]), + xytext=(2017, fuel_share[idx_2015]-8), + fontsize=9, ha='center', + arrowprops=dict(arrowstyle='->', color='#888888'), + bbox=dict(boxstyle='round,pad=0.3', facecolor='#E6F3FA', alpha=0.8)) + + # 图例 + lines = [line1, line2, line3] + labels = [l.get_label() for l in lines] + ax1.legend(lines, labels, loc='upper left', fontsize=10) + + # 添加数据来源 + fig.text(0.99, 0.01, 'Data Source: MIT Airline Data Project / US DOT Form 41', + fontsize=8, ha='right', style='italic', alpha=0.6) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"图表已保存: {save_path}") + + return fig + + +# ============== 图表7: 燃油-总成本相关性散点图(单独版)============== + +def plot_fuel_total_correlation_scatter(data, save_path='fuel_total_correlation.png'): + """绘制燃油成本与总成本的相关性散点图 - 单独版,无标题,中低饱和度色调""" + + years = data['years'] + fuel = data['fuel_cents'] + total = data['total_cents'] + + # 计算相关系数 + correlation = np.corrcoef(fuel, total)[0, 1] + + # 线性回归 + coeffs = np.polyfit(fuel, total, 1) + poly = np.poly1d(coeffs) + fuel_range = np.linspace(fuel.min(), fuel.max(), 100) + + # 创建图表 - 与fuel_share_trend类似的尺寸比例 + fig, ax = plt.subplots(figsize=(10, 5)) + + # 中低饱和度色调 - 与fuel_share_trend类似但不完全相同 + scatter_cmap = 'YlGnBu' # 柔和的黄-绿-蓝渐变色 + line_color = '#9B7B6B' # 柔和的棕红色 + text_bg_color = '#D4E8D4' # 柔和的淡绿色 + + # 散点图 + scatter = ax.scatter(fuel, total, c=years, cmap=scatter_cmap, s=90, alpha=0.85, + edgecolors='white', linewidth=1.2) + + # 回归线 + ax.plot(fuel_range, poly(fuel_range), '--', color=line_color, linewidth=2, + label=f'Linear Fit (R²={correlation**2:.3f})') + + # 颜色条 + cbar = plt.colorbar(scatter, ax=ax) + cbar.set_label('Year', fontsize=10) + + ax.set_xlabel('Fuel Cost per ASM (cents)', fontsize=11) + ax.set_ylabel('Total Cost per ASM (cents)', fontsize=11) + ax.legend(fontsize=10, loc='lower right') + ax.grid(True, alpha=0.3) + + # 添加相关性解释 + ax.text(0.05, 0.95, f'Pearson r = {correlation:.3f}\nEnergy drives ~{correlation**2*100:.0f}% of cost variance', + transform=ax.transAxes, fontsize=10, verticalalignment='top', + bbox=dict(boxstyle='round', facecolor=text_bg_color, alpha=0.8)) + + # 添加数据来源 + fig.text(0.99, 0.01, 'Data Source: MIT Airline Data Project / US DOT Form 41', + fontsize=8, ha='right', style='italic', alpha=0.6) + + plt.tight_layout() + plt.savefig(save_path, dpi=150, bbox_inches='tight') + print(f"图表已保存: {save_path}") + + return fig + + # ============== 主程序 ============== if __name__ == "__main__": diff --git a/plane/fuel_share_trend.png b/plane/fuel_share_trend.png index 0479843102249ee9e5d5af22ec3d80473f82754a..f9395d042ca23dd862ad814ff6722354adb40f01 100644 GIT binary patch literal 141090 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

2|>O#N1K z9vuxxzLxGcowr(;9wEhc!B!^!oCgMNNZ5npiN{#Q8vP}EVK>3yn^TY>o0@M~j~_nP zx>Ee;aJZKQbWKsFU2?J(6i@_Mt#3~NR*3RdzL&AgC~;ve6&z^Ys#U+{v#U^LaxxOSY;g?2Cl{G@mjNIFQK@#C#z_nIA+kK z!1YN@Ox!FJ6hdEK`S~8QVp%;A>rV-HAw}6OSwh21$_t=0$(AH#(Ifd6MWhTFMZ)}6 z9s1phGYKIxx72q)d?3smD>k33E=UCLhX&r|uB_^J32GWYbs~^b05dbZN@BR=h3Wco zG|D;0(?hL&h_5Z9t_fLkeMy3d&Ki6*vv<_x(prQUP$gXv=*DIvUWcjZY_AqWR#vK+NU4fc-M2& zvZC+ClB~5iww=B(g02rQG z^$1K+Xra78fKotfAD34IAH&Ok~%Fce?6f^2-_3?TE^rTFhKrI`dSk*tEtgYp*s5sf(Av?&j=UzdU zuS3`p$yk%><;wV|rN>YlACFAJZI10O)m*2ebCE6C!cnzEs|7SjRS?H?R`A2!3+{vB zkXrljL~=8KZp)Nw_W4h<(4J^k8XEx{jbz=nMG$B~f5Y8{E7AekI|WeGm`uS3yz78eY*@PPRjX1$j2*t@3>U#s6Dni73U{)e~M~96? z2y`yASc2*oWa>!ND01v$M80A-qqV(>os^p;!EQp*NW?dd+j8=A{MyQeQu|f)?bIlv}B($m5kOx=bBd z>vLcy8S!QFV#{9JRaq; zdVg8@H=-uST&6LVf$w1O~-jLX;8dvo>C2noZTOu22 z>GFnn%|H_-%1{i{V6Fi{Xj6=%As<=8+|e{~@JG=>txr;q4HwTk+uU@#ZB#BI`J79x zBb9|7Wvi?Ep=@34y#3e(MuPA#<6}+rl*5@<(a^wOaD{V#ni>2Iw^>#%--qy2bvgwd zx#&EzlsY~B{0|?5e1n7QuIL)ab$-UfxT*rw_w5uGmIw2L*q`fPG@MmHJaF)QR?$`j zQ^q37*Ywe$$lzeIXTYV>ZUHzky<|M&0T znN{RPFD}r~pH*Rd@iMM{$szs51(us>TM_3_Qs(mVdecldGofe!Zgu|Ln}FPTUzWOa zbZ73I4|pFikGCaDC&+|XYw9BN42!N?yw5z~Y+B!AD+^2(Md|mMV&Rrf=KueNoX-kb zoxeQV)YPgsC22qB+Wfk$d{G8zM0vgMd%3PaDZPg^Er+mH&gF#qLs=*k5-@|Y4l*XrvW-iZP!bRF+{ZE5i9QK0ofya6*o1Z`muk)DGvO@AmqY*Hk6dG z^IeadyuXWCm9)vPz%z!|`#QM5TLobhzXuUbKO(cyS?`sN`h{-!=;h^w=rk|i;|%#? ztL&5xpZ-QTx(js+Y?~_DEkgS z*8Gq+|Gi(dbM{F1@1wb6x!<9@4^|uTpcfJo1|*CIVk7Nh0yl5=(<4W$ccr|}O}*F~ z3Vfs;&uGkDU7lM4SwG)HQIgWG3AjJU1-APMsQ^tP9xA{>m$e_G78=TcZ0~b8hBp5I z_{P~bE9VPP={w_e%TS4;-ih}C2z0?Y_ESiTP3d`uoc1O$2Auog~`acpy9halntmDh(p&lV?+wmWu=( zM7OCktS!8XUY}+Fp+H7#1Yq~UumUMJw;%365JP!Qt4>q!iAG=S#pzP>5S*Y4MOIa# z+ZOFx+?tTSWc@UUjy6d0XOT%M$V=}glB1>~K=c<;6zVd$xkf4KBDWOhk~;_a0^sC8 z;lVT;lg;a=w`Fh*$(k>}2Yx8Q^e4)f_edZ-ADMW*DF#BVH6L#UbK)IYgo7QKvlE&D%m7G#~i?%mK$G56Hn3TBJ&NYuwV zV)s?(=kAd00xAYP;e0)ci7$5#@<9u&y)*oe2bytIt$K+t4g4g+sW`2=LwiijU!635Mt?q@-+0+zBT`l4mZt@Jz0^CP+37L0h01th!GC#z}xO zplGKYR3aoYOz8n8xTdL79;r<91?f=dJkw)Mns{@wz{st#Lp4?Xf}~3##WYKcfInpE z8oboPs%$Mic?w@R?g413qRmgj(42R}DDbBlq%O}-Wm%we>iFf0=(CoL_g`^>svhGS zRx+*s!w;ZeVD0ha-@QsD{WVw`S1Mj5!A7Rh{s$D>C;q7d>t2(?h% zdDxSoXD2kDuV!QHm`d*yYaCdFC<~?3YrWYhoDv+yP(lko%E;?PLVqD>D_#vpJMJ61VFCS8+I6m!jq}G_w*4ZCtx#R4|3NS> zaSa8qn@*^{Gh>(1p{3a7T$<{bZGOAO>+|F)F=s+;n{_&aK9I^Pz6+{aI!OwGt)vmo z#R^T3#SAQ13Y}uK;l>oWxM*Ne83Hcw}%v0rO0cdOH8s{T$60 zR;4J=@pqye&IU9+iM?jtNtH%`+2gu=^Me8o+td7xdo%zpy-txK7v(CT;h(Ob*r}7gZ9L09ai)kpde?GIwq7OA9Vi}5iSrC2` zlpbUAJLZfdnb;uADd#heq0liSSPHphT`^#$s6jNnp@X0Tw)wKBHf0Sq#cf^q)|N$& z3r2R~5~no{1pw!Sl8Q0Q>CB2?@5oe&@xPCs*AQA|FLh0j8c~j5qxizml=OZ|A`(9Q ztRg*HX}>|bwL^qKLzYuOLm7$(i3{BSpxIFBs1{ZYt&9|r+L0^E#|s+J=et-$vEY5} zg&-Rf$?MT=kaYmlVrtrbCCA~H;o9y$1)(q6d-auGu@}d(4l>_`#nQXKnxXJ_D%x58 z&V|Ma>sF%1XAMD3FmI*&P4K61>rzqXPx&UpJAF^=e2PQ&g zGdoDfXyaloS2Mu9sr|?k{u+5AfQ#j0h)^k7`8-0#8Q7p_R>vmdVlq+Wnku}vD}46O z_2UdFAg_i8!_u!q`cM)grd8m{CPR(;q0ZV~>H@6<`ZHzx2aDt!Ggr{Can5Bey2wUu zd*k>HfVlRWXFdwlMXOEE$lIK*IVdmdcs@kQE4@^5ZLTS~64xeIMh=~JNo~hTjC0Pp z8!MJ6V@0Q1=p^ds74TdeE_w}uuZ-#NJwy|wJ+TxP>KVB475(*8DW^P5|CU_Ro?@mA z&k64;yUM_OpeX-l)H?G#(X35xh3f<%rZOrmf9=KEc2LmTVC#al>FWreghWj9Tp1uPVbv`Tu9m$X zKHC4c&l8AM(g$L`&90z%1#zKh4Xu$!aV{-*2J-dNFDZhY3z}92x(iz^?v~%uSmsD9 zkw>#++8O66kx#R^uN{=X{*zIwlDm=NtCbIJ1W~3PD%4amOb;7LMDkQS?-q!sDw^Et zdp-(&m_x5g<p(4tQCT?k&JT>xXF{!Q{ud24*+O;_dqwaUK7gz}ZpMthh-3L?i8T3S}$&{b|HL>@VA_usfV)5UPJ zW+7(qTrAN_Rw*W__|viaOlhp5wyZ532S-1(i<1fl2MUvCs~YJ+f-v_f;57POlcx|n zeF7(Zi1lr}56oiYRW{AnLH}tM%i88}IS&3S5${%`KfongX?HVg^o^A?lWb?yn+W~hJ*hY|5Sf7>=N+Y*l8}Kl zi&vKYMnJ9@fAXGNAphgayUP~@nMwK^K%VCJ(=1UeB1|Qe&V_~oge?ZQxr+Eel!W9$ z!1`Ysb^&fjDM53FqYiEoWFvqQum4DTKKtrF_5Os=^{M08%*%HcvreQ15MvYQRnj%j zboKVqixUuezX-nh+H#?^oR5uic=Ji5ZSI&h#p%=!r;!$Mj4u-vG0i9{x za4!?9vO?f+09Q7S?jRwk>syOT%W#boU;rmzSxCf5Rg5jc`O1V{-+;_&lXZS!hbUTa z^SxM-YXOS^E+$k6%?~7s_Sx;kl%l}-M45LksGNep)Cw1pO&QL@HkAjT`)89qt*OhAJUA`eVKOUmcr%KNR~W|GgP5VBe+^_7W$E z+)Z#XFffv78{7IU%tizz5^dWAUJ9yzi!kS!y%n$InyAU{a!Co~-wyZRK(FrFqT`og zyh6`i$%I?{!_N6n&Oy=$y)UxVu!T+T*I`=)COOvieWp~_T^5s3e-EHG?p1v+Hbu;2Ft?bPxBuawG?m)L9YN5d8)f+*xZb#N;qB{ zM!cn0Fv9_P2_{16gvcfiNhMWc!anr!k+e|s^`unqxjZX6|xcqEt^Lkw~q)c^Z$Kx9XhjRqc0{4^WvhuJD%pC z!B!YxB&avp3PVKnY_Cb>39&(*%Dy?C)b0GOTRy@QxMRy3zgTZ^4-1Y^Y{AR~Xdl_x zPDn9@WddXXt_O-!&wQynq0wBo7Ka!^cORSmaz60r2@oIploZM~#CvJ262XL<^U-vS zD2E@37~iI~7I zH+7!@Mf3!Jg+}b{K#=Ai9|9(O^5Qn`93|=ANJhi;ah=0zxWcN$cMJc4%yW6DVhqAw z#(yguiwMYg6@kBhw{3GFOu>ul?X))3JJLY!G`9?z52Y~|USVDfYdczcRLujD8fM?N zb~g-WwrWZek_TCahPAJks8$4S#29Mh`t^Mb(CQgk8RciMAzQnM`P#}ybH4SK=-6E& zr)U-iUgC$mWblqap-T+haYQj9n~uLQ2pa3sh|En^B z?7mCN&=Y9)-MCPMgo0mggBtr{TIpbAoU(I>O=}LKksoUt9_D7dPX z5YeI|CL^ot^&QoZIEb~XxMy~5d3o^eQfne@DV!D8t;Moh9ISSJ73~KU!3ZK$IfzO* zqL`)0&otb&Z+~(l{?+%~pnu8q2^aaQ?Bhe{u3lr|5fC34nsfR?%66)6@A>YN7?(^K zN(Z%_?;Vsca~QgWFE%v(Y1%a0t%-h=eouiJ>)o`G^S^%`Rd+15Ny_6!zi_MRzp_HG z-_Q~%EZcE`84HrH=3l8fnt9x^04q(Ue=)!PCFft3$-)9_QM{hrM`U7LE6K;7YlFgK zy@s#+Rtf(EwB-K7Fev!NOgU*jz^*GelBV95mok`r5SmONerSYCymS+4!v`hm#;=<5 zXIRWr?>`fK^uROl`FlZ4u9G5~S5k@mqaz*}D_#`en$va7XB9kYEE4QTl6Y+`VfHvG16(`S(OusYY9tm! z0{K3>u3mnohjp%yMkw~IuVCMpd<@ATOC=tn;XqzRSbWjdVc$M|kbNZmsDGzV+~ZwD z*t?w1_!dFpCL=1`Ji$B)RM=`BvDtkXObv^H@>ee+*(Vtc5Ub2;TnEMcFfL84T(M_a z_GN1b#OT+gm`oD_BjiV3pRb*e*sub9{dIDC0zw9xpIA8fm>O6)2fCTd$)LBp?V&UM zy(Y4i7D;pdOG!O79LE1`d^+VK-~vneZ{3tzfAH~A(#YY@e~7SP@~7zk8Wk8g+RBit zxX}raSc=@Kjvqn)$8Qk;;pDf4ESwAH{QmQ*BE+d^PksxD5*#yix@0H+Uj3(>JpDW?>{I!~zo*^hdn!vjeQPSsDI@&v-GXqc>pwS) zyxHPp7{Pzcq>u3b{Yz_K{6WoX!uY`XA60ZP$ojIyRma8Ow>`FhezvsCydn7SMvz;3 z7pE%!6b8FbG^%@_F&NM&e?(VcW77wt2EOkX=P?Tk#Qa(P&q@K>?x#mdu~1ztQB<`- zCcw#=zdOwsWSbze>^I%AHt1Rtip-H{j`U>hy8WLg4$oYsi0ev!1rD$Tu>B;_`u z%{wcHWk?V_f5DJA*a|-nM{vlw!PgI+T&%+t_s3!O>u#Ci^WzfAHmJr{^;E_9rb3O?3u>9Q4;X*`Ua6bnp0jjsl2BYt9vkj2I zlbfg1=6ah&L+}uRTh&5@*%<7tRj%DZp1@p8srH8(>n-8tcOL!6vcVo+S+;4Xb6Q;W zT_B&)oDTVx;8@Z0psxKTC;RMWd{*Uz=a>I$DOT6XWu%h1@Jn>KtRn(>ihhwVuq6^j zv06ndwJ&Q<&$dzWD(@$%@TqEc{U2X&Ydpq&nI%!h;ny#wrOoD%$~U}%0%uSTl;=BL zt^UWHi*UJig~r!Y)QC~FlLN@PDscuF(MH8_oA#ck5=LxuB1Wr9@G=` zYF(3%a5xaDTwZQ9D#kDA>=cw&{GSgch-dXDSvdDV;?3R+Z{J}vox`tL7N0I!x#kvr zhmFgfYV0LPyU7jFv9W(h{(GB{n&=6kotd#{O?Qf z6L8i>Y7&PF>eH)}4Q|WDLop@A#l@3t?8%K|RUV{hIgQ)5{cspPNmkr@Jl-F=7LNj5WYhLAF{J_9Kjk|aK zU2FD#?yLq$62`W@a9(N%BA%uj-@#T(62sHd%73z~C${z7^gEnW(66sLFf|nU=Z~G6 z7{ln3kw-gUGbI9Ya&oTU@L>_POwlKbcDF!&riK2Jr}^JAB+Z-cUZ zbD~A^i2vx%%8}iV!|gvmLzkA8I7Jm$$WojMK3h%#k)Vy|@MMO0=)08Q*CZHWo_6P`SG*d9*X_HW@$_6(5ftv8y0ri^b!u z-eIYqRF0gD_fZ_WxAyi;9L2drn{~KQ_0toc3Dr7$1ErLdr~nJ24r=*c=Z7 zkDqQnM83+qh7nfVe|)9oc+cpVfDvZ)VW1?EiHRi-`1JJj9OmA-rsm`jdceTTkD8ed zLk6yszm1Nc*5|t}{|Hd`{u{gMCRVyV=8^JS)O&wqoCUrCv5Vy|;|$51{%ytIxoTg(eM8gPSMr-wX`vC;aH%w%sp zM2dXedh&54AK^ubvGH-<68mwUd%5}?qN1X3fYrge}+z$gGu7)bwO2fpQAY+ zp2fw*M#iJnpdB|sT8fb`_Eh&vY)OGKU0dt!R?CN#&G*`WLW&In_n`AWT2D4@iGV@WZ$uuSp{J+UDRaDptO={_{ydC| zEGQ80oVzjZXF`qg9Y2^AM)~%5&R&I+%Yu8ly1JT-4w{UNt*mf+B=&7RD?fh33p9CG zUF{v$6A{ewjexfjr5v-`NUkmwlfL67EsZg@KejD1^mSOLBj>M?*&^c)M~= ze9b*1b)qo&kP9`zF1f4hd9XW|+|t`iGPa(y{qFN;J_*Bn_X6Q&y{Ktv>qB{~sTq&Q zwySYah^u%>(gG)nO2hu1epPdDDYb8Y=@^6L_NYu510gZ7shb-$Oxt&IFP9SxFDs`+ zN!i$NGI;Np92|}xi-&}SfP>_JbU|~4h{0otAL8N84!!HBUss~=^fzszrrO$C+cyHF zs;1zE2pgm{HOav%GIyvbllD#3XAhFCh8i85sWT?=+5h4bYVY;?KF6H1iwg!Sw`?}S z-zWja)FD7iOUox9@T{by#DAAg*iJ=s5P};93g_H~;7FLhLW|mwj=vnv;Qou$b8jFy zuw`2LhtOuqHEP1C@A;;<0Wv2(GI6NC|IUjSFD7dJFne9-QJ?L{B~Z04Lk6#$M}Ozl zFrZdv6YbBS;Ha?_*&tZe*BjV+aps6;hl@khL*=oTQfavTe`C~cMQ^hDirYDPvy0|R=AjTGX^YVhWxnip9T zgmaXP&XmADGbN)x(ceIOmB+Rn))_zlN6()>7kRpI+1E+=@8<6zOccy!9%rYwS&Uv@ zk93;tq(Rkcs*4A_d2>N*XX5$y(#IE{fcFk!^rnVT+D?%~PipXq@o-*IEXQN; z!Vhe12~imas{_kVFkkDK;YxXWD<~-RkAAf2`C2^f7^y0^ZX=P0Q(Lx;GrrsH3e!o) zHgjDko9XNuA$G3jM|u%T!rE9)7X{A?7%Uf~Uc2@Gx)WnDJv~h#lU`}}#%F0gk6upD zXLkK5>dme6<0VVUhSpZxKQ+hRqmNtYtsXsUB3Bpl%LA9G?JXcD=M+W(haQ=jFe85< zwms_Pw$Z1!Hso_S^Z}+wIXPWDI$AlFkWk0PKp}44-{^R6XlGHo24DWRLy!12^q(0W zE^5PAR3H4p;S0$GD4|56nVFd#2u?|>!JucVn9AGkzr|}HIH@jI_#5#Jl7|D5b!GyS z1V%e&IxU0PVB$6H=4v%}@4|M#q~*CPIlOg~L-VM|sD4 zyi22HS3mX)!|p^D$QT}YUiIE$R$s)>%?J zuHGMd*75jb%d7`x>h8;k-xw(58{BqhUXjPl*Fv}Y@vh`CJ8EL6=4g|GJ`tMi@>#rS z9*bOXTl|>0I(XlH5^~Qda~e7!+givaRs(oFF;G#jUQs3cfG?ST|H`nwgSRHk&ky7L z`STO-_W@iT;McD5FgaF(2bla)bNI*;Lz5-pexS+3Eu%fMBZ#x)l%Z#jx9pDtZ@{T# z)n1Eziwi%pRmAngH?i8jde)35Z!o)NH4S{dn4}r$tG4a7^>yc~Cw#<0C4+wFk764P z-xcEE**aSz0-m6bnP*%bp7v5jQt9hY9r!hEve&9GNV)F<93iXOw!Tg;{`7nSR~j5R zXfiszHbKAQrdaZ@-W}MzQ4T^WI~NM0=~X)WF(Y`PDtwZc~o#s zn-@Iy*ob1+6+={QhH4@T6_RQ^kfA!iuz>dAOL{y)Z(nx5qpzdym(Q0@W;uX&quX34#qYixERLvV-^o@Qb zSQ8iwt)bODStP0-e!CJD9zIzyerQ*pn(DFrr>PJomfFC4#UUdfabL7ik-53Km7QHP zvg7=R4rh3M(C{1jZ0)=VpU-TmWosJ)>eDl?j1+F)CPmh_DO;JxtXS{yxYu?{W+u)! zWIa>U<+;;{X`?2EcKKAul9BN750_dpWf~ zUB|_3=2Yd-vx|BTWiYkX6%$px_brcw4BglQ4^eUoVi}SU=Rar);gpadH5ipCWoRu3 zgY$IgWN;6D*Bsf%q*mwWlaB8VewlC(nM!7d!6LNEZ;~&)zm!s4&2aYYS)|@1Yfel| zT&u+-mWp8=^;oHb9N%r>{j1*LVKh=T>_F^D_%sX*!ke2FD%YCnT01%#wrh^P?%uoC-LgQ= zeaqC;v~(u!K3KoQ$fGZ+_t(7ON~ZRH=e5kwUxrn}*x1^dio0(ot*S~i<~B|A2F`r2 z_ZS&jg)9d&%1zrIN4s;ddDUx|pG=Q=teiz1fWMYyBB_m4mq3a)?nxI0uZ`OffjM=m zo?e5P5f~RoiTnr=tv=G{VA_q>1<8pPp7st71|s3wFpnxx*uEKDPaoX7wxK(C45H&T z#^bsxcT=wm3=KUa@S4D6tUWs1&xdRs5*qeL$NM$M9tTh(%gM{1wX0YbA|xc72%s{Q zx_6Hf>bGRr`ObsgZ-dFW(|^}N1V$3*)WSmY?0cW;2S45Chtqbbj66xfZ9>WQP^RYz zs2Tmy8<(ug0m%S`|0Ji;E2L)?WutkffK0&u@zFav83{#jSUK>b0IuG?sYiDO8tkl{^b*~U*=hW*Z zy}3A$=j?3z9J?N@Mfx<>)}r31u?yLcAtmj3sP4-OVqq`|&i@5wivRE6mH*2iX^J>6~X4_=1yqMPN;jxDI?q;j@He4Y>Yy&xhl&^-#wwm z^#)|3_B zX-6D4#1V;;QdfE1zH0Mcj$SeT&!0ctz=>1&gd=Hcp~v5o3m3eojLY0lkA>i}eKK&o zlQJ9$cfdo0DrB*cJTLAjT|^56tcT(EhW}zK4gUeK5_T%-FFZo zGS%Kb`}VMDsCw(#sAC8BnrS2iBtU}{pjQ3+_b&nn!G{zT6}?MK!$ct^^+eCnQqR=> z=+obyL_D^*+S}Vn&IKWrKH}=sB@YE*N#-_tPG-VeUH>;1YFX~CG zyNOhS!0B4D^WjL8Hsiw?0py$5TJQd z`z}lD^+mF=!q0!;sGsM=62ZoN!AOC$_V~+4c%of7Uh;0Ivw!mFsU;(p`IU&n1Pbsbzzoh9r(W^8 znbjQ{50h&hX;01W)<1USCX_#y4z@i5Vce_Lw4--o9KrPq5j#UZI}MB{po^B)ubCN> zpXDw{5hg2(i5NNkjVCG|7fPH?$UuY^J=wfGnudl9NJxenH!U@FDs^2ph2&_~{s23;GWtYL{lgn`art{-OOzRvEbuT^&iTQWzjvmD+D@!cyk3f2*E7kiG+xu&a z*?Fk|Pax?dq-GqR0J5pSKDLK)W~Za(;1*oU^v>Eeq~KKlJR8_WP2I@YmJq5I677M< zqNk4<^M5=HvON$#({wrzaOS73WdD1f&%tnj_z}?vszmrqb+`7m`6S~W;hDRS!mObLkfeS8-s)Q z08RhC`~(5C0G5!`)g9Ji^kJr@r*AqwtU0DC;F<;$R?O^r*_Hs{U^Yhkv@FrM5}O~@ znc3NKpdapdC-OKL!M#qhI>;oa00Bx|D|U2rT!m2ou=zR^yaI+^n_A#uCoVGXD)nz6 zPiXaN6@pDXfWe5rhO|?c}bc2-3qpu7yMTA~}12lFRFLQCJdmPlWcnGf$w{Vf$-7K!Hl}aAzA0BSoU7tfoL^MAvetOWEaLq=+ zAhONu!Biu9agM<}{`h=so7~;I=kI^9I~y2b1Nf$8Pm=lZ5fTJ~zJLGTqG$Q|F+UXf zl1~}2ad50{ZO#6SmT}!LQSqwE%Ztp)x`IzYfDQ>^xqf|D(F@d7SU@LTymDnx@l(rB z@H1UGx`hl2g_hlKOkn$6lyRoUH}dfC_~tb9cGwo1iHGMLwWtK6_YO1Y$8rp-66WWv zAjFhDS*F$1)lJXLEHth=lQ)u@!+Z5=EKtdC3Hc+-`elwl!*Ln9O`b&(^e%z++OP0E zh^vR4|E{boJ~fpE0FB`)k1wK^$?51is=f9FI|jdgU4?Q4|E(GhAyJ$gL4ztAxn_pS znh5oRP1!Nva?OxQsxLjMXt8OZalEasuL9HnLI!w$bybey0iFey8U6`Q4!d*q#-ksC zY$~tcRZCd+BXS;yB~y#vvO5!nSE7f8zkd(zn7MBPs!ES*MBuu!|Q)(%E-Ww%QG-Ca?8?^ z9a5whvtJlg;i8zCnZ@>(3e7AnO$&!{iHN>=D&YN99LbziClPBGIOeb@jAu{wyi+)i z{oK#rAL|J4O2@^o90CFY3^s57?60ppeE6__!8s->if_s_UeKCM*naF6R3nn2O2qj1 zPjki(Zv$D-_wC!J($G_&7KZYS=DLK(H+HJ`nW8EnjfFZmJ83}JZuDJM)mvcFVqrU; zk=+h#gmDcwZg6mMZP27As<72JG@v6RhbohzqI`ea&3*l-$;!^2z5Ny-&ydhiMXV)$ ze*VS7c}P?czE2@@fRv0(MoB4nuWW1U$%6+EzCPM)nsflnP`BK9!RJ7D-`-L5ttXVo z&d$!LFx>u?@fvkIyFVXlHq&C53{IX7@{c6V`zr&QGZQd^9gm3UeR;VaQUCtl9=Nn$ zvt5Z$R$hIwq*EMoFK-BrBrwvveH)_|$mPx~t!%eHWpnd?{$#v+hXA5WPi{m%382X+%|{zV(1#PF+@-QXrv0Sh5#Q!(ECJCi_31nfp; zb+zF@dwPC;bj|VM%EOLOPVHPsvN|AHYwPaLc>g{CSv-EzX5gh80fk>!Sg14R`|N%A zRQ2`K#1kC+LN($lMgi@TTYBA1BP z%v9rdS-cAz?Ca}J8ME7jczA2nclP%_Rpsk&-GvGZ=(X&Zo#4e;Sy?|Mm%03=gl+cl zovw~f>+;AKU8sE#@WxhX%zcht@BV#dRn^V%&SIM(ApYpe%E};WkWx}MH;2<*d!(eo zMjj9l@O5Zt+OZ72j?LQI`r@<0$sa#{z@jk7R)7PFiHW()$=P7{CA%*3?+v|A_s*O- z^IFVZ0IFGLQPBi2B=EDugj%=9D_kR8$J}vz|NeEna^(szC+u(lF?*8RGboR&umwjs zQc^R=hR)qoSHCd4-MSiXkZOsMqQ z7pkhNYHVtXj*C-JQ3)&WoS0y`bm>CTCllA^o3@m?t|ZMW z>6@T(b3ZOE;t+Z^uQ%|9YI!%A!}0YAyVbJ>j;7ao>v{e51Y&c+;hTk z-1ZhSKj!9U*^5E7 zs}`NcP-mT|q&%8uGGL>lICX5e%#G^JU{N$QAMwP_i@uFmU4_BCBYr9GenEhQZIl3@ zcyxSxn^TXtqO~=Lyu3ULB0(6qG!hDmCh)OJs;ciHDnv@`;f6NJJbfw(^#QVdVq;~^ z&ENMddjKvE>*xuYj()kb^3{)%Z>~G(lsYi;oiFv-nG6~&a|!}DI3_yUug{8=lQR@R zPwTBA@yf@<0^qFSRB2Cud%)EPLLNuLz|aj|PR7OM8knA$nHd}m*g2Q%lN-1T&({-J zg2tAX*y!jw*w>f2x!>pHsH}TcxUS3sU{E&X^`uN+hl?^y;Ua8tC}6F|@;-ffpOFy= z^dcC>M>wK`Ep}*C6|bL>y|TTl>ynUA9Q^7d#s?1%s={FvW8-&v*J0-`tgK|Fr~3oi z75!+WB>aQaW)WgxLBxy}-EXcVS4Bh9wl>}JZRKNj_B51HIGC82w!;MhK;)VV#0w^` z$?e+Nr+g$MxuR7>#cTKroFOY4+h52&S0P>R|Msm3Zt_{j%!7J=JP3%Gh$5oc(h~|J z0AlOhJoDU#h z^Y{06n5e~oE$+v7<;~0XH4wQVe_>$o_GuN?*|U!U^1N^^Xzvj2BcrnN4dCGgmOTux zT8a@DQowD2s3GAj0VN4Fbt^n~or)))hP-m}@-lOCyDjrvW7``2@yNwW+85^M0Y*@C z`U7hb3l8BNy{MeBGMYB0p_g3f)+?S(+EiCp*MYvi$xS_tZoHW>*WJJ7*x1;DpIk>d z=Cn;sr-Qd?>F8)KT=4uQouf#ob3R-T1kMj1KlZ(GvM8i^tJbnGkg2Sq zVg|B-&LnX<5Q8*KGD%7%BNy+!Zt-WVsslhD1;}T>|Cm6Y0zhPVX^{IJ4UO8L6|TeJ z%f0pg+Rl3xL|kxRkt>~A;S+(f`{ zKV&pc>uZJY`mDo+dPuwulAAcJ?j{`c?v;^KpGV3z!SV%b!u>Yn4gc=-~%!n;89AFY&|p*ZFv;B%f- zyzT5%fjCT1Tjn$e-&qNmxtxN+nbm{!p7n*yLqkpY&;de@nlIuwh!RdgTupb4=vR@ z05tv#RLiF8Yf+agpkOK0=Ya%n7tA^sjW&VD^svW!Mi^MzO}&L2|Cq67&gKpZ!<69E z_BMa(R=VZy#Y18Z=QXQAgfnga|C+nu zYo8raVUx=k9IOH0G>y&yKry}2(9tn6%@&GO0~-y#r_6ZA$FLdGw%=N7E-i>lG*Pyi zfC)AsC3dPPZtDd0ex8`1g)-P^CG%S+N|+)jxeHaHynq5T>H9v3RNhs0sUc*UKmbTK=X|8#{9UGS0SIqkV7h)FMauYj+$x7?YPL*RVtu zKB59`wl4TY)+Ngv>yRb)8?O72mJtKSNs5ZH-LDU^pw%#(C+jU&^hzc;IXQj1QW<-s zq;~JyCm}8#4As%p)s^|+;hLspik+?PLUa3&=!v5LRk=U!2oOU~4O)O^Kn7$f`Yq`4 zT1t}Q-@-<(!@&Y`Dy`H=w7OM{K5+WboDXpv9;A5rGu_)EA~A-9zck_s zl>+~T#pA(Zv7q@X`(39H2Hbeush?k1_>`U=|0tcNPNVxO7C1RM5kv{O=rF%uR5XZd zlO$$6DVJ!Z)GAv!+>t7LWSnRF_ka%Z>O-FaH}mE%`ZxGG95gp|EVQV#a=1_aVu%_qG|_P$)Ut;EzU`E zLx#7nx|RUD$tFr!ibrIZWA{X_xuZTz=2K-UxDA}bIDdTV+ta7J0Q~HIQwd39!4+2J z7i81?y9Dak23nG}53(ndQlr}1^yl&sqd_VA@kO_N_%Mw=W3o<)wqg5r9aYuf#saxI zrTH3?95?@yUx@CD(D$Er%9_NwGryW+&9v7lUha8SYh>vkQdXu6tc7T~792c0KHjds zwV0L*@`6jIqM{NjbN(kdRlp!KY5LQOXDwgkaVdbi)9(&6>KYr@Vt8-_d6j)@I)QJ zvTgbFsSf%_Zi08a)ewpX)Y-b3vq@OF-$UZ9Z`;LpHn~d=Fx+N$9%|Y_?i?LoC^D0N zXESrtLkhqO9^i9vaRGfdcXu~H36W5l=&&MwJAC`?TMew&KZJPVxP6klxp_jKQvK(* zV1NLr?D4Xo;82PV_3KnI<3^Y_J<~WzWc$TLE#?VHof=K9SS1SU(8JTbQ!!T~f`Zrx z8il~Y=-I5$`F!=1UI7ynWk3464!%G=&(vkm_2t{f#=nMJl1Ds-!lqA#zhG6A_%Z?c z&6%n%4=*e({sFgQ;5|hf%FWV$P5?pH{`G+i!So6#2nPhCN(|r9+u9z{M<2*ut=A{zfi+rX0-^+q=$;7R2J+d9x~kl13k_f8mb|4apJ@Y@efe0 zT)+I%nn!k-P#?G3Qer{d(uW~uQgZU2l#k7qUTlK6#(Y-sQtpd;zZqs2I7NL4lMNdH zFRzhz`OE=o?Zu12?bkjBs#S*kVjtv`+u^k^`Pha6fw)6XF4}VWv*1W|DzFOqM~6K{ z-MddLpdVMyGMsmJETORQ0dl<=gQYN|M%vQKoBV!agT*;5^!tsFkY-FAsu)63r7cPR zbLrfLZ5=2BPT)z)Ess*2FFq@-X6`ZF-VlVkahh9Kl$ zzU&x$be&aDF+{h&e3@3$OM{A5R#pa?5nMPvzj5$Uhoj`tqb3J5X|4ghW%p2#DH2h| zxVo)$dJQU2El-??-1+Pib z_V)I2UAB)1F;-aVt}ZSvx&TrdT$5amQeXu#TT5*G6ba)Q3L!(MCwm8!fF)T z*)x?Hu-MRcBWogg?3l%jPMV>?r{Y4Lt@b(RUXcbyoD$CvtJ;L_zbYm!p3~t7X_{W+ z3D$;b z#WxN%QaSy$yIr*IZ1#ze>KzRrRuaxn61m?aZUa^?I&tIA-rp9$%cE?$-{O@9x}@{x z&vS5aY~bgwMD4dX9u?+86H=Y5eZOtId35fiy1H*y52QSJs_K@2l-f28y-L&mk9?j; zKoUCkgn$q?Yofb2^?~2HW^~ubj|b5!1d{Lev`!F0u{lYds3V?R$xog%(dntAbVW1N z7*PaZ7xc@KUY6b?eJ-pd@_Zhi{osJ=9yz;T#+_W`%=ihi2}5C@lCS$V*WaWop4K1h zxm#-vu7@8U7sy~RPEn6h@E`=4eOF!Yw#z!~ihOArg5O(_>Oe}%v=}VZjP_gg{gn)7 zr~ows0|7i|k!fCR=(INRdOZLj^IXnP00*=^&?3Zb*kOwa(xmF^Bt2sazb?YAThQ@;W$GW;d2Nq^}!ZSelrW)I97Ct&K;L9+Sk1 zY@5ZNKYxz&wiQfbEWf){DjCZXzY@0+K%iXgAODftl+2epdrPF07sG>J1qA*GSoZQb zURjc!iz^R`on53w9M8RS-7o# z-+lj#&zMwK=OpY}A`VizJgto!f*QIEqIQalO%G^%u`4@26vl>L1e^|e4{4%jY#df$ zWi>OW?uJI$*R5u`qmLS%QlQk37#VYCtm_^>8;P<~5j{=(~qg;yP&_AcK(SV|KF-eBMgCQ)Ul0N$c7ZzuKd1%{ zuE(fh!}Va~8Hu2`-_&ct>gwujmoI9#rkRHMd!qUzcJ3s9ya(R~qohRyGeStI|5=(H zCJL9gdef#&-dGAy9|OyaGsMBh#ns)F(4J&6Ir|WV6IW1pXkL89ZfV2%!L-Z%?(T9% zGz;`}s=P-4&^IF@+D-)wmv%WP?9o-KMMkZ+mkKT7Az22UMRSt zyvSoTRynYAiB;ZoFp5d+5z=Tw5?16&M3pXN){<=M5$2=NFj2gCyjb5P|L0gD%r zVL0NqAVbVBkaUB_b;C-4L#cSl6!v*mR@Skdul2nY3ZQ-9%0$5}2gt$!`u*6k1YjXQ zKY!3;w~GrW@57;lW{Qf6s)9>8H8UfQ4d971EEzpBtA#{`l?@U}AyMiua%|U{06V)* z^eFKO%aP=XK4@-eE&xS%OqhT`)Wp5)W!xTZ_TW zB%BzSnMOu}phLohLST-p^hKcVhzoKy4NNI^gK)w9^Fr3j2#r<0c>`3agEa`jaRJmv zzzv|ucYMvn3dbAU&_>?Addx&RkUIoU`z=q^fDK@d@4dI*^4ZJ%g+>KZ0@GENMk^vb zt39|;So+(gW&={OBMMpD=*S0bkK`qBHuai4r}^FwwgxQAV#ZYD6TF5JW@?5-m|j8H6Yi zJxYkEiC#zfj_3Kk?|Q%YukY{gtYv9q*17Mq@4c^m?dy_cct?xo3dVJHH8lK0oN@W1Qr$Z{o$+KSBnr978XH`|8))bOMRY8PyD|xa88!W|9Txf zT8Hv~{fLqG|Ie4TD>=<(0~^vK*Lr?ZcDmI;Yj!wVanJn5?dOc{AFG_cKKEP1)AY^F zVGdu`xD4|km3KRn82mOS;HyKgW4@vz&i0>%ovgmiZvE)=Rq$TD*OSfyl_(Okh{L}# z_fGa!d3`-shF*X0n3U+7`}#uW>2RTzo|^CBUz=x=&Z*RFvW5`e#hs)?t6H~SvDQ-_ zO4r7=59Nlh)w1RePxjY8*msa06E<6yzC01y+4`v-5V7|C-Keu!xrI^1`pvt=S+Q$7 zOMM>#|5zOZcg|Nm-5SyAzcDfVcTrSSbm8w`Q4S7{%v-L;z3JRBj6!DmR`p&Yn#tEw zMqT;3yF(t?E)TqXZ28ftw*^D^b$&*0Q_y}Y`qJv6F<|{h92HaQUf@!Bj$&R?O2EzH zRCOjXTa)E#*{d^6!FM?nA94{B6KCGI&C;6#FU%6Nvz-lD7rA+_&Lc~CJz#HRQu3Ls zZvizYLecE0d)WTz@q>WbkLd2Ja-j$1R&%GPr!dn}lT2Q%t2fQx=gM#PJ`s8f8*{t^ zL>;3Y{ALvJL>3rHwvf|xo_CqjzZKsWO8PqT*1!~k=ZrYz{`y=hdA;|w2A8a?#qX~# z_?6H09$yjWA1eYq`a!l1EKmo9%Ky43X4hhZ0Dk`u^_jTF%HDJtk(whd$9(c*<*O`_=B7v(4W= zIvZSD89O2n`jVN%OeD-kif{A1*6mq`Wb$=mnR(sE%8dv&3a9J6%chktPI-abHP@k3 zkEhO9=t}PH-MgV7Wd1&@8r@xrIa}w*$ID9x{k47)d$Kaj`=T43=A#gHRHgqy`t~0t zBo@luo5}Y$HnuMp*a(Qk4L&-0dZS#NCO6hcN==-Mx1cd-Q#6SZne;Q78zP!mK#Jr% zSRXeS$dxNRztdAVbMqvBhl<31c`z?%?HFvE#;I(Z$|hHkc`p;D1KDKi2BOfExp5^ZTy!QK->(45Wj^4se|pfpI?g8V zuRT@oEoK*f{H6woYUEq7*XmMqxfkrRK3wnl`D|4n-||&sOyWS!v9Yl|Ky;1<(+XvF3zuZdr z+nC*I-j*VqWf3#6zm325)UqlRJ$-nQLEo^B5X~)G-j0%`3 zncQwGF~hQ9Hx0>iDJkvU#@|=y=DR<+OP8z4MMsQ4=U*>We{su|CwS*qQp}r!5T64J zgJIJ3qt=Ua_W(QK)GmFMnaj%0=c;WTsiO_uYB+D|vxp<6j2vJKEeMT`P_ubz828qF z{C)ArE9Hpr0QG3bQW%#i^OMlMq~1Kt!Lx=>pX4yu2zHwWAKYpzXz?@q>_Ix+{^p#W zwD+t>0B0%5YfK-jchl>0MDR}0>ET?2+2E&;{nFA8d&_wdrP*Rhj?WnA>FK-7w+Yzf z%NP)`j5=o|f?SL@jXT%E zVJZ1Ev|cAmN5{)~dOzFaOi4&JZ#yWPtM!qi)kwx(US_-~60-8YbDti(rG|>D@cFo< ze~IDk9`R+cDm(tunH1r|#$N3$d~ylx&tf7f-Sxb|H(P?iSd!cQAmEXxvJ^}2k` zH_#@+f;Yx0UhJ)obl31p@`cG3J4}W?d}uL~cK$~rDb8{_KGyJ&QngjJL!A8eRc=*K z_ch=qj*gB>q(MNSSB##8hllR~p^iV=Gj5OH{{?J!-8V9cm=)K3E>;1zuoc zU~FyJMYd)9MpvgX@Q;UX7dmU^gJYk^EbXD|p^W#eb;=4c*5Pb##6V=Q@3~ajnvlm} zM*^)W2?g>3^%)4i_rERcJSL0$mc9UKlC}4hQsc}x>s#-I&Lrd3aE$3U#y--`WJsfc zrFD&qk?Uyblka8b1`c0x^I2 z3*~!0IuDwBngrsbWM>V?^G1DxP($hWye#G2Q<@fMA?Pp!GRFSX1+XZ=$SoiN>b#V% z1@f`+K%TO3Vdn0)pL=d#MnVy493;d*IGpjqFcj#zea;N{`^W zj0AFFiY)r>7Vf*n`jE#?gReaIWe!MPx*`L1aW|2VL>l)^{H?CUDSlTM$3Y{B zgbh4rfNBy}L_#f)f*sDxDFzPzJ6API-wh$Z<$;Q9-jkQCX*wYSv?+_MR%Q9kAS5yG zO`>UW6_+?!NPq9%V};+(!=8U?Y{ zBE#7t_wN6hs&#wW{y7mXGn0dE+BHdw1=FmzRY;m0iK)I1Cng zUC>0k;$y(tccXP8t0372UQxU3Vcsw~`^L7q$N*>`?X>KdH7)aZyFITuCZ?HGDy(YT zmEI=PDs&EI6wdqpk<&?nlG>mBJ1&YuuA9r!n=W3ki=(9j6-|Efj=Foa!yB6y^xw5Zc zB@i{fefxH5tjeH0oHi-$1d}%zoHQA(AMxISdSKDo!p^39gN=UlT9rsa2t;uDr)+oMt3j8zmW|p>_5f;4=Ao~jStZ8>Zq4aCE?fq=I z%cKz2RrF6%2ml}C=Y6sTN|kBaU5qh_=p$aD6e_zAxd*>Zm}>Vnqn0Q2bXD@z^U@<# zC`4J1AW@F}mEn$JVfpz2F|P(_Z1QdB_GoixP!i20bYPm>Q?>uo&g2D7=hlvDQ~0tP z&m{1D(7-xfL*;f1VhPMLKbEgb8sK}4xN#zKo+BEMZyC;6Zs2|xojiOXs%Y>`LX&Ks ze&rj*Z?j6+e0H1m|)=qwn)8u_;tlw$V)UM(ZDiJB`G)u@+BS=yGhn`^pKc zwYSNU_OvQb`7JGa_hY`EetCyo*mm5Nbhj#ljuvaqtd1~EDn1ZN3Y|r_CjiKdKl{5r z(Ra}wdi2h<+nxTj6K+O3lC~M!$*{p+_&h%W1g)76Cm-GG_SIKL?3Puw7!&JCf@cf( z62c>}$I&33A60ha{K<0BMt@}yE|gk$PX+=r+tYNqdHpIG(EYbXpVno9Ni5?qZpTy2mY>CrLH}Oh;LT4tUiYHqij0QRU=Xp&O{)V z8EuifmazJqq+|@|8106g&wEd4rKxR_X{i>{)R>=SO@*wG;EbxIRq4N+KI+EYzx6)* zuj<>SJ@8@^+V2Aq7{i=%FA7FY{M+EBv`MgmTruF`+VN>IirN0~;!*SW>O0E2)-9i_ z#mo(d%D_78BMt#DW5JhxSz-BZP%bLVUxF|bpD4o!dkR&_tPzb?OYF+`4oxvhsH!{L z&-;Pg*ToCWX_*{&CE96K7XffGcZ(ahv2cy#E|{eAmUV2Grqp6r7%%ADr+VYD0iyb| ztP8DZ^a4qRWtDY|(cKfO_i#$yB)W9*8?Y7b{8ZOEnGiN6#y^-KVM*(JExKEE^Nsm$ zD++_lFV4ZY<{cvZahmoRwPYOkerG{Shuc~&T+~yPM9z=DT`AS zIY>}kLi`37U2GAgS;Fy)?7kJ2u2Udfi;@zIXQoA`w*Q z)h}%hu#^^I1QP027~C%O)GPL|olN;7)#rwxcoj+ruaB=@%yA4C5pqp7+V4ElxKRL; zTtpAr@HP7SkQ=I+lvCU)o^U_{g(sL%;8m_?NBP>Q5*aD4**yjtMpIAHby|oO9iys) zx(Ck14MW7JBhirlh~74G^R+>H+n)U`LWA$(_qiO3oI{JeDp4210%pfroCSxC!L(P+ z4&I_JCvW1qkrVXrHBUT(QZv+!COQUB@22gNDAGWLy`Q<2|Er?9Kg7SiD+s;Bl=ZNC zr<2SRWU?1k07v6XFzO~+P}XN;Iqj@AYr>%GbVX9+g2Owcb7YPS)#s?j@0A}X#<`%6 zj$f&ils!|p$5;F(kWO)fH z?^}%NT)K;MtP^T6)FfE2t{cG$!*>lUC`H~}#gShljWBnwEgVJ)^J+6b9!VvFA$Q!? zA*p30@v*UN7#_+oUzjLYBIh%-Qt=E_V=VQjEFxc*Xo}foYqI3D$XhCgK-VU5<2#CD zK6D{Gmx>E|-FAU}mTLML-0~`AVa^ShlY_1M^p#l#+@GEr-K5k9P*1zaC6r=i=k}Fp zl>c9fmvNhp`ubgR@3U(X0@U-W;*OI9MM_K;kVt7JaV1oh#n& zz9u;(NB5h_N+iF4$ksdeI_%o~5AyDch98IatsWk=vAa_GthO<`@EUMixOT+V_)fWU ztqCoM=I-6g=4u}?9B}9T%M1J9`6H~Epe(=UK1j)=8h1LJ=gnh@E3ddB$Z!8bla*p4 zxyn;ZDvGt60{zXw-)nQYTEzWAYwa--Znu3wea?hCR-VDlP>|jB}YSB3YGKlsQDBEuDM?{+M(&b*FGj%x99-NmiuCkp25*z zBKLJD8^kv@<8{ZmJ)rX3 zr~n94NJk8)I7e5vP19+yL^g~=R2LoY5~bjguo6UL!D;krd=}i%BT;sP&UT&LncIkx z*kSST6lnKF_}=)!Io8WtIB$_8H9Rshdk^rKAHpPiKn~|3veN+izx_|R7_KLR-|LOfm{0rt$CF>HzI;Aw%~hda(+ts z`9r#EIp$M@g`>#)or-()zw#o^t0#fDSnX5m{w0rfOu#T6NKGM->wT#(7WA8I{b}F zly|A5pI#Q9Y9ShwyupW>bX~XcP~&1-z7wKN-G-U`=v@CiEeBbHBN^oSQ9tLt2<%r&2)D`iE(c2F;yx-!@YuguU-KBjw0K!85&>-boRiQAmq zr-aR{GK^I<+bd~F#0Hjkz$c;ksr~RF4t?4>nX_uT&9q&&vpVb_h9oK$lgHvWbY5pN zA561sI1kC=o?Y>$SK5TTOI?3D{b4eg_BR@U{+DRkf(XaQmIIAw_kVc`@;dK- zs|cb$q#?3|ERcvPMErAKjzvDFh;wBeDG51#_!RF~L0^$c1g`m6z!1KmCU(M-VE#(_ zMqkQebg?f8ip*UT`%Nku&ohx?)Oteo;zZ-BBzUawb7YHwFbO&Et_jJhC;9&R?Opnd ziugSjrc^0t)Ej5&c2p;a=+62y1B(4Sg)utjy6`uy2Dfa*sLX1CptOA2Xu|NM0qd>- zXU&*sjyllEl#`HJcw?E=QiwIJ`?Wp{t%KH|269_X-)T8NaWC745Hq7SDL@wmjsC5Z zb%}zYVVuPy799}SY%SE9H*yl-247@cfcsap!dS*J<X z3#YABKByh0#*>Z!lTO^h^1a^QotDk37GW)0=9(lXxPnG~6>;Hgy+*^t(>EagJ{=#_ z#6eMEiwLqluw(x|;Q&bI0GH}|4LY`o7H{2;k}KCcvc}x>+%QP*iE_o27{l0kR7zgb zcK)g<%)CmXae@)m#juv?L(}92+CQ`@w#lcSDGrFFZ=vq%n@PU92Q3@rN>2>1Xnkov zyO6_Sn+ZVj|uS?XYa!~)AB13&#q2WAQyQuuFTOE zHW>XOCb+?VYWn~3@mFc1={3ho3&THM<%K$?N$*(1WYbuE!YEn4gNr}Z^s+m8e6TKBwWKvCzW!cOA5QVB(l64WpFB4eT(L_1 z`-OS?>0AZQKa@N7<@Bv3!e#UobZcJVg2wp4&zcd^<3Osa`>VMpdq1oNar~8iHyXA$kp0`zIIw`=OvCIhovgRVzM z4jkMKy5;Q?j%Eu0n0a)WprmZ7Yen2b$7N{LX{ZPZhl;lvHtX08-z=RI5nMO+7q7D= z+F0i`HlAy^lMpof*X3pRb`Mmg`_uJI+6A|{x61MP?b8Q;rbnH5nMaLOl%y}_+CJ4b z8=Xv0tTAZq5mXjGJaEcmd~*FNJYbe#W?CY(_2`1}N!~44Ew%RaF=Mh`4%sxMnm7cu zf6d{aHizNg8A`b-^X8V7_(TlX@Dm|(59AiwUs^ZR9k+bZ_HE@0$vDg zp-;v{`6JbbI+RBUC{02DQ(?(hQH{lR!7r|h@fjf{czPRE59?Fv&1ilS)gx=qX1sJf zilWXEy#z6l(dprB+_2e@Inb28;(gDr^BH22-v0V`&GeaB7iT4qdKIUn-V}T~mCaLV zf}<*Y-R`YeMhb|xW*gUIQ?BLYSVce4_P|Gd8dOd&VmDd^XY#ZhEl^E1_!h1%YJbMb zJ5U#`+kY3zq)mq~SMfpJ4VJBnQ?`5TXMx?KQ zC)9(DqWbT}>F%H#sBtnd(p5VT(R|yde>lwFL~w36&^;_Kv8@JeDSOXNv3SsaA+y>K z>4B;L2i8w&`{h1mofepgdGHqCgRN$mY_ADv5w0$lgtr}E9~*6$I&|Fyc}ipFOcmmJ z($iug9~Zqnd}?OppU*k%-ugg*Ip_P4PD!oQD*%KY>7R4)G^3R64Ml`}y(61UmFJyT zik8=fEl^W|Bo}rC`($26b40zz)z7kYF0019e}_!fByaAdEIsEXA%4xLm)#RdOzQFF zyg;L_MFbSyop>D!9XWi^RkGW2v_EcF5%PR7nvF!a!6KHv1G*YBd?D#amPt0T?^n!9?v0PhFH?V;-q&qeSZK8@h>=`+RLw>Q)|?E%W~p&8jDp2KPl1z& z1$wcdxD|mjufW%{)X1P!!a2|I+u+^bZnuIR+-6Xf%Ki`gh9?@K>$xqJwY;g2`#hus zo~E}gostK7p3`+ShqW%MF{KRJYVYpVzyIvYi~K6usc;45VCVT`083y49S<*tcP7%8 zI`qs%TvU|uLqqS9>K+zyN|g#|94eB6Fk9!^{X_hBF8O{kAs=B}$uYNjdMOitSJ40Q`Xy$(Gcswnw*13NYXpk6dw=G<&mAw1J}26PXLyyc$q$a~EqITMHJ8w#u~r})xLsze(OP8z zq@!wvniLgARZZ#NBd=Jxa5FOT5F#Qc&v`C`;wk9>W>2KRFreMGy^3SN**84-K6_2+ zP#u%!94C+pifip!!*_0`e(TJ=@F^p+|R8(DN+twIC97kg7C zI*9_-xyMI~X`Z6l+&-lSx+*@m?O50hMHM7?Kf$dqU$SnR9lpMJyWQ^Yk?JIos?m`s zr1j=;iqhMZ(HjsU&|P19iwM>4Mx67&JV!1J;5c#{^4$V`r-l>Vc&(2#`XE1Qk~11g z9t|67s|_Ko3$qkSK5E}dte_eI!%$hD&EP~#hV&kz6lq2uuH!ah`)4&D08h0C+NOdc zE}UN^ArXd(RElw8F|Wt`IylP9rrgs{qgg}h3NsVTqKMa9TAqWxL{Gc_jQrEnpj;#K z?V2e`)dil$$CqOrA$T2iHjeTa6PcULWoT*H| zOg{sRKR=E>+$}vZietIt1D&~pAA4X;9&UMUxv_A#LYACYC3T+K%gPXr@Qk33L(`u; zT7OKH{?L_LB`(M-Dmb6>?C*+feCF-}iZd#*AYAF<*JA?{h?T!y|FSp`2&eiBW8@I=z7zv>fbQgD+JVWvZ=z0vi_?Tzjew)gHOokcH~ zf99lJ+zr~C^|VxWaJz@Upw?Ew(fA-zb~$nreqLCMR5K>o%F;e4j=OqE=&NP=xR*nK zFQTLT%7x6zt3K04af-O0H_d9@Ov}dS+cU;OM;@x`MsROjwvetfbdyx;C4ci<#S=5c zoOp3`MO10<681^k?|370Lw+3UDf6D+IK?5?hikkLmVWQWIKy%#r;2M;xnGe&tIS%X zQI=xX znT}+kR$AZ@3rHRNglDghkr)MgwIX6w)8iFDi8iE&x>JK9@<3Z9lVV9c#^1jjl~4Xf z268FB^U`f(dKzl|=>6HvXr_>oNVL9o8-g_IZYW)(`qunJy?aQ1z*=$#Kh zB)~7BW=jlnm@_&6x)|*3@m_D3?1}T9PdQZ9Cto+6s#0(=ij<=KZ|Lqi*X0zFAuBGBt4Al>TpQ%){7U3sL zMHQTQqx*QjDty3|^|#xYf-9;HN@sO(p0rFB3@nQuIuW{@RjO_FfB>Rc$1nuCT5Lx? zVTYPrixC6&aDmf0g<;PxxpdR6L>I0><_56WhAMVA0=&XPs@8x?I}D`(Sb1HYqXq>OaONP zd8YEwS1uoth>%S!y0sx$<+;9k$gORwDs&xoA63LBsD%3Uh8}6fqC9xi>~PPzqC?vYuvtxT`h=Lv-S8l>x<(ze78F5|A_H)hb(>~tGnqz%TnGqk&Pu*0=~7XSm91j zvfV!kyaImo`isfKrS59|Jv!}?dJqxY<8)Yb06T#eHXU|;ybPgFI%dN+RCdb9d9qrbDv6G1DFrMF+w zgQU%jhVmHjqvst*R&0f}ZYEX>f>R;P%xRDD0i=KDTE%?7HW;Y+F{B>j&$Rt(A*x+( z{?0VMs8f_Q)9O&vFy=dN{oYXx?vuVz=h$?$Z}+KPxRH*;1fqKL){Wcq-sl${TLZ_7 zeg6`Z;Qw?z-ZPQ(A}7P+sU!*Ds@GW!h@%)l!j>T`aFN1Q$&8K^;Spcx2Q%pyv6u@f zdkRmwR&JE~#tMsm|4G6m8vo|bORE$`fAVPGh8!7G8&O$uZUa#Qh#H&Tp()regZ^Y2 z_Ufb30|rvz(5&+@3T9tbNR;|sswNTjdRF19`V*80GHNwu2O9i{>iddP+F+YRtxUA_ z-2x5D{V>cBktZ`-T%L<+LM0_X2Sea7OoE4nn@uJ1UWmDik$$X024>(S;(WzHtk}yP>Kz6dVk!BqrOR73z(@dg*ZZA zY*yValeL%H!Wr(ytV5CGjMwEjD!&|i?F0dncs_uKF=N`Vp2LUQH>$MJzj+ED+*4(N zwQ{AubIy&hu(kQ@Z$vQm7=#9_Q+o)V(EqeBqhYyaNXd~y4r1#^maiRdLvd+?BNP<$ z_ca|zO7-)z4oAz(M@#%L3!qZN*l{tX;;vEoTz&(NcXq8UrkR`wrgd#V@;CZ9aZnTT zl%rI@RY!E&m+;`g!dtPv?Q=Y0cY@+46jd3Lw*7-7$`od^mY3YdB#5*}@W>JCnB&8j z4^p2_aO@MVZqNeyxVOBxfHMby$816fT!L5Q4>ZDJ8a`JvNt27cG%qiY+SZdvB& zT-FKA(Jh_3YkxK#K>-Wox=B9Tm+o)Bsel}#;0(*Rl3ihVk?!)SXfl&euQWLI4@ox) zZA^@sLzfRQ0%`cb+@j^Ah$}bZXBfxw{fSiH@RSEM==Mk35lcs(|INVvN>~{S>H1aq zh!-{eL3z1R-wsZSK-dknd{fR966-82pKjSJRFrgJan0)h>=!5%n@LGFIQYWiPDj*6 zrh(Bh`j}kS0ChF{BCiNcuBZ(0#;XnU@h_Uk^Y5RmgWg!czg;gB*)Qxjj2^X!zou#c z@@B)ug=4cvIy7}KM67*mh1*yWy*+VVDyEM8C>~HWARO{Ol(GoN6WtJfzR>>mJX!#W zUW_OBzMg}kQU$R6?SZnP2OclFAr9;0ZJJAf8p$$6yo1coGxU3eGVGPCu9a#g}^d;-oEz;~s#h-b5RpoW+=VP10kk z*i^}Cq*muzTSw~>^K;_AxzME+`deySHxc@cyaR0O zzD=s%u9Ent9;hNumfZ=?pkn%*Z{Bw;lv8wE!2`@%3oL0*T@Isnh0a2`>70cF-s5(} z>w>!Cxua-9?LYB6Xj!5%In2~mJgianE>8bzInlkaCVIq9P$Z%A>K zBx|TTbJ;V_ku59WFJ$(5C1sgz)%{LNKBLH-!0Pm9vrtyX<-k>ioCk8(2rG|&8q!e9 z{5f_?8imtbq`kf!wQbEj9oynZHb75THEu2`eq%|Ns*h=zwFF#vaY5Z303%v|9GT)X zP-u|;D9Mv~U9woURb>8j&Pb0vcXRQF0=Mv`ps^qkMIgT%4H9mvx2g-#{6eZJGJL|LYA{~Y@D%BjsqGlC~l-qS+*OLyC4BW72OcIBV#)fx;@5ED_Eqslxd+xvb?cEn@JiR&6!d(1> zk(c~s6n*)nMEUC(^w_z{<((Zx3R5+2U-=YxOabe5CsBNA1CSBdQyM}UAapKQX+_Hm zF;vKbI0{wOEO_AFr(t5=6r=a7o}O&`bz`WD_>78Fq#}AQ?h(g8m_hjk)W&6FvckqC zPwqjns{-T4c}88qh@D=3=`{QM`OSi)U=Ia_D<1*5Xz7pU!sFPC1bi_1N9$t40icPS zzz|!b>k)1Cj_Izuv7H&v~gepAFN^nf+6sXWu3!6R9l^a`p80)wHvv#u$uBF^; zQJ-RJO-IxLADI0_RL5Jsi2txAd%$d8bo{ILamVcqTqw^x+mlk6qbpgoB^iJsP z9*-*(r5_Z-$q5WfVi$=7A@<77W`VQRsm$6=4>y|+bI;jKJk;8wng`oXaR*Vsu8d3s zT9ah3m?eu2JAPMm5l%79H3knYSU(k$NLP&A|2o{lNq7dx+@{0c_O$z{cJaV8WFK!N z{9z=Bc|;tHyD54B(v7qPm=s<>Y#^A z&*+Z6r&(z-dt|kA#%U{MMdQi5FnM<{@5Xx6h?om!ec_Now0JuQu^lL%9;z+@()Hj8 zR-IELsl<_mFLsGoCr-Cu8d;drHWQN5oS5`pvirt$(qy&a6Irn}?F630_`|LyJlW53 z%a32ysdac8pt5K@wJ8npE|`h3@2QyBOZfm}K1X)bn?n@7Ri{-RzSZo7`EYq!CNugi zTo0nDvgJd3A=LqR$6@kyni3Li{|hlon{>;<2|Q-cE=~2B4=YqPJs|?V3&NNO01*~$uRLccPWG`C-ngAVi|1|0wsGywKWm(`WyLy(nOH_-DdLj zYc2fIyxOuI2G*eNkf_0qrjF2`zgI#F?!)V3%0Esp6^MYoFcm_sj#*;KHI6+t?p1qD z#}I+M1kBTRW-K@*od?RZE2=N*cpG}s9AmFA9Nj4)iaL|3b7ym=8?#)^&$>dj9iz+hoPVUrHqEC z0NP62IdxvtJl9kq^q%#k-bCjyb)5k$av_(ZaH<-!aFnorz5BNQz4O!KLd8nRx*YWw zG4=!UX6VLpm43~cST@yxy9LwM89UzqzUwpNOCM_$Kh9Ebj~@+2rU-Q&&=|i*9{3KL zrTUJ2v*fFB1uB9`ZuifJkrGGHxYWZgxrcx|!83Z!_tQmNC|42)ko!Tc+Fr9TWD7yA zWE?#z)vz!-xp-|zM#B4Re>ni$w%E`FC`4;tI&db%@|4qBez>2}aO-{#U9Eogd4b@S zF^n)nn71&4Nka|-^Lf<0AXDS&gw|^bmVuvDuh7pNFdcBRi+cO%j!!aUlCVAbyQVik z*E#0C$j7i{^NxK4WU!@<*e_HQb3c9AHmlyt>1HMk{v&MPbu1A|g2TlOBl--)qkW|OZsLbWd znv|xkO<9S7X6gVChnnS)@7G7$?>qVi&k%+QTuCQa&b;(z~9Guw*& zqYnVefe>f-(d*AS*qs`IxN`5Lf_;rt-Ay~7Ovq!X$V~LxJOOS=a6Z9!O8}d6T`1uy zyRlD$_4$+wQdd>^?yI#4i8y}&>Q_wqpJi8h2O6p`Z7Wqhf=B6LH=`+kTM2( z&9_0b!CJouUY2EANdY#F4}dWvp>iFtE;Rh%xZG-ipAS;jDS?SDP~DEm3MczvdfEEn zr`uZlz#Pjp9q>30hKaS%H3>0gs0#k4}kt9BF@7mfn?_~ zRikq!4EE$Myeg zdHR9=?fGwrLh9$|QNh~_aVI+W@m*b-fImhMu;Aog(vFwc-ju_Cc0!YdWJly)T^8UH zDQkTyW+xhV<(hHp1wcdZtiH{&Qi|xy7ReO3C!MfqnXf`z)*5>FR|IpiS4}uAGq3yt z#KjUI>(5>vuj~VwAeexFb|$}pD4_6tQlOcv3#gjk082Nr`sOs(Z6rQ5I%@i3X2w*7 zCF1VJ6>4geUG~1Vm8HI?ZtTPJaNrbhqnP) zDKIBp{k{x57oG6)W9Pm(;4hzkda$f(;=eMadX-HU71Y>SXI^Gj0ruWxJP)xhMACc; z+O&<$UIN@4qq|jhO}>lqvGMV`#rn^Rbe{-*dvBxA`$ERMVKZvH+@{gYtipa3Z!{T|?#$}&I4?EY9!H)R%&V72_1RZJL zmtE&Zn8Clf?Mdq+i6XXlcIbkF>a{VVn)=$>iATp|IzB#$4}*W&%^H4mes=2FcvbW1 z3z^C17@v1h{K)?Ucle61^5=^UuLN!QH(K*aN{h&J!vdbx_@~0MQxi( zyudz(f2Pet4mMm5l>nNda%>a`604asSDYu1_$9n&6`v3-y5xoY?q^OCnbl4+5)XWkZe;AYr8+63e z*@5AJNTx$;?)O4;fKl1kMer|H1_-v!Yo;_+Rrz!)=I%)R>J*ULG&%v2(Ii^)VfxW9 zpaD01r=16ja=Q*ZC$rI*D&dUz=;eR%I(-+}Ka)$KS`}U9+%ODgbQ1{Dlu@G}&}~fA=m9DqYuycrkB0Hm+Sw#^}N zgil?`Oy-ob&vWG-=<4fb3qKomb~`ls#U(IXX{Y?cjUqMQlvoh9^146blJOwSEA3BH zjH%b?wuRsI?$3b(vCgNPl`b>;P@PZLx+QGVPkD+mY`cp|F!Hayu^K>@^ErOW3T#!^ zV8HK11)Hc0sYkW|W}3BKfWzZ_vC5$kSgw12Xc{^ceI+g9?_gQdX5ONMdE`vP(8H447W z>{%#BoHt#mlAESr!y!O9DSYRIy;WfVveX3w9>>A^-(Xqmc5a`<#KpA{XZ|(iR#HMp zlKEdvPG8qb?|H0G)xIphSASd7uH_9$C$zV`9`J}t>CU`*qxZBllkl@b8Q_-8>nCF8 zgC6qk-3%+Sjm$iANkIuuZuW;8<@u*yN@%B)0l&=JCIkN+?YDPc{sJD+nm5ejwFAkk zLRG1&u+|kCsCe7AHR4{l3t9f$1=plfl-QWQ<-*hcY8hSNa50bIbKxNpJ}} zgZK>KNUA^a0@CplpwF`)TTMx#(cXFnq|Yl`yw!^@gJv@#F3!f+jt?>+hPPcV9kGCW z4IIH))2))3Nxn-BwAAA5et16|Lfx(zH^EX2WZ>-0OB<<_0RnL4f(GM`Gh=X z|7YV@YGb&v!$IDK$m;QIqCEGFyXQCx&IuTd=x>LBZQ&W=P~j}t-mys?77@OCzUX9J zq%GPJzn>BK=egxf#NQu|lb?1YM>f@ys4^+t#>4Mc7`Sv_suUMXwgIDN$-EdJqNFC; z`0UaoLl{rI0c)%CoGw2{@I5z3eolY_rA?vk__ z=|o4axe+Dhk*L<$7z)~7fIA_RoQ6e1kek@+M}z&o%&eZ>Hb^HD@2aYnL=QRGqkO1c z)pmH}9~kqEXk$jA6>ps-q`B#sL5OvLz&Lvdxaoi3_3oXgY_ zV|DRZ<{?cbwUMbxyCA?r)_in)eD5z|G3|+Qa|l^u<)?u4_rkVKR)L!c0l;AN_^H^L zNv1kr(KM|Ds-htbDR`R#FE- z+xt|kzQ%h_pG7)sG>|my>|mPngZnsf@YZ}rkwG33Km<2z8taTUmwFbv4Mv?krt7rc z+ctBbpA%(g9WUnB=2ti03-H4C^YESkqWo^SN#DW_TGVTm#IR#zx1 zaW1P@u5DB*i@Sb<9Rt2ckqGqJcv^h7GcZN!+X-q3J2o+7egYku0y+L1wjv?E4KjbQ zd{vpd`{-4bW8d}OY>^i;t1OBStNho;ZhNAkxaQzpr)yZvNlaKEFbEvg-mDVjJ9vFd z`9Mcox;@mMfE4HOq!RxyBW&MmAs7L;W`PY9trf!|$k%zl{3`TU{w*`h4`f%!UAi`{ zIFORLxjBG;(@HlW9N1DB@(&rYC=qzIU{(FymOrq2t=u8tR%L=p#R_{eh~%Cl5WqH0hX%lfEB=U_yI!*4B-6t zD0}=j76v2Z*GT2OTaq&7swq_YKqB-mQhO*<220PO-3MCkLKJZtM&NDbVYHxj9T|Urb_4_TL za@ZhFeR2Ts*yWd3xv2-B3(kO!(5sxY=4KUB!n{cAT^%|W(24JKm3;yLXG{RX?y9_d z;Kl@h3`Im4gkjHXwyDsIReB@K_|2m)MLKr6Cws1*wilF977w(K$UW z^y6@Ed)rKT|IH+^^pHu;dH1 zXF3<>XB7}Jaqsl}DAp+uYKm@1N)LK`vR>&3;CQp$s|0eatyU!a?tAk}+i&&Wb|Ztz z0IUkp=PVgRJ@-*hXXe|woSKc6-jL>sOdV9foYa`|Bq&+%WBY$UL+EG}8fb{8p2&pK zemqnyBdOsSrWi@7U`@~R+4-gOL=mulwV6{@RY@=BhX_H$%J?{7pPzyWt#GeWByp8YEqWM}{7#w$JhUcVS1LlT zWQv6o{>YRqe=k24#Oc#^yRh-@dkXy*@UBkzFYL&@a*uu13_(s1$M z9X3RQtjYQhDL>Q-H6k|73r9Y3nD$x5glTz@7X0ine^2N>n`zjrTYHy-^>3na5(#* z$(omhcY|L)2lYT%kW*v)08Rd8*GLJMlW(ujqGHHldJXH7XE{xzw847A;8i&S-ILC3 zmd5???3}P!h6;HoK4)~!i95RVBi+*9N483ijF5SV6OodXojo#-SwdBo8eP_6DR6J;2bI-igS#noD zoBqUCj6p$i)q1Zn9`FC2|D8$l3iZh5(vNz4O6Xhg#prx*XWX^<(d%6kL)L9RG+7ZZe+j5ObN!WOsw}i9{7`A?q^8k) z>e1H=v1gne&AZ7K8{-$XG(T9ItFQ(jw@HbE&=uE(!UsQ>-nAuc#-HTFX<&4DZ%0Rt zO;2NDF|l!%?3h&F$Zp>onb?@G?0jb-)nC160>=NQPu%6&_1JTW`$8H9ySav@!XE-HXzbpUPoVW6bf zd$B{9D3rxR$s-e+9cI~L$$CQ$)i{%M$o~4uy1p{2L+wq|5${bq<(J)8gq~~%?>e?7 zh-Ro*{_ISDdfDQGU%nj*rMV4gz>aPITP5?GCf_uDLTr zV+|jKjgHBk(LGhSB2Pr*(btF2#mY-;Lihk(&~GOC9(TTzC6}p9WiK^1=$-Dqsqa4A z2fwI!M#5*amq_166$EYP1Y1&j%gTPQFjjdfa+e2yjbddgU`>>|2X!L?O#AN=69X!&VVa&7zXNi_8?N*rdZDL#g4~tzbzG!sct% zmABM*JH~wWC5c1%VEz-@eeqA$p^>NWO8N7?G}(}2W>vkpLV`QH-yKT|{V)u^756;+ zesRzca;ZBqU$6=X`;r?ZH&X}KW~nBB_fx^Ur?Wl!y}iOqLN{^iA43=~%p*G;P2 zN>tRg_Evp5i*4-Of8}1fRJUkY)SwCl5mp*JWFF$g-L;|L*CuqYZkJ*c#NuO02Conh zjy6XtHrEG7-2VBk1IKaAh;B_(kLSbg;l|))K9j1*9naAkF3ivT_zQRRPF*gD-#M*( z66P51UPQZx`*16pf1AN~%<2 zcyoM?pWb;cCx5ynHa}s>&g&$Ma2OJT~CU z=|}`F0l6p&mTGFmcjLOoRg+!l^IM_iLqms#dVN293&?BtFdT@Hjuq2d8*21}f%yl6 z*(1&T9a`!~a)mSr$z$oiO@BK2mIh1ryQKfy8MB|YQX6cU{~0cwG&cAnSqKSv1%;1D z_Q*Wri|j=XR@&dO^@>iQ|Dt+z{2;mSGLeqd!Is5E4UQI^gHD&2nKX6w?3d@~tGjay zd#1NNH(B-k*WcSEG|lxGPxfE@h6H%H&8 zDEXC+=ACuE|_+VqD(4P7}RMzYLhkMROfVm1JdG{I@T75xBpYav&JrKh_ zV=+8C_=W|p8|8(~$uiYBJ0ls&(JGQVnbG*?nt3-Uz$xhw zpdFuVckh!b%yBK{_7#|4%U&l}rcmg(DL}aYvm}VvuDG;1`Q8KBejjfaVq!0;t+68s zGaSmY&QNHSJ57c4OaL_U9-6y=VmF6<*YB0C`IK#UBQ2AI(IggT70_Z~$Rj!rGll)M z=H5l+(40DbeBsM!5=O_M1+oQ8dVvN9_PoUu5dKp{@_Q5zwOV85*hK?wX5u+ zHbOm)TK4gzV^5iIdostd0X<$26`CIea$n7vQN^b_y7Z0yVCbA-$No(PGR%t$6H|kT zy$M8la3}(qZs=Q@!5|2`?O-wMcmdk-DA1~@Jou<|pdmTS!>5fdb#MFf<>Af|BBFG! zZJaIZ{D^nc+<9WH_QYyyo9Y5zUxUiXAFC{z3n)om z`X0E8v{bUF`O@J^{6 zEg}3#StTa(%>J%#`a#1*Y<6$Uw0os1TO1y1tn%)bOPXHp!$O;`a|!MS8P`46J&46b z+*d61l^I3thvMX)=rwCd?Z3rqC8q=yLAP_cbAU1D%j>J9>ewKWyS?A5&S6HpR@Fo8 z$QOQ{Ww34onuswuqj8gE+w+dMpGnx2We!a;3-0f2WfRj|ES=tsg4QxCYL@Yh5BPPJ zR5`MZoT=EbIiC*Ys;!ju(PD?e_v*d5#u<24zhzIx)&pO_mGGy7SaGM~1WoO22F)%B zuBEPb_z*Q8RWg&-{sdeiq$}6P+84~<@=3A11|3t*$dOo7N~J6jiamVyJ2+tU^2|1T zx2pRt{K>?arC1`=KC=M?7}VLew1BN*o9STEgF|>7*cfTqFJpCq^EFBD=sp8dp6dPb zZz02C{)bNhqasaH`#aztpzz|cXxI=xxuruf-Xs*o-E9ZFZ`%ia9*q_cW`QwgxAUqV zEOC08mVO3cNUfHZs)7 zXpv#!a3%G-o!zFWXiTI-P#V=Sl-T2AzXYI*Ds``wI=qo;ucXFjAe4{TxEQ_95qu&1 zsKh7Ju&biGN(-tcwClp}xeP9iL~*PgD~@|LN+;u>$i^;8!jnFs&nywFavH(Bj0d8U zK3Jn9>E{il4JZK)rdrYxV*QJh*iP%&a3+ADwn62jso(nYO$EOsB;GbklRY|H@`1ubLyiFFDmn4Qw>{ndPNg)(4>ee3>6$f}EQn2Rdo$X4qIwm~|)N@w_ zr8u|kP7SMeR>4?IHD%SoN-N8Y%gdtMfIzPt?DnSiJ{8(w5g=Uq`ugh31Hb)tsl)L1 zX+h6N=-a-l+ENNGEoQ2DyA|6K8fB9gQ%P@ohR-$re85%gEN#YI3KLivlDaSWtDhK@ z#$~^qmiYzvefH#$-@7Z5&8bk(?gu!&mdQR|gt?fR=eHfW!3kkVvz03Lm?R`-y1h%C zrS13W2jm$!&ey%bi*A_Jj%H}E_16qn9HT;t5vX;ocCJ{skXxLk_9XP4_?1!*L$ln2 zhQbRN!@@N1KawlC(6I-zfw#NV7UQAk-v#`|jNksXxPt=0ieJZ0O`BX$lXm2%S`mBX z`R4%`GN@OhV7!$*h6SrGY`NnF-o~dOxnKk&UcC8SvzW}SnR2@XEm{?6WhgIyOw zw|2=4R380`CS<>OF~^8F@rb{_c^%jMwozd~;>L{&xyGWnnRf5ntJAf&e}B)yY&q!h z$(TO7sd{;7t(c9aVN*zUoEUW~ARu6Bpd?{V%&;&BYbH(gxG^G01sqj$*GW@LNAPL( zU2g>NI!)TCR&?c*crE1Wmr@#SaKecx?sQ z=Dy)pday8L^inim@YIDGOzy(H*r1Rr;C82SPx^xxz6}?0iwQ@RVj&e&TV(kz*UG%% zxzeL~{67_k-#H9Axw8d^j&>$baGTci1zzcNotK>1EN2M&M|9A(|}x0TS!*1HN7LM{J|ts;+mooR+EtL?R|XObRZV`+Z#8C^U)^reqP zdW=xoJ5ytIzLv9{B~I&e+0w(W#8jv1sjn)iYSP;A*!FrU!c6B3crao^nSml%w85D9 zvEcp>$`==H-nYG6&xqmEQJd>_*MR{n=Zg!2dAnB1$3Q6&vQnIC6i}1nY595cJ+TKo zU0acqd9H6QoS4X0esSlFj2Va%wX{g;T+tlX*c*`{B{0h?X%Af#`eGy;E&0v<==+2c zD#ta}`#%C)rWhY z^ZPTu|71#kVoO|PC7{Q(op34ltZH1&JCExy7}M1b&|6Nv*FRope$C*}Z&?(jg7ZwGe#{p7p@(zB|~wqQJ}0&lqoLl z_vY%S<}D7DJM0Xx`M%;qs{dLpb3$b%BTkaHBm&Iego)}7wbMU(RGXGN-OQCD-@5 zYj0i6-u7x!Mv@O2^elmRe(ID9X71H+4fAI0{= z6lnXGNfCXY0vk$RjJ5HMbw%Z z?)O2=KJ&8wrQ=|VRZML6t2-;z-hdhg*>~Mdz4W|-h-0B;!%H86y;~aC>Rh6`1y**q zu;nCl!g#%0+ihkUH(jO=zm_F|zM?(PyvDVzwZk^gzXpzucI%q}Zdd{o4%Vx;TX{g& zUudXtUIOfPynCpMF41g2TRdbdW}~TmrYeY-7kX~&ZRR~Ff-(lqiDag{30@5BlRr~j z_u;(u=q?diAR<^ybIJ-QPPo=)jjJc zp)m>NoG+zpHrbueIGU%0uNMxgFbWG*wfyE%U*nm}Ri2#SQIqvnZK{o~h# zF27i_cO%379#SNoFgOEr_RJ&5ei${kc4s@#+= zN&M!yv-YAbsdi|t2Fg8^yc_+uyWZXuw*Dr1T&nBx$5U9P25|pUX}el+sJDhO* z6QU#3>kTQRJD&DlaX$R)nS=)D6 z(x25voW5%1Vj6bx{k-D%5w962;hLb~#mbYR9d4Gd*fKXPK4)mKB=Ua3g1!czlgh#V zrfEr1gC`iHcFkP?8xOK<{3WFo>w)5|o?WKReJCCEDL8keui|7QtCIVw+*g&nU5i%` z0Nrk3u{$f;_QymxRMx6cbmuG}uCd(jj!Sh&D&>RS;@jM?6rxqyW>=5Pk55Z@bgzhF zX2y1zB5J|$@VvK%1(7b;UZ%MGSJZ#3|Hn1Eh-Ny8(QU$94jB2hVI-VAyp;az zFX?@ym0GHb@*ziQ3eYya&f1A z%lsm)+I(}Z@w6m$D1-CN!EM7DgX3&oOD|6Hp3oa6qT{G=VNR>bAf-c(c;-KvTFkpS z*pzpZjNcb@==SCj$8aca%GTMgnR_U-khkwXonGPL7tvN@a2^HvhK71Q^b~2169t8P z8)g+tiDe}=T?V$@ZjEz}rlSQ9+3FvA=LbX&mM)eIWtv-TTV66`x7nQfRJ4-)%4C4}n@#?w>pd;pu?RPOiYr)86w zz!t~zwC>wFS8yk6KD!fl6=q(Y2$^9MP~LZlxeZv>hLYMj7c4e5d7%YZE{?Y50#2o7r{&5E)qH5b^g_wE z_Q0Om=%B&%^QB;$hGpW$tJP2ptEx#0lT62wwyuGQGZq>P9jJiPpVc*3@L)`m)gPbI zCF*eQR`}ad^78zTq(Dq~6-EUCmo|u40GW#?JVI(fLQUv@o;ZyqODpy9FijrP<6s%W zxjvou(3cA6Yde$Vbqkv(j)@a2UATE%&~zs&;r!)|*^KIR%Vy5G#fGPMv%(0Rr}<;Q zzBX2EPn<`HC3;xWfWT`x1N^`@2g_N`Uww;_aE_FKpxEt=bc5%G0`W&K+&PC571fXZ zU2yNkeDSZRtP;9R7k~2l`{yfM`t^q72!{P9?e&Y+jmZx3Z-SG(8^UM#eZg;44~S|! zR1A3q?h7S%MSH$9wYKW0GZ@L}W@@U~_8m7)lnv+`guLE| z6+eN>NrFY@7HPl+c#9SfMMzf| z5;5UN_kfNSg_reTw9Y9@&i^o>)R7{ei|{6nP|zv8?P8~?dmc`p6d;ox^xRJlhcG#T zz(w8a{k@O#P5Ve;X}s5unVCB<(3rb+3P5cCtiKF_!iah1zcr9-cxuoguw#PT8$+y$ z^`*akI>jjPOu83(t9zyG5{avb=x6Lyfa%u{GZrV80k;=?M}eg|5z;px^Z}~NXfQNw zb{$oZ+Z;VqYlukV0Zc$AqJQ@*lh>%zluA>D%ivUh(ag$J{E>SDhCkI4-bM#)Ev}7Jux5nqU22otFTpDvoxBBwF(7Ho~E*#L@5gdPiHfqW01Tjf2 zK5(QdiY@!oQM6hR*(lvAxiSm4Dt%liZEZnY(R;gjvL_D1h38E3HaADf(oJgxdz?O0 z&GkEHs(1maRF*FCm@D&P6fi7Loxk-8EUQ(q6^sC;56>{uN@(t<-ufIi&TpZ~63hFM zs)py%cd}$*O2B}~xHit?Mi@grdnp?30m16ZXocuYQ<=^J$tJXcVupd1kahTwUf zSKa1Ohoq;y)L;Ow9c$BOR+BO;<3@O2H}}KLDP#J}RLV{p1LX3g)9P-qiV$k(Cwhbs z|GrqijQOkci1B$_f@u52I^xI=84d~lHi*j@KtKN= zMo-SNIB=}So+3>DGLgct2LtOupg#a1p$L3I2Rg0HJ5rj39mmyrNX^<4ugxvX1dhb- ztY^1AK6cd-21s}mfx_|`)oCt3U-al0fenB@+;`QYq-#0D=H0E;67R~Qd9%>+sY8X; z36J6n>NVdmdW_j7>;z0EV_Nw@mld|{=2d;+^Wps?zXxv00->Scf@^!*e}mAv-p`w6 zfXHmp3;ySHkjU7Ym>&l2KdNq_1yi1=WgsW(5Z);Es;m0EJK?AsAVVrzT1H+V{^`3^z(jVRomNP!pV#p&HiIL9_CO)JB13thbo7 z3<-Zl7saZl5Dhv3t)OSd+%ToO3Bc@bN7`Sa12$u2y(#ik!M|8cGJ;{Q`=^_FUmnDC zR{^y1@Og9uOS#7Vk>)|CN6DE>yxTQC`%EAls|4l`XWp4$RN4M+M3W-hv1qSt%I1%c zs3ts|c$q*bsic>8BMV=DlvVusYTP&pdLAg62K(Tt_7KcVEUNN0{*tFdX%DG5kdu)@ z4m7jZOy~3JLbN$k`sncFELR_@?I%JEElXtKoC1~!zWUKLWX0REf4T9WDgIF?gWd#* zwz%H?Cg~sY(Fu^Iwjru3^3uwb@ZRB>bUz?$_X`by29X{sN>jF^9Q`ilfko|f9o2C+1DYQkoXZy={=Nw2PH?}Jkl7f}Rt)zO zfw2c8lp`}o|9qp*r(BiO_9ED#6zipE@|o7r*jjVF2nojTszmJvcXzI|7sjI3XDlpi zFn@AC>OHm8o+ez;8N{g^CbO9^-<}Tt)eJF41iIen%@I$H8#iuT?&BMI4h8PiW)zpA z5r+BC@1ptqNbW_cecXI?iy!RW%iVL`^fECA zyNB=H#g|sx*SokjnH_~({=5uw?|wmo?5y!-E5H8(abz~)<^oxSJi;uwbniRg6NW>; zS?*}IdjmFF@!%A@VniYictqqc*q`D%uE)$Z2hTwd*-o$;-i&m#`L|Ez{ynSw)uwY5vx;&ZCC^0H0$$BTR%KgY$^ zyChskl)M!*H6w|Mi8Dushlajiz#(^sH|ko_7FrqpoJ~wZqAI)ED(E}~L>EB9MQ3}m ztEUc-Sr62S;J-i96mPmwBo4FKcGXh*`840dg}9kKqY^{O!#y$tfC^{bw<$~79`%jK z-lf*nS4tYG82495h*yoziw__fjm*-i)mgow8W%q2d_8ebgOdK}ZtXnu8N!|$NkA$w z#+Gw%oFh9{arBnAY_spYuPPEn;1kw-`1u<5<;%Z~0yd<|C9VqAMlO3UG=I4xqs<*0 z@w;Y@d13d^Y3a=kZxnlM(QZ@X-5*kiE|aLR^hhOfCJ9-h z`+Ly-{Zl?3L`ILlE+xCEg2v=pkCYwR}NIeY{^i>P05RDWTlP0c1?e@fVhb@gVc zY~q3Nb=E^6l}`1cR|35c$ifA}PZpi-crZGOVg zjve#^){Uwx0}Bf$va?~V&Y~yrob&Y2@%edfSZERp$_>@WM{Tg#6>vC0YJL57$XFs^ z@N6V5-gcp>2srohljiOR9|#@u#S{FYj}C@gS6== z-fJ8f@jWxsO;Pgdjl-3jpW6kc3-7eQ;vJYVAAvEFhPXIRsW-APC2n3^FMLvI{IS-GCK@HL{V_U8!NLv~ z;~jjZN@;3tN??|!O~|_~L*{~exm`7Jq9mXH%ym^ccQ7aHCANX6shK&S{DxqrOsVuq`O# z;9z4=YHD*dUTJ;+iva)WPE*3#$OZmbvv(3G?W0l(md{P7{^To1hZX(g<;R+1BI23@utTkQQR#p zaNH*AsXbvNW~%h=Rysce3gzUqb+E4pq&Nko8m~u|zzB1c5R;R;K2a_X%DV>SN~}P8 z<^-a)bk+5UwcX`Z;F6-DvUIcb2GKK?$dhcxP^Cv-q^y~+Zc}EZ z1&tYt%Kb(oTXEpSt*gWj-T7;PqckD?@EsxZ;R0Pr^uq997%)B8SwO?NEH7o#m-k}I zMJMBHGzG0yX3*nNALf~*3qmXGo*Vp~De~U1LFrlCZdByAEFE9alNIS^>zTm5jqHW? z*s}>aCK9S3;t*(0+Esxzo7=ReK=LVwiLzm9g#jqw&cQE?HLq`Isqt3SrF-0)%iQWm zD52{@@;B6QrhH%dBxq1G;;2vgb~WZ)y0&w}RgOB-YWH&ICp+5@RyOCXCQDtahej$) zs%(4XPY!#iep^2~{!%!$?9LbS)gj1)>s{OwMTUP)Detn(eKygbT^U8Nn;;k%q&n%c zk8p8OM49%;juf;ozfrL^Fj8}HRFOkw)Fy)v1rv6cU%t5}6$6M&OG|75zcNK621|*M zqI*^k4|bD(k9aFhw;w9+OSmnGI&H5U+g@%I)ZGm{Z{eer|EuTMFz;8o|1O4e=IQos zqKew{Zr&$lm4$ZoccWs)Zf5(Vw|!4(RF4gces&lnb!^{%?55|XBkokoad5~Icg8}B z;lI)(H<2yOg!3@*grlPt9qr$^gDQflj_T&ZJg9X{EnDM;fifkmsvQso{qsrw=la;Q zWx&;}Pa{?gW1#k2%+`0f>}3L*o5GnlvjMi2Z;2B)H`8t!cZBR9s$KGz0L+ec+GSKJ ziWAKKQ{2Heoww=?iP=f>2US)(Tl#~G_`#-9VWnsyzOwtMYuW)C^N-(d?y_CA1U2bM zO?HLgr_D!YXmy?g#f>M29f9M9m>gG(xamdXfV`XZ?J7N=1+Fz1B>4QfDJjo?zi?X` zbEG(aJkGWU^IaV3SF3f}9_la#K}(xjGae9g?60k?IBmUveo48+Jo83*cv+c21pU(b zvFz(JQ&VMEhQsI*CWp#Zg?;wO*Ec^u(eG&oMvZY|^i|h~J+|XeFvJB>{(GOE_ojxs zw?4imYSPj%=%X#6uicz8PjON$GYIaFU6C4oJf|JA^{B(6%9v6XH7q8y)=vwfBmK4O0Nuj9mj3g_S z*0^Kb4kNGTYLb)9)@hsRn0yZj*1JAW^*s37H^6f#PQ2aqa)ga#(<(THIaFs@)_9Mb9Lf#|^ZpSm5PnZ5-8k+g9YUFxgz&TJ1@lt{i>khn`rbetyLc ztQoo(+m;Mm>-QDykShSeEFbP`f4v(o?y-iHN%zV%RIgu#dFE72s-lK6KvCVU=zkAm z>uiUf$`Ze!o^bBK?HvOM;^^j(j(3vk{}p?7-wQ@Cgg+1xGT^7_a-kocR;N$*7fw0! zn3#VIYUlReDL8tll}g&;xwsw+dN}os`K$cUMd;>B0Ay?XTF6XVBYQJZVppR_@{RlI z4k$wn&W1cYZQPP55qx`bgbVOt{VbE}08kC9d9&iUfQ`ZRh-&7-Ydvx5uKx7at8q2~ zL?kOpvz_v{dvl~FXS?n=?QTejIgW>WZ5S>xzIOflRiVvs3BB|mdo4r`S{ioM_ybJs zp0FZJW(2?qG9RpPZy779^{AC8RU;g#s=C^8VTkSa&YCjP0dV@!rTD5M7@~Oe_u17 zWV0-h;Li_C*|G=fII@|rzuY+(=(2h^p7l7u0F^*d_i1=oAn%Oe2>H>Y+ENnYTlqZ1 zWWi0VGlG*#KPHfRPUIZB??J!{P)9y3PFo`Pd7^O#~WKRyG_E(&`j3{cnugUJ4 zgguEbExX-<8F66>yE98UKHl&oM_xGWB*pr8V2ZF371688}g!;ECt2)m?(Tq=mAozn{ z1`|MqqroY|oGT5n%slff62$(O6SJ#KY>;wWvF!~Z5ucq|AI4C#Z@O{kc6Zbv10Tm)UvThRQuTU-vcHadY z;;cjUdR(#HAUp+i+x3?)!~m_qX#{jCy!Dw<`5yhb8@xcHjDwk(>c;Q>9&g^@Jy;IY z1Y4m#efgpeIW)TkJ<}9bKfR7@hJ?js%>e#$N_cKu+&?M~vI!Enyim7>==B76`B7w` zGU5ZCOGQ)(VxOBNA9gZSzlb!HYiksYMvr1-{QjMkThwrqDRh)N;M%8CxVluY~{tzwT>1PS`_X>>b zmBAHb$_2q;wqe$i4$79eAY#Ug){zL&MjMu#A=|`M#xH{e01oRkCi1;fsDS z*WJ7@gY4@>cB7pFZD=^-c}|5|WY-?eX9w7%6A#0ptWnUi;|F-z%l{%5a22;$kqaok z7h)|NAbGydbzNI|Am{0)GoU|>4&sM3lpdQ4xu_F}UqiqW?K0?$z&F`&ot5rv+92@`Sr%riEr z5p$9tkRz!;ec8P$Vn1X6lt#Mx(Pzk=9nXf5O7;dtrrTrZW_a^epU?~Fu8aJ8*}@E2 zm~cvX^j4k`(^ML16}3ED_zKVg3vKKC(vEn`5~ZoV(5`{CbRy%2FoDI}$=nL=umNQk zmhQObd0FS>aryNk7%Ii>7LRtU$R_>tZy`fQMnIE$wCg@F17C~hWi17A>$uUE84$Jr z!0XzuVlw4x7wkpV&vsV--*-8c6LTU0N#Jk%32A&@AHKVW^4ipkk-WO~RlvR6BHAsE zm-bCxxf`0M?<6009%44|G-MIckTYLun_h;Ecr7qUnmrLTJTfu6}^i zHVJ5jJ_QN9dUO!>W33TUuuX5yi~7Yo7jL(m#2zDJ2wVrj=^LLNSd*|&KNE0p6-XEc zC7%om%=~qdp16m(KXL~RtYntKyOgdj#OPiwl-lSK2j3P(c9 z`P~0*X5Io-6lmGOEVg03~u3BGT z_qCr<&^)QbGCx63;An16$O??mZbG@GfYHrNo@V}|H^PJxV#!~X`+4qdImYs8f%ruk zbTvH|N>0)%gt+72Ig!QM*d+2{^D%5O&7O?*Sf7LagI~|Icjw(S=H?#zc;RoZ z`ct-8>=e(y{KEitCrI=x5X!*cT+QA+gi%~9zh8$b!s<)|G-3qNgd*b@x>sxvqX2Da zn{$qgEPy15Y|h2AzJW!v1u9A(NQ~O3<~ir#^-G5{h;JdriD^1=h$EH?QeRLK2yo57E#>BXi^t-ZT^U zc#`iA(GIBh6H;GghV`4^c{bP6-$1|g%Z#IGZhDJs0QyyJfcb?j`|edL%OeD~UyHyET=`ko6D0NY$+@`xxX{P1LD zZwl*Rog}vMNj^-$ZMzv&MtoM)4Q?OvV!QKuw02aRuI{Lj0*uTwo*LD!$a9in^w>iQ z1o$JZ{Vk8)xZKOGOei4AQdjliZls$(`uLx7qYfFrd;1LL<&PoMA=em-K~kpbpIi?A z&;nkDV_Q$Fafy`D&rphm@|Da*)aw&UrDq&Qs75hYThxO)nY1{OWqtzITtVl=M> z%NaT~#h$<>Y3XWUr(m|nAeigTAJ_asQ0Iu|OU4r0XSN7Aj>|#$5!&;MW=~PuPYXg% zPdiNiAs*ZrdponZCPku?TiMpWro<^0 zVf5^c8oDO;r^~hcKZp&Su+AkHqNHj*4)q3B;vS?UXbM)I*qSE?&yiYb(h+KIOH=m{ zfH6ys5gof0h$%hev`jL62&_^OJBHhvo-m)eG0Xy@a=kKT3TycvKd<%&&Y^g-o}?Yo z4KD+p@Jo%YDul7i?Uvkq4kw@x!D_d|il|3lBJO&eoD+c>OCM!>@2!$?fR{N(%YG{h&;edCY1VpQd{$EsANm}+}7~R=>Fo(CP zGelftASJY{&a`83GBBUV8b3yk|Kj&7oimjb^j1l!SUp}y0A;HmUdSC0@c&rG|1ofb zE>rgn*59D){u>o(>2zY)1CAE?`n}p-PV$c{po3vM9l?3CK!u2((%= zE8t-k1I0zQvxh))JUm%Wvc8GEK(0Q{<}QJpVP53&xz*HELKHcfhcG>7%Bq0GUHy{O=n*(u*x3_ohf+`r4?1XL{JCBWe1C=BU{k-YqV7+kh z@JuzVyu|SRfRnGalX0BT9gQAyCOgW=ZvXgp=-g47D2{8S>)@|E8UvG0WnB&}qFCnp zjttH0Uk!?^p5kLbP;0row4}Lt6TEu%k=ghSrOJ;5)H^ zG-C8_iV-8;>Bp;+^DIoF_V)&Q!{HiV1qKBrp0$^=eW-pn4qG+!;*Y^WjHZ~>(S&gU zG-~Uj&8hUwC7Vu69S>R>%Df&8;_9a$w6%2x_n*%osy2ol0a-1DFG;qqKKRKFL(?c= zjLF%)6naVN129Z*d!^g?96LofJ2Z=oaRB1_Fbd5B5cvEslu8EQ^rguo^kj%~x!a5+ zhibfy=X!Iqr=u@W&>4A>6>Zz`u(L}yM6l(*O@)XTw_7sXIPnsIRD9Bg@HFfTXHLg6 z{CSohb%&I8gYU63Z!R~AJB|mbB}ooDnIKyVqFiSkrGxB|zZJ6ti9JeM+y74bT$D%d zovFFGbqYh!iuJSuJIGL>^Dg22m~GL@rjUmOnJM3({U`?`i>dRv##_)UV1o<@Q%kxMV2t5VY$^+L>|y_&sBUwwXX_ zoQ+^4N6n61zIhfyL|BKK8VSQfDoU@nIKB^zT6#_o~62iw6HBB5apb4pu^e8qQq zbcu!Yj+u0n$&3RS`Fy*tDMO%D~JI$&()z&onc<^_X-@gD%s3hu85xW_(L5>mWPuvB8c$7gcUbPO6A$|94h$|Kbg(8&J2zfg9&EhjPFwn=}^h2nK~c6Qq< zF&&WIBeQ6oP*UjlbO?U~=#-_kqQLkg0+o}h@KoF10nPh+s9a|_;yuFn)@(kmr3Jiu zWUt5?>>Wi~MvSOg&>_V8o{L;j1W8@czJ+4YTweR@eVAp!(bIMekUnp1pR+C^00#H{ z9SNx8&p{y9!Lmh8-UoI{Y^0xLrT6XzwwV(6N)P6$BN?^J?wiN51f)?b@?3wFi4qkW zZF@`6%wS*z*|>CTX9o{kd2CO3Wa<(cFu2T!g6KcuZ#=EYxbTAI}sD6D5WKB<4IgFk@{`SjN-C~w3ldJ)Yw%~?zQy%GPm6j z;|Bh5ozf^YAJzn`AL5{yPH@5?;}aRhDM<1)6>qfV)vlq)F=*W!1Ff4Ec~Z(6VV0pa zzH#OEjMnl|ENvvqlS4AFaes?*2n|71_L;M3oTo}(@ysiGL)2*9eu4$F0t2-~vLGch zrOagefZ&8DXh&xnYJCPrXS(uDP6MZm>zrK)x9J33pXH}6^$8U3lV^|zCtK9_WccH* zVo@&|Tv`ME44+UcUZUqMb|1@8QjjIyKAXj?6U;;x@3aV#b|vS9Ma zo$~UEOiD_t<0DJ4=PMVQhkRL^d!MvVwMj_1k2B<;n2=}Adtm0nNAnqv(9VIl$^)+} z4tNf#aQJRbI)luZ3+NSbKydujw2QO?9lyQ+$N|7q>eoAn;~v0~k#MH4FGU^Bfi5WG zS2N&$VfyysR57d6M>yAwik%8(KGqY6x%6pVA1k~eukEct0YJSW7q1Ii`3EW@I=Wfg^&IcR9ACHDelKXnc7eb?tm zhydHW&@cPEetyJ6Y!L;0Zvu#nM2H^;sYq)YlpLWJ-A!`;Wtcp>FGwUixfe*_(&g;x z9M#tR5qEMWO_}r93U@@4e%j>|C?<@?{l&1__7j{WQpKvS_ z|Dr>k6y|Yec$)?}`tz~>=rd4a$$&o}V%Jy*nis^N?e_>c$kd^ID3D#V0* zgSB#9d*kM2tVQX*<%8F1IF77&?wNah;^@1S)a5H^%@cyx<33?=o)w|-mD$+H?}Niv z7`?Y0lhalTlVb0$8fpf;73ICGn5iF=ikR9M2|b$q^^!p)Yd~Pgod#`FJ&bjdg*jA}M@h*yO|5oE=Wq6JT%ux}_HB}f zJm}G)NhB?~GcvY2ucEli_f;qE9(ca3p-NkFifwBa?_TX7lEoS+{osI~b5CJXk)e$N zEiXrEME9xtfqZbFsMpluSwVgZ@=V(w{8gl@4Zn9E#m5k2z8{V2TYkWW^<8Io zKXlnurr^HdX*h84hPUm=LynY|JF8JEw{G72QR7fBi&0|bm6rR58oGK-&%1AygoaR}(Q7vxxwP|N_wr}E zeU|M$-ApJ*bgdr4l8GlhJe+0DVLi;0HR|g7v7B1E$GQGO>9RZhiCaeV(yA&;_g!eH zMfGLQ(7f`LSf}<8`NHY6C?9F5(olfJoO=@;NEr+tUZ!;Q1icEVa1i$~i^gZour~}; zYzPS843?pMGa_)4$jO(IJWnKJI9bXT&bIH>vvv4P7$#F{XRN>T?H6;!qft6HZr;${ zB_C3;+IUZyEVWJ@Wn3Zmh-g-P-p2ubKB!TOSNEJ0rKV`LikR1Apwl$rc1XqA_nqo` z+SjX>gf4euI;2ZRVRMSHv>-iVO7OUkrOCCat++5&kDw3Ko(~&>RSaZ@T z4VXPG#UQh|raU~kvC2;2SX1Ojg6ICe+EueV&divSm}<{A#H}h!tvowrTbiQ%>?Er# z>(u}~2AV8M|4&rJb4gnys@JcE9yLBE8Bfy4rusntVnKWXuB{7O^6A5bxm3N6#_Hjy zj(hnj+_9YUpVRUod3@w?Vi-^2$5j=Jp}qw{MkWZ6@7+J|N3elR1N9F6bv=@QfZG}g z(3C0=($XRR-J5}Tb-8o-s!!p;P|^LQctJZ<*7IS-mfP!EgcD2bKUtaWNK!E6842Ne z(T0$&uvxyU%;Y^NP9?1IQjrb^f$&x9V}A6EN*-IAc`j$k9jF*Ttb=iJ=MVV?&dX=ern zK2Q>0dKle3Vm}`0L)GztU+hSc@V7|QiE$LBuE`8^{wW4^|BEk-G3PB5W`XjJAWG1M z@IlzeA^o=s<;Y0BiYnxz&t!CkJ56k75}!-PoppiB`(lh7y9dXOE}}^n^3LJJ%7ZIn zJD~6)j@S#pJ|VOCNQ9xbR5mx^`;p}fh>_5$u#oOKagaRb;_B8j{P7YWpJw=D%#wz> zuvO|rn+J879w*WU1d_cKMoUCL3kr45hLL7I_p>EZcxH6pz>!9Ie#$D#IvIPVAU+ev zADUgv`%3#(Kq|DU&-~(OJ$Bw7hX;1D2(|fw3u!Rn*olwL&ho+jAkADT<-W5+sT&LQ zJ7vUR7y49336M#xy(~NARN5F_immSRN>_Yw@ooBU7q?5iXeUq9D)mRANkbjC%rJ7g zLJw6QvRn!ihD=Ok13b;4bR|;3?8e9kfB{)WmYq12`TWGmkWG<%v|rfq_PuMmB7S~j znmu^-suoHQ^6ms4ZnxlJ&~Pm>#ohO7fpD^am`krYML@yg*!-fGU1@F0eA8RZdDN6! z`(j(X>`Qtj)~P?$@g&Rt(%EP26R7}UBHqJ2Uy*M2&v*fdv}r(^{qqigpB2+DgQ179}LAsN*hzGz8ifeULg6S z{{`Il*|#TRg9!Bd3Mh|TX}eXlbiXzH+<0AB&TIVM-AL+|j93cKMb%(bR=V_+c7qp} zAU#pmrv=Fo-LBWfpB0WgX4@1ccNZf3&- z1ttSnU3dw@@OKXCoR%6?W8LmEan-AzW9C#w^3mJAM$B!EmPaSPK;F%I&(P4ZOYIdX zKtXBr@#A_%K2Gr>>q8v1+LbFmCA+ZL3kAh`Lb_r~NHD+?^-{52#j>F=UNc%E7gk;Z z;G)H1rY+0q|F=J%E8(@9Qsc2vOSou*16S2{8V_~of71b%r1AIymDLoqLa~76sQ`-4 z6XgOX8(G-wIJ8FM4KSfO`KFJQn79dgy4wJh+IlPum2=tK+v5O!&C<(#Sq1b|oTT^8 z{m~g@?G#jW_)$pKd;lzyZ;Bv7X%Z@WV3_YB`3{qu$fM4LRKGA$k{j{(C6LgEXfFQX zl%o>j;vl;m#tElSj5t6WjAbw|2bmS3`3VhypU?_Fy!+0?g$b^VsnXx|O~w7%=rQmB5|r8148tC5ou?jEjCL>V?VhBEw0};W*Ry)`%nA zxe?hxK^5QCSwHMIN0+r&9G*~~nK*X@pBCTNJjDGpq7rR>mx!4qO#x1(=<}G!rW+pj z66Aj=*rNw1J5BY&Py&65HqQ8%$XB6&bJG$I)i1b^Uw`K{w{ z*L1srg8Z{|GFkvFw*+#!c8!;N<>JKRVm^vS2uE4lo+M?;ZFE@}wg}LPD+*PE`_{^I zf`bY`wkidPM{h+>mX0D1xQvO?umc4SxL29y;sydOi3B(}gipLO1uRIVEF>QsYwQLu zA$Uan)Z|gLS9iXtDM$j(f?Gt$`&ne>p0ag};WPB&Ikr!F1X!-YM z5|Ep)RZf9V2TSd~c7W`wyXQ5}WtZwUO>?F$5rzVBM=+xq9ma~#i(%z4MS#yD%V#n&GR zYtO{N%!8glYv-tv?@~57^Kx5^RXY9Jy4BS5$E(-!8VhE2X0)PjhBR7oQAJJ)SXcem z$$*0JEQAqa0~IFfRRk?$8}O4k(0HKVVxakubb0+}Hv;TPKpj>G?pdSVLXhVb56sfO z*@ZoCKOnlOUzpkHD}Focfo6P?Yka)#V?U6}=Ap^RA;-rHvFxZvqU?%g-UkJWZKl^# z7Ly<;k@|#k?WTH#NS;jA5Udlsl>_Y47Z6S9%Uv9(1g4o4zRK$%wQ6`U_Vaq4k6~S^Ye{8W3@tGBpkTh%Eg1)*8x&pzDg1l3t?})O_yh!PX|668 z`5*gbF;S3fzh{yG?xDblpSI)6RfvC&c7-}RN1{8-Ar z_rYm!bO0HW4lxmezZx8`lV3g8P673zZC#a4EDBS(#^XWW)1RRiFV3M(N2 zIYM91SetPI5lR6#O+xfPy?;?UkSFS}Z=83vA7Pl#SAR>a!>ov#)J+%M@9F?pg?3i~^-8$x1F6y^>EVQgw)5aD0W2M}ozUGa9VTK`kQpJd?aR`y z(MCWMqEpNVFW;_7UdnSYLf|e{FV8dx<0gz!ZYtGk>J0@1@w`?MFwv>&u-Yu~2yToPD)y^F}mD#O$m#@0{+7vCKu=I0c zW}bY1XpPHm=0VwLi_Mu#lyzUwLSlnxiU%Ku&?}7?qQN00I3c<0l7Va9G4&GaEqeOk zr#Nl?OBlui14kllNbxUK9kFX471mf+@DD>@ryBnC&-!U+WX+aIswPDeIPnMkfPGU7 zCZg-lW5q%LLQg?N4-c)B#aA3^Rb{n)nB4Qs#bb%JEgAt|_Vo1Z_c-0|mO;V`caNZu z0zI#>BKvxGo+n({9u;Rnwiv)s1; zPpI8U1R*sKJ0z_~n|U89>DxB$4`KbKFMU8O<6YbQSfLjSYaL9|0=LzB>N)?oD#lSj zNYN+Q==~~LZXTbVZb~Bin;b-d4LBdek*7aOpywt_L69QjW6IkNFS05Uz7J?5PZI_K z4%~=DQt1O({ZBV~VaE&I;%t7Q7L+hVP4bbD#&@E@cfZ+X%Ar8icOkRx8z6T7Liy_y zckv41+|J<8u$pU&xtShe4e0%Kv;QwyPW3ZgW>T0NGy5dwhA$6p9&R+N5@Etm?f05= zyQw#}esp&7j&-YKFm4l5lOtOfvCiIRWH2Y}`0a;jt^@;q|1sSL^AI?IkAXPsR{;Mv z0m%B*|FK#USAgN+G5Nb^9#iByg7KK6QT@q;cr4Q zcq$yNnjJFl2kB(D0|Nu|CXqf8$U$|ZJpbTr;}j;=ChCPPvGpMeC(z+PV`0f$2)i8P zzFKN?|69lSw^)>~pMt95@0a6-YYoMP@7<@Wi)sxe6Dq4lt_te4$LNi7ZOZl%4#u?A zC#EFv28ERJzSaG6x{ZE{9qVUvw9zN9FbInUWlyqJk+ftMbnzQ)G_{8V^bwQsBM$?W$3AA;UP;==^(@@24?+n6_Y+C znVX9CxV?BEp!^_wiACtKxW})@CIN~EGFsW>cY$`MKiJBC$4Zi$mf@T<*S=Ua0*3zV z*dc-4f9nf*&>R-KI5Sz)O*~~)d`z4}h@oqAZrxJJYJueqylOZHjJ7p?3o9ydEHUQ5 z2`s;47fs&XI)x6G7pUqNByK*QkMztPU)+BvC2Wv?0AeKlfeWWc=yQ9$+D6F}K#RYg zG9ZAH`k3Rh*LFrQ+}=G;%HW_wyQfNd-2B7|mL?ZIDH2rA?dRL~GfsBbDe0=0%3uF> zRxwETvUwYg0dvpXj+9T={t(Wm@yy(3R?mpCRE$?^+jDG{S6&d~In>6F8+v6weFIY3 zx;4-P5?oTwQ-Jj!w^ia{yM-Q5*1Yxg^@zqkWIYH&*#DdD(+pB`@Gooctxr18HAV4U zh{>(v2dp4yuv#uZHlu0r6l8L$j*i9Z(l-KP4uPK53nj*{Ws}1!!hZc1S*xMW)x#t3 zyAK+)T}obt9qmxeflH;WY*?X}k{fJ;GPLk9*s*OpE)!rWL;t3ea9x`l6KRvZ4bXb+ zJ0(3IXjX`fM3`B=C5!o9tXDSD$1c#Cmh;E^CzoQyL#zDTd=v62VDQqOa>e6NqROd% z+c$7*34(cy!4j`eFeEmq!pet!f`HG_Y(XJ&no9@43xUC5l6x1yr9K{$dD)=@bUX8d zLajq#Uq0+a8z||jCsJK^*Px>8VMM0V*#4d)tFF%~04nu=nup7$Lz~wAolQoxi(+Xg z3)P=RX(6XoLZPS3l9}nesun$`y2L_BZ*@uQ<@QNDJIN0(;{0bO?$YH*$fS#KH6tSk zE@S7brscN2BH$Y|H|R$z$T50q6fEFB8xu4ogLMul2WrOynH2Qdd?EW$A(8ii&9+!Z zC&ma(a>Vx#fbQ}WX)2oljkgA@To87QAW*vJ-tZ$dySqg9zlnRz9=lS}o6Q-r5p=T7_N)HhZ*7Z5gN^t!Q&WMqiI**ghmBq2D5=g+7 zJ3Ct8?;utqgUt%skRMh0m<>i7A+N%{)9f#42rH{I6Oc2=XHuPa$yN3DIP6Xkf9U`i z@A&h3Fkwnnx&$`9XY0le-~d{H@$f=N8K)mfdb+@y8a;Sp=SvQgO-I?X786EBZ&xSY z;f>p?tG>EGL&ej;=+2d{ufepohYV4Xh>}Tddg;>A(9wlqCYD(n=dXbtj-rejYfJCd zJ(TnW75>=TKffwg5W(<;CS^$BasY^xZl6Y)pFD7=%k>5^qptn>gbTg#Slb{ps#T-6+o(&i^YC5gHYDWmYV&ivd817TMxYN zctio0p$5k)gY-~y^AXeWB9~JLPVjpD@tsbZ*XGR^9+tju{L=aq1UJYI6OrCd`~{RTo*;NiIN_e8D=cfVMA3tHPv-({T0 z3}Vb!is%#HDT!Fxo;?gH2R4N#k9-3OOIo8PeRa#g4;u?QvQbGqUQTG7^e95gpJh;A zKvT3(>qRdP7QU-yX~$q2>A5-wQVKgdFGNsQ^sBz1ZV$ns6ctrdxup?@Tp4<+b%zjy+Q8B6SU)+i{zTDdAyYLN`&Zyb{~%IsN?pZ z+ag;H;N^Q^7Nw&*vacdR*toBFAoC%49A07z?sxQoHPe}uJ2}_!^(2r zGP{8L^yvnt zVmIOgNLwc5$}HhrbAGKx5URPRr^f1{(RL$C1~5Q~E~67UGB#Ud9H7J{Wi0UaSx9|Z zFe1tw9{}W^ZqaA1|ux~8eLfKhf_x1Hv)#CT>Md)T3odgT$EDh3gZ}$~j zH0z0AuO4#!BBZ^LtIy>qd_*unR@xE<*hOCYcRimY%KR3sE5!Ng5@3ar(SzpU5DszuQEW|8G>7?k8*Ero zZ#)1yT;U)w&S^}eZy>dvo@{<5Cn#L55->JDV9d$ zkGnWsKqlsV2uFq;Q&KTleJR0{GyRgCHaj)IKmdfgmNG2UYvIgQyOOH@s~{d{VNv

!3Dpw5?4)luj3++stg+-WfAjNF|u4jqaaCsi{xbuthQ5gX_ z1u;w?IU^LzP8htG)Dy3BLlsMcO(AFuWF_HzoR;)w_bbX7AotLMQIZYh*fAiRM%Nc0 zsj|=!L;A|Do;DLTHKgU{{>WsNeI0v@PtT^q@`Xc3z)MxN@zFV4gRLPmpO3PVu^42( zrCJw-+XM8h{U{k)72vy1&=h7p#LE~2jHc*MMfwT-Dp3N4tf8V-Ik%{2o} zuzY-6Q`yBhQOv^Qvl6%C&usEkkVi1I{zn;|5U#n4O+nG~2SfkD&hk(ZKQdi*R0An( zN0-Ti%_GnJiy5?ciHcP0X&Lkv28pj5me$FJK47;rAD3lSfGDQx-BH)sea)qAdF&N{ zq+3ltsfXt#?1(nxU^c&H+kOdlp6IPG^4LrrDnpE-q0HwAyLPUBHDtP}iZ|9drtS3) zd)xhB9-F-C@7{C3N;LCxDXyJ1jCsg9=8bt?Vt*4`6&~{03>)p{oJsc0!+}Pfg>&to zJy)d&m*HvshB5k&CeN$i-w`h6>pc+eGzMMee>tQ&PO+uLgX3XXa4!?9mbR=O#BK?y zzUF7h5^7m`w&0x`Xo%qwry)vO6js+oT-{qn-A6G9ZP#Bq&y_ z^BQJun$T7;PDD4OuBzNC1bj$Aw04XHzrUgn2OAf=o+(aozl4tb{Ms@rQ@jS7+F0|a zRFA3})qTOo>@Rs%o^-*=V&X zn}WpXD$d;uNSJR;F`8TV9zS<#9m6L{OsYrW7uuXYphJouHn>!5T)m zHrtuc=5qgq37<3}8R<~5oWk2VHDiEhYxMO4qkFUw9=l9W>DyhRO8{R!UHP`KwLd`9 zn{RK_o_yVjChZU6WfuDWa+a~%GnC78X}IJA+T1s`q$m!a^N-=*;d+O!s39hlEF2^4Q-dpj$$u zZv%E%y#KiwS%j-2(Hr3}Uc&9v;hlkiSRN23=45zIq@PQ z^8({4T}eqv3a^eZ5d4BW7JJ5B7kL`E$RQaY7X6I0LClpExLDBa>xc*%j2N+C>#0nW z48u)g#8X^6we*gTJ)z>=-Sye_%ppaB37HDBAB7MZAY-;w znMMV-(=F=X?qB4mQB*i8-&aD4tDj zq@l9dg@yHCX1+&a>~na&+O5QKm3`YqpMc;^>~kOW9q|oP!k8e=v^G$|3^*M`2&>IS zl-frr!8?G;Z&vxo3&Ew-+1T8S0klISf?h0D179BV&$})MF}QZPMxcvM5PUy6c!M1(C8;sV~gDSTwYxK7*N3e{MExiCt@% zJ!KgFotL6C(AJJF*Vl9hSe=EoI^9HO0RqhbF}|Tpg@A@JSY?1lf*TwfUtE@SVdjf~ z7>RGYIXYC5?sV7py#nTdQ3hcG*IARMCUY2HP_KvjAl2Y1oqNLVYf3`yPFE@GY~E6- zvN+_F-BBKKS_)#QryCqWf-e5o9f(>KiI;rkyaXN-y+R}XQ&Vf7t)=jX0EYHFrydq1?%HHfXRrP0*)_xV=a0m3<@&9Rqn`waQ`FxqBhij zSK`250*ra<;|mga+$d#aWbT*R#vnU^{R3|GO0zWP{RA}^hAI!gs1x-Hc?wuP)y9l- z)FX3J5)|17oR3t83nmPn&j9W^?7VqlfdqPx|GO`$aHw+wnw$tAWnR^1*zb7=cB^>+ znNlP+@5!p>-F}CQbNjB_7j-Nht3%viReTk3N*yssmO(-)VtYHpe}0*2d04e69K9Wd zLaB!Q@0ZR&b_zm01RclC8Q_;;Ziz#5S$xKojkl<@#`lSJoBFiJc_S*`9fck@Gls8x zWLFnE!BVjL`N>0YcS?bP@XvPz#YhgojTx4pC z0iDtViA!pU*Y6u^O+4Y}64o0VH`b%@|2{sT^yR%Hjp650AC4RBdTWQcYUYl4Zku*w zF~oY*hX_o%|EXcVKJMj-)zNfF?*~iqE&*2O#Z=3WbNx~>RfjwJmQ%~;X=o31nB|{e1u0BQT)g?_WRD^rGrQ`b>12_&Lvo=%yHmtuIFfq)|7%TL8oGdo z*8$)+FObvGh;<@D*dN+Nbr`a96+%d2*;FDOCm(^4PtbkGcJ~-^g>%4VI9-oRLo9%P z3@A7lqi+)s5yiuxr~x!mF6eZ7VOzwzm^;wPB>@v;bOu`3vbm0=?&$^3jV3%uIyKlm z2B*mfK0Re5p&zNWUmzF=zjO3=IV?5?_9haPu0p-*oAAJPKsLs}k?+Mis5&4qNvNr* zLAdkN2LJPm0C?n#+(OtLWQrMz+aKA2?z{I*-BWjGlDt?`U=vFTN}tso$S0m1EB3nA zw4+P3a=kYDKa1BX5?E|BoyS7_YSRR*4aEelYU#t8BjISFXo}K#tdYfpw8&vXX-cvxrZ{E>#w zSbKmN*+q>|CqPyIzLFYfg%2k6s;ZAMnw9tRLdfp`aGwD7+8+I3QO_!xVId!prX15p;l~uT6a~)?yjBXcouuv;Q6qL3c^D25 z=W4mSDhAG`lMZPiY0nJi0ENH5>F$-jW)yoK$TxV>(drkw(jE3oe$iuuVu1zYvzn?e z(f}gL`E~r)*&}{BP~gDV%nG3+*0(@OG2RVw#RS6Aq-!*r>I}3Nh+stDZ_1V4B1oM% zxj|Jm)Rq;Lrhrl!H=W;5m2W&}SM@zZ+_V%spwO?>wrrn?i<%Ejcm2BK!J(@rs3qFB z@JM5th4l@N#e`1>k_ah@5EhJ|&nXB(zyQj&An)2>PutBVi( z@Pl5Oid>b&o1B)lX>mX{9v?w0Ur}tZ_Ez{#$=2vo=(4NvaK|3BVV{54YRz4Bo?H*@ zTVJ8Em$`Q&xslsK1MjQuQ}TLPu-DfL_bs1MW#a*<-zmVm9kA}06BgI%aHu&sJq6bh zx=vmXFbNswjVU?(Q}f@&7HHQ1DcA&YHvvmMiLX#SlOE9@3>KLc@nK}eV)0?I`ZfUj z|LU;U^AElGkF|9A;iL?Wft^TI#ysfpAZEn ztJ*jF$Wf44BpGkL|ID~qw|VmX*7NSDaFpqTN9)HObJ(PMQ8snZ8O5p($9*5Lf}EsA z1QXRcYsz$9d6hBdMa~{YOwgtns`NE)_WbQ)wZzscVfDfjX5udipq-mqKiBkEP+-5o zu1X>!#`*N6CmVO1*nYSEJL7@*)G>!Q(l<{QuOEIs35nIt6vXr&x0UkM%?5@$4vw!M zkd`+GQR=bq-1FHNt9CtqKPjjedhK}lZrQn5&*0`8(wuJG z!uP(+(vFEZ^1*9+*U!Bq2NUPuirf=FNMlFm;FqS~xOxi_51P2O9M6`pT0((Fau!5R z*Vf8wvY|)*ft-1X)Ug-H{>p$I?)trAS>ALI03!y^0oX!PcMUWbG2l?sfJo#VKq8l2 z0XujX2yXs7b*k@64eq;WVTTE0DVk8C1HR-U0Eu)s9y>Wv1BIRY-W84(G!M>*)6{c} zeYPfycH&#kbK331AP~?cjJ=BxI?7RWEaVSoT0+r;%J6jmm+wc-7y%@%2QG{T|4Yvg z(lHl?5Uo}FFqIJDhy7RwyGOC}AJW?fHTZL$xA#vQq&DZ>etp7NKHrsplY~`pbpt3~ zgR7gCj~}~tB1#pRzg3UQq-1BY+H)r^w<9MiLS6dLwH?>XZLw|)+-kpjZVog8596mI zE$hebQtTt@1ZS;LZL9AG<~DIgW42ke(%bqTQ_h?2-*m3A=B?U4tJ(5g@+2U>$^S0B zXEC2WM?F^4B&D&lbKthWLcqLJ<8y-PMQUnxWqGU-$_y_|tSQ^i#n5Kx^I|rw!~Irv zzXf4^zbJl2qTvD0OUL(oG64&tcKb{(;u+(&ylmz=1t*mTJRt+B?|~~vn^%?aVn=KH z>70u?Oz06@R#sJ4P2x)hJo(nwNsuj@EOWl^#HT^FsuuDPYQmb&L_QOAtP;!#oJd3? zv_2h%W?t5>q$v=J7zcZ&{M!?NGCn3cf$LabA{;P)=ReQTfD~9N;p_-~_+O_FC`IwSMCELtFpT~s+;sIPyOivE`KS;Z( zRq*1@DN*B0$EYyML6_8g2OTPSVp)8TNRJ7!CT{Ql`fVypq;3`lH>Cp!uCNH$&oYrW zFi0fQLfK*PhQ3jQ&GrQhnl$?Oin$lau?|kxefUT9QR)}X4u2TV`5qh!mphUL{Ot@S z^R4vJxh)rn$CsF=%1m@cT-fqmUNsp$j@51eV27fGH2Z8kOt1i#)Vsk5RG=Xmce98KM*!}m#s zEcWTjoih5FZ5X9Xs~JeN4nohIE?gRuSUb^IL7_&_BUf6Q^RI1muZkRuzUMi3pl8RD z)lb0bpiJwG;ONa_iQuy72_Durm6**S2i9Yc z2HB%W^}b`1QUu$j!yBJY$N7d?1zBfd?& z(6H2gKr|wnxaAQ3{RNJt`Kd0d_spMbee$IFbGy}7V$m_?1{$H`Y&9*dBzkZL)_5=%@il*r88IYg;u8(^m6mSa&}cvWH>hI?7=V74`}<>6mG*<2VQ5;oYSnCo&*XM`{D-IV^sk9Vdr>d->*NS7e{r+4SiA`6^zs52iZ-W@*As6B zVQ7h;xV=e$ccXVUU2pnhr#?BRnp~|yce&kSf`#H+Ztf5V?r$ddA{uaJhAVN`UM4k5 zT3@ZbY!LGF;;TBxqI-lQMG^(uG$MtD!o*Aa-UJh_OkZ~gSBf=dM6cBdNlDF~mmO9c z6k0Ivo%TIoL$mLchc^ubWBAir$tSox=^aHr@z~at`Q8`$KDHO`l&+*gF~2Dh zW~~k#wb&mmFWVjJmlBZ$OwCAVlVfi| z*OI6)i*W#He4As>yW7<<8ji=;=NeBzah7FjrbnI(yD$;2Pcv3T66NtAEaiGN9!>Wfc@~cyvD+!Hy--wT4Y2Yknys)u4 z5vhHHD}XSSx6i6!j)$O#@mwrR-T%Gtu?aQvXgo4$(R8`Dzrqw* za2wt|xz564Qxp!P6eKl1UFKz(~kyQ}LjC+1LpAOZuIx=E(SZ6y; z7H<1+BORh$&Ca%x=DQiARLTuD-0PBWSje}`D_LVW>1zL+IzL&E;eWt{YC5@>i8DR& zq$q)tI*IqeRenzO&)_DdFgsl~E=M`uouP>UFFFkJ(_CC~NsH8RA)oOl!_u1cT`!@@Zr);IJ z?v+})c+Yqaa@t)KINnf6df6)U0PQpxXy2vCo<;JgpUTrom&E(aG7(ni$W6&jHEQoy zuF~ltC|wjjYp87RU>`B{+slL^+d;3gdAdLdnlqSR^F!`_=(D0&q(7_ zqRoge5M$T#K0cHpzb?T`qtI=tDjcCtp(vIa@{3R^rtH3EZGC2sgrPC>P1T>uO7CAc_{XBB8$0N&U{R#nGudA!YPyRlVi4$76 zKrT$?eb`|(0}6mhI-7%bEpPuMQ+KsQb!wp#tyFQ2Q7P0-JjBmZNRvgr;!wM(Os7tk zaM9@bfWBe-eXXqdW-XtizW0PAKqN|yunGy?m3}s}N!}FxJq)vxiEYyZ^#ix6s)~Gw z=9uNvH7tsVR)drSs%c+0a+ai;wQ3DMR<6$=7(d+SIKw^L2$7kB3=WSLSH*_$?{-xG zI)!#cJ$=e_9aFDe{bA+Xo{$JF_NP02Qt!=cOG=BQM->Lml=v1tK{PUM6;$ED)-y*e zOGyl$F2&JG%dn^<#_r*E5l2dv<2kf#f2IzQ6}6Rx^_l zU8w=o)DO-+ml2w!rHnqK`~Z$q#e=q`i>$5mr$XJU*Q;U%W1Vr0rAC~Y!mcZgOFFc2AtPBc^0fyFa*`g)yzw4S z$a=8FmL+{U{G4ABr;YDk+RE>|!INr6$NKh9o$`Zxq8{CcB7Tths$yJp*bTvKfz8v= zoQ;a3zJSL5u*1!&lk13+kvZFpnm_YA>Pt@)+IUBqd$hW@ZCFkVT?a$*S=Y<@00*y? z2LhAE(%V0U1f!X4Hc1)8wAV`Vqn*%KlDH7@z<<}k;HtwTAdm%9Sa7S9 zdZwa$PO|O!$uu5n;5!k~ug?OjaGRRu?PO72HFM-p!}+NLojNUq2}tfmBt7@xmB*z5v)ApU=Q%1 zU_A30|Hvui6DWF9`^3>~i)zK^DPExQ^I2C^Y!B_;rs_P{oVECT&x%@LbK;)ovv=aI zJiWd2(gAl}YS7dLGK}6MHr=1yiC$BDcgUx^&y$#HFUG{&6%yG=JkxWwTq0DC`nq{5 z4Yk-y73_-@fT^*l}}f1ySBmkPMEO+VxATtFO$H(wof|cO_R<8LJ>{^u5W0*71I9N6QYrRpS4%y!IdKml zb%w|1QX!S1YruDPjIXf8a{g%xYq?0d3E3(m&h5UpXkN+FoxU$33bXHi{LyLzWJTK4 z=hXF;zcxeEHhBVm;G=XegJ221n!kd^VSpyy43ac5f>0BpQ`9L$%^LomWiw(y$@=4m zqwHvA^6>>w_YEOmlt)XLLSOJ~=Yvdpt1i(=MM0aRK+9wV^RtG-i^=#BD6(dm^TY09 zG{cM_YYPkN^oiODlma$+s)*MABq0o=_G@OOYHam6u?A-9wh;(Lp^Yk40;ATIM>0Cv z2ICJ^sTs3ea&msQj}gAo9$CFuOH})~3oZrMWBWqA&wHA>DM##C>@4y=qEr{mp9;u0 z9;y+Ggo?7uDR#zJQk~33WAa}S%J}hNDo~?o?d|V&Oo7SaoU*4D%zhO5x_au4Crd+? zJEU*Sj-TaQN5+?6hh@^%jVe6y7`yfeFR1$wl7$$kZg@kL$zLnz)6+gzeWf6^ReB%7 zPQ29z2AsAL$*E^>m|1}0%DKFnHiriLYZjp_@Pjv?8H8Qw*dXeUmATk(@Qr_t$X!6= z{PN@hF62=S>+xpfRb>x~29R zOuY}Sha2>XGKPkRIwniLe9<+~BO9P<(acrOvI}7TGI42GlpST3e?VmlJ}2tZ#X{t*ALX7~SP*?mgGo(JPd;>d*zLpT zaJTf)!P?7)Yv=VX^-1C5g`zf~6``nCXQ&^V?#%Zer_|2hE!|DUpIsjAk&i{?UDK|q+DIZ!uvn3H zw3+ruat&WuablI~rgWv&U&A=78TA|BG?v9LHtKphs{O%YvlNR~q#kdHu%+@{UfP|_ zxD6+Zp$8gMqhH9OZ>BTaKQZ9X&k-SF4e26LE~j!9DKNBO;P03mKxz9a36(uw;_(aA zV6o|kM$0nVn8-Lh!!Oy-d-Q3=^fwx_*YwO}0pF4Fn!)%I_V27Kt)PiyADVPuDRd4# z1Bi<6)ubZX3@FnY_v`niZXI05BDI_{jz6Zso`AWZA6x_zRH|f%O-#?wu)}Zj;zwl= zkIubsdL{6n;TKKAfzqqV8R?__^(bI)+D9)1Ok4V%}X`o3S);9ncpvX2zoK%)cy5am%cam;ndZ~{zi6BeWfW^GdtCX{ z>JnUwFS>VWzHW{mXdLL=Skb>|-Y{E29zGuyJUkZcjeXfWP5k0_KZT5YPd8S_!n8}g zH{>%)ahilaSTKmQ+A#Z}M$++FQFgeHY*=ew6~oigZum=Mf5q%v92-%qD8|PsK9Kyi z{3#J}uC!@N z3Rhs<^%$j9Wwv9Pez;ejPor$IKE6jFnQzdhEq{~>ZGFYhH0=G+qUN%lhGKrZW|yBiOh=@aE-132?ARJk=J~DP1t6nJ<>}sN+*xD)z`%63&zTSey#)Y3``zOu z@<5_yu1ZKe@V;~pr1SPoS4T2Z#hm2JD>UHqQRUCQ2vUbDMEs+YTtk7^j)rG-BMp9@ z8NJH8lbC$A6+d=o5-%&9<*QJ`eUnJ~mj@V4l~@D~FiFxL~J7 z25&MkBJcD#eR}lsh2ROV>G5&`zh*r1H?KH;-hK4VgCN!WTdQjF=J+{xXYXSruXD zW&1FSuJkME*ky-QKkjJ%-I(rPxu)}?+_E`1j!*M?=?_ON9mBcJm4nr{VecD;|751| z-|h-}|6=W&jQrO(vVdfX4oNZ7*(4d#Hi7Bovn5HCqKP6iZERttWtkoAK(oJuvUR56 z`_Fy*5nR96J&%LKb8T!`7N#4%iZ9T^+^cljn?%0#D&}mMpLN^EyKPQbC&hF7-DC?m zN8+TTnLYPwCcnXt3oN+4SMo30+YTsHE;@rXkY*L|?IEDT4}#1;Y`bc9-!iM;H=&e= zh}&h0UU$h#np3E@k~q{hj(h1<#l1ceL@f zo_+fINl@$ek@34=hwh&WZ$tfXSk;N7`Tz_$!OD4ae=jxfT6LBg{e+Y;=V*S;JN+?X zNy?Jrk^2#$i>#aDw-90uKCX0E;|M?#`W3ur{0}4;#9dU&pMy`DJvK(HX^Ax0FaRcM zlGjEjxaS}CzO*M2cRuBFdN@vCIJOs>cS}cZJ}6a$+$Ziu9M7Zcf9}P-V7x@m!Hr9S znpwG5Mmn&zn9xLo_Loq3H2s!k$<56a^V8q-@3L4rmv8(Fi9@Q2Nmz1(3`8Z40Z-D_ z-tO18)FRX^$@ZY0n!x=p_9c!3zQROZBCV$flR`HyKmN1Pr`+vOBzOCD zT$y6(<6%Fe0?^vq<9jqP$)ew%bgc`iYx9-C2!9t^57w54Q@DQfaSD zl21`aeeUt^#Yds?G=6kd1hcE$NUY%Mf4%0r5=9(<+7dIud+q&=qP_aKkT9-FUNPlS0*t^wvJuRXP z$*_JDRzD4gRkZA(S|v2#?DssBIDb;up++qP?b!l zms?XbnD}*Ams-?Qw0~<+>+=c}Mfq+Y)1dy8AydMvTZD{dO%{gXPRZ=_s|%Ihwz$H( z#v)f)?PUJ%D|{_BDn!l=CrF9zAS49aXCnx>Lt#Y(yMG1g;EcJoWv5F@PhZ%Q()3e? z7xC^J({N{3DPy9o2i%xZT-?MzMIQd@d0p&k?TT4jTypifYTLgkoWGc;LP0q-Oo`;9W>V_N+RrMFP z0qI-G8{4GaQ^QXO965XJTWeaaR8sOz_ao```b#3PT~mx4$c}$VNwy$|H&>=lB)9!I zI(t_D&oDGkPL^~!RiW%)FRbsLQ!$Bqe8rfQ5YfTlYp}%ql-%heI+tO~ifq#U&vG`1 zO2~nHhpCHZ2Ut*u@fs$hhD<$(!HBBFOtu)ysggco%+bNmhEw~pl0?S4fymFiWaOvG zy|-%Lyk<+92j39$prv9?-9kqKxOC3iMhH)ATyNb>aoNnE(D^~m0elcQo{fSV_u+?f zy{4uiv#exA+r3GNC)(@bnru05^v8twE;rQjFu@xv_*YXgH6Zi98Bwh2_g>Uof#M+w z>@}~?#24#}$U~~9ub+AC)rvXq9kH(-zq^(nhRA88P-Z^7Sdct0#MeNx%HS=+$rRw+ z2@j*XJZr)B0&#+v?!1CF-r1MW6xT?HzI#-lP~s-uZ^>UqbP+xSC+!RP<}BEnjOtFS0QwbKymdpY0$=8BG2FJPX^0baIVW} zU(4qtBhP(1?6pce)JI?b%;Td*&(nFvnnYo5I{#8^3H?M1$0|3Gd^lI02ha1ek3Eq)W=gYi|c&4HGs+`wEq| zgpO_U;wqy?w$G8;e$S9$;*%T^kEe%?=smG$Sw(Ku_#~S3%YxUZn{S|$^Rm(W}>H`)3n#LD|SFXPl?O3^c z*~_JXk$;tll=LId#sGH}Z5tUWIr;aw2TlXNrNwMcr6VC6yhe)T9Qj`Jj3;xaf(U+$ z9w$!dnHXCSY^H2L+bX*Jzt=$6s*P+6ly{56C7ff=M9+XhoUPlR2>A5!j@gmVv!dV* z8gH|#*Y<*m8AVQbn<1{$&~G{43W!*=wC8r3{m83NzVfZWTmWB1QIYr=)0@zfoejYq zjeQBHV!>J-N*zJ&!tL3p6`qYLm3c8!%84&6l=#yFQkx%9%8E3chte02s6FJ9nvj|r z(e1rgl8nT{yn>7YHyHi3A6%~Kf8s&><(cFX$pg`{3f?8$drGc>W#4uWCTenjyN?6} zBuE#CQJH$D=ZRP{ul|Ziuzh1)_0Z*#4b||g4HW9Fz-2uE)ISxl_th#&Js8s#L~k!0 z3`N>`I#_exObUdR9>P%d3@h@O;%|k-_F`C=L`6gM5XRc#VZPJA7%>5kJ4Pa+wKa4?;j#Nx{n3&_e~2}k z!vYq(*V*)?Yh8;k4Ux2?R_b+zU|bN4?h&kI$8^kJxypLFG(P;am;V2@|kLIfvj@>uUgD2q(vVaSB_Hz__yB;%nO1S zBH!J7qVc(YJ)9!bPdYUI9fV~PM{NuC|IclB{mZr`ODWt+0*@To3sh{s;0TGx*Qnw2} zKKF#u5mmseqV`nQK=$6q1i7_a__<|Z61w;`qX@Ybxj)HYR3f9fZyNcEK~m5 zmjdOBC}jr%$Ht5Sj6a!WI&Xw1oH@;+a(Wn~%sROn=THA`EqrSh>S5zO)XI2EjJBWc zk@O(%VHp)e)i)}3hDLYYZWh}7`1!ss78Nj+GJQ4e4G`v2EiAIeTpnNfik6!%a`1r9 z?y<1=WZ196#NyFqctuG0*CUJWv_E9_6Cb#IoSL`4a?thj*}>_Fe_qlrs;MV;pF0gL z7UYfIp25N}KHD&`{-{Y{@`H1gYHs_m`1!(}!@6PnJ4bIwQae|6Z(ex-mr2?)4XixR zJkvfXa@>jN9~``SO8idqs+E)+ZVekC8+WU_t4v8o(j?jhvTuvgghvxgFo7o-*v<~?PrfGaZ{P>cUeJF|~f5yS+ zHimL_BF)4q>YdV{jZ+=(WZ|jTcn71>Y`qaI#^XY$nEM}hrQeEYerp@vFF_JX(+@3& zjc300NNU{8k5-Ffl7CqfZ2fY-CgT|Ga-sO(+w2$rwlJ+-h4)HNK1{NH7V!ROc8B+b z`*t9yB0dW*Z{cIex6`M_@_Sy0Kay1;wRKAAe+u&`EM=$B-n6E}(?S`md%~W2~ zHZ`j##s?lqYAME#!GGHUp2k5M06ROojK}mq#zhfOUM<$0Q95|R&*WW>)+C7*Hk!XN z^I_J#(XsqBckbZx+Sa0G%egTw)~v`Vgj%v8 zyHnhGj7$ZW*!pd#TTk5a_1Dbr(jB`5U>XEq4XlI=Sbi;@#MMY%+}^M0?(US32I+1TQ9wGSrAs=cOG;^wI4B_9Al;y}G)Q+zcYXWZ z@czF4nYnYFxpSR!-goaO)>_YcD%blSl=^oMZ=OH8<^6Y=lZz(M&-urx>c&udpaR%IaJ6U!eH8MOMlY~>3<_?;QVnwl2tNvO^kZIgIe{g+fdrRmm zRZ@&G^y+Sn*w2%^J;EPz_;{hLm%_XhzIzdX04nH9th5g=Xh=GgwGx-V7+{&{@!mQa z!&VmC&W%vW`~`VI1L2@{iRLf2IlB}fP%j3Q+_>n~+DE~+8%kYH*SkH6x5fsDg};&~ zcW7sRaq+@8^K>H18!m2kRaj#w<$titpZ5URwe>Hl+vCnB)4c)QbPz04DAnwYHS|)@ z0SAui;WOHq__lg-_BU_Ks558k6 z4!!%-Il!SzYJSpV>*2(L)6<+Vyz!Lyh{b)Y% zi^s!L%F_)o^jAJcYxk%^D(Rm*@xtT>razB6mj8^Ba44{~UR^#9I~++vOPIV`ZMKn> zeOAOg7M!kEZByWkc=W4w2Q)WdLRFX%+$EDWx)g2TjT3Rx)Cg&&3TX!iNY@f5y1eIZ zk}?vq(2+OO4hJxsM+D{w4(4}0{3!tGB6A7~P_RW0VW42OB+WaZ&RYVww`6pG)Mo7j zuffnN_Hv>aR{bpo11}!aYN^Crk5n~bi?KFXR-|%_Z=U8~S4#(J{+Zqo}zHYU&@plIh&%Os%JTSn4 zzxx;uKSM~yXk_Sv^u>?emIv=%W|R^d2dfPH zK%oncGuF(BNMKRLyE?it7hFCy^>QGmO4Wi1>S;ZiJe&yoCrfOJs%vxuGhoaC{l{rJjhfdHvncY1~kkvNqp>Q~*zI>2YYmk?)~ z^>pM43@=byo5i>sn6|xjH8md-9+lsWP%b>2*O|ZcQQ9||2?&*x=B0ZVXQdi%|LW>O z{+ZPsDlvbibN_+&8?vL*$-;tUJwZVkO%&Qtynpi-hxUQ^-4dxVb>2t9!z-VH($dh( zjqdyntk4cvEk)zZcQK2lCE+9)Bypx4pjqgk$y3C`Rn1SGoeQ=5VqeVe##b_@^}Blx z*=C)Fbo2|3RHqH{o4)MlZ&&smV>D#Es)#U03z@r^izO4dCNl-6@HW2~#H1vXe{?Ws zUS`w$7gM2YkSsfR3+cdI+t`5A))Kk8y7sZpz5l{#*9IU3HdZE_FKO?nI&#TboId{` zu5Eb}3cHw=i5wMR_X6O;%VVZh6|Egnic{av_yOo{BofWb(*sOUG{Jt z99JNOun26trA=srD>&bBrd1?Lry?P#`0bzP{t?|k(2wpPfQPODhKWMF$+PWot5!A* zy%>D1_hz=lk3U_A;}T5lIwFhP<>BTT;USX8PvQ88nOOft{SeA8ndN6QnwX23qnK6} z?DjYEvI#r3f8pu44*F>bu1gg!G!7AkG(MTImSICdfy>!rJc_Sa*p&Qu8gakLK7~A_ zW`VzdT(X+A+?Ifl6k@ z2B0#fq!}^hH#X@%c9mJG0}Wi6(>}hG0IgA11Ab{95&H8Bp`$Y^PgPEdiV?=vP-$Ax zih}YN$P>jC-T103OHA;8V`FrX6ORi=16iwU8>Bbc%xVLNJj=lQzgy&>DF_I=O~8D! zAlTesyBU|6Ib=H5@pi7TVrT0cRWU2pgt2sh23DGiPXsKY!~4{#ma4>7u|XC+02@Y` z-;fuDg$HmT%D;$z!YD`jhK_EB%$_VM;*&X5{T;23@hdE(^|aOI=i}WJrN<`Q_qw13 zQ?Q-WUr90!nKYd1_J)ZHScapEjQ-PNLNwLu;VK`T--`Xjs5iEh9~%ZOCs-4~%)-(^ z?$8tfpkLARY18`cyz~*Ui-~H{Vgp;Tx3`-Efeg7-rtM>T(NTYqSDT5MYlH`0K=93L z2}0NOxiKyrW3lOS15vLxJMfNI=u8^3-(x-tE@^DaYM#)92co3E2=Yli z2V*df4K;o-6A1%P71yotQ!iOtQ-D<^!C?TJgLc$=RIw70(NA_14S^7h+&z(nzJ04p z3BdOz+7mVBMSb!!OXK?`N{3%{eRz-_&aA_-QhnM5kxtrFcBFe+e;CY634z9#n{{Q27ME8oTlQ->{b@gs>&k+vf`-B+G&^h`_BOru$Z9lF z5iZ?J?%}7F9sfOD046y9`Y0LSM zA}}u1Zv^d>%}I>G?4if@m*ge4Mz#C;*J3o7GL5O7F`WReoL2o|IyUjcSIe7F=p(Qv z`yhiuoADJpyC+vhmEcn59qTlg$9z4n!>UY#!+o0zN%dQ7>oO(!7C|9o?7_j_#Je#w zlH~A$-2V=~3oVoC+V`v4PsM!cgW63V++e^11z4H*Klq6rb>V|}Csjy2HmuwiFoWZ# zpEdg`+AE8y?hf*{IltckHevjF84He(O0E=Gv#gO&pjCT(EjeT5373!f3P{h*I<4GE z^7jp5{e{Mw@h>zVt~X9aZ;uP9QYPoHN-7k9c@Q#>%Ublm2#hK`t|b6p@X*lFkB<8} zbMx|$lqK$Xf$?Bi1U^%(&|%z`?Dr*rNi0+A6{SyVGzMK>43Uv)XAdzoM1}WePv+-d zji}QgB#a})W!b-rfF}Wy+SC|(7E_K5{5Z9S2%}1Aa8Xk6uVMz(6@%O!7^!=&WLkpP3` zGegTjmdDA$%6bIkc9c{4Z!v-4F1eE@t~L%6Z8yG<@VO~m$kpISz0L1=+M+f%Ggs!T%%F{90#@cvAyvV+k<-c-JO`klA? zms?X$7?m45oBU9Oo$?Bwu6mqqL#t+sMK2u-Z8(~`n%B(i*?mMf2jQQXmT)ZVxuSJ0 zNcUs>jlyHAUkj0uk%vIfzEm@1*a=v&BM{kEfoKnG$)bHPZ#uS~>3gno=_BrQR`goV z!s1lCJ>qwzxEts`lAfF$q{l^5uqqq4CX4}&thzsdUDZOHzmkl=OplL51JOQ~+N;1= zpg~ZkL8z1PQZ#n7KUE1tQ5J8?qo^^YluMPz7oVu#}Z zVG4eLQjwILDI*ujPsie(SpA~Vh!9OsOXLm_%RW%N9p6o!KwLWItu_z_#CiV@8B9Bb zh8awf4{tuuBI0T?KYh|SF zM*;^2T6%i;@8Rp2B8I~*@S(0xOovGwroFh09tEQCo0@$@s>{!T1Ww>Jnh5|#2n$zf z%!%U@W8pHdk6n^BIv>JB*T4;@(vJ`wHI>y-<4D}uU$3`qYFHArHL2adXN?W8Abn>+ zVC?U{n|e1#B#W~Ocir$L0FnF`tsnPqW3FV)*>p@s zIG@$UgunI<1`Ex;yJ69#(98;kmvwh{r--<7K+TkK^kIN%T~q)IK&L3W*>z#{pUP1jUDGZwb*~&E zSu z%d)rurr`Nag$v~%3DdDmKgMYLaj>X8GZAa`t+e(gTd?OX0kf|2Dba%Aj{G7UJ`el% zqZ^m%phQEA0d6_=SoWA)6xwjAag)3+D2yl-p@B+ou)lTVEIt7Fe1pqfC0)@%wSrv6 zZkUD9eYOk5*W(q*FWAT|-CCTY_at|LX}HN-@kG9TicMN4NUm$V=ZR102uop{i^;~B z%O+%w2S^fZI@%Sfk=9boo*LT*FzlE|gf}#-c_T6XbFCU+L=@+>0n#sBKl)jkmGQLN zEn+plkfpR?hXsT>5IAI>JwpXLwwR_SQFV3oK5Nt}QLOr;mcXUdG2AI^3NeI(2J9SH z&UgC_=|+wBM9kJESj>&L4H$6%LNyc@f1RGzFFsxZ#3h|kB9zm(tX8*R9YAynirOcLC2MH23-t6=yvra0!{eo<0(qcmt%KXRa|THj{#&endM@v>)_qw zUef>71@Ulk9;;Yr**e7;tr7NI^Q@5vKk}$wKgC3!Cco zfp28cFbN5}V46`#yXZJr)yI)lRS&Gu5+hk8g5JJ3ZlEimVUZ+h@DRxXG&0-#X4l5p z@4TrUpb$vWw~QteCP_)xK9~cxX#b&1uZD`eGmg95`co}+N=~2sW?M140~?8#0p#nj z*phcf6op7iO6n;5>39={!1nhHc2(rX>yiD)LR7w37@fr{9qF34I1JIg?T3}a!*)gO z<)Y7%J(?O686pHOM2^mLgb{QpiYgmm#6>k@i>~v#?H)kBCyNNUuy+g6w; z4)oe;$_ci#qpZz5?~}s`Ku~qcq5W*sk*)v4*2(_+#N~p$@;9we?DLF>TZ2fO+iBH} zcv@+Y7Q6p2*LkO^cjRgZ(}v}o4TKSNW02*{ikZv)&>!Ve;csd+m&wPDUo|9DpwKk=S7SXt z7gF7v$TgHl5ZE&?k_-ifdlIkO-qd4|)yr;(uN&%HJ6MUI!Io~>IJ|A7!(}|IMY%Cx z9{nw?uZF-VOS1e_WABG1#7@pLs+NhAe>hVkZXRCwG}F9Vbu^SCJd;L8 zG%CEe1G{}(BixxGc+d~9+5Z{>Mbeev^VI7@sbA!w7Bmv`;iUscT-n*#Ff&ZCkj?v& z7femv&J~@5?UiGPcJnAFU2k*3WF3d6+4f2f+qQ)S^p3CgCrB3N-&5G^WUL5lZ+D}M z*fT3+T)rGg1fFz=(R zwMWC}F1HJLX6O{Fy(}%Sj6j6_Sgb$tYcy?I1FORx|6OUA8Ob3SzT@u1`rpi(hKu_p zeEg~lEPD9s^H@2<^8PHtN3^vBDgF7ctwgJ?j`nTTxB9Ncff? zEIUhA`czD z|BMQ1c> z#eBwE<>9g-^X<3(wKhJ_r5l7dL7ES@%;ClabD?*mPwk=Y}cmMKI+jp!% z>`jxlYc-YDx$-Z5ti~Urg0J>F&t#rJ?1>3+t$WOjE#iTy5JcF5{bO6CZ%Vs%$r4jn zE)=EKmh+C;Kf`1+M)gEf_z)`$L*%?eZ+YQEH&RKT($HCl{%PkGb%AQ~dS6_N@d{{3NM#dS*PI$iCO>@gC=+B{WFgKOBJXN0%j$X-M$Mm#=D>v@hMJ_XP`79?!lMRW;`=&jy=Za=e&5XN5tGk|UL;On z%Pv&_{-XmU*QXVn8sf0wjDK!=LW1GKzGa%+!QqyNiwuKXR)k@wfGTqu(wwV+!B4yC z(ng(ympo9xE9*61f_@96l@i-9G4_6j@sYHV{H?E_x7=fKaYO3SRxgFG$TvR#ng{;o zaXw}kr9!w|mKK05M8#{@?EUj2!#Ud86*(8gUJ=*Yd$>Q5cM)K^J*v_d!mb$>!@9g9 z_BA*;o#9D{Qv%m7@AwDMxl#`Hm%J(w-}1lDruL*vn4926HhB96f0MEloxE z1J*NtMF^x7ZT=!`d;U#T?Qq6PNF|{wYew_p7rq_ZBNBxexygrHl*lywkSFZ&HT}qV zvU72R4EE4=uChULygvmKjR@;yZ=lrno(3?B8}AN3SM=)tDX+>Q1J(fiS2jIcAB2CI z;T(!R%Sn|PKxGx-Pu5juL;j03sdl@;+6{}~$(u#@TA4&cpq4{IX7vRndd2{tx$B*@ z87tYok7@#AX66}!IuD0u;C(P1N&Ep)J~4ElIPAR*rHqBJ(QjZYDPNir9D6Q%oGus4 z4OEo|8yX@tH=xmGVbhk8(!R#zNtQfIK>_yC0e~z(JjtDz7rAqgtVXLK%MGKwHcxl#El|SP zpRAdCiQ}qH(hicmBfBpm5cJd6BF9h#y3dD!)8FPc|DxQ$|M}0FPqdIOqe%iNv_3cm zRwusw6GkAP58Fq*C<+dN@JfQ2(zgoV-!1*&Qg!^{A}gMJfJl4OfVe_;cM?8S{0>*p z?~!fuZpoB!>vrkqOkXw@0w16v;oK{T4?tKh396}gdn%uQ&>!8&Q(jx&VkL3BM`lkM z4~}H9ikwL(b9Zo);kfAWTT)>`YFzCC-yPM<^F7(gI=`;-C$i()vTY+KOS^oys@_Ij ze+`O&Hbfn}N?pUEdf zC!_`CN!rv1MbdukaehSDV66*5$I2itsVFo`*t=i8e92a$P}SZZBcc2Ip$>-)0wZe& za(L8)NqD;oDqCHaftzYz` zyl-x#o3xShH6{~yym9tkMqcvS^H}Wz-FvbRsj6y@4_y>94Y{5w%YaTZ2}Pc@z97Z+ zyY(a0q$rH`Oa;QEqr)b+D~&yJ)j~XW@}^yJ>oHfkzsk-17G>yH7#G5O`1r44`%CqU zeEn(t6`;z>?F)?;V|(fX1{KG}Z#>qJUIgu@b*m&y=ex;9A&u34$KCbSAH;j{gO^5}Ca-y`AS zhFHkCq1H)5r|8`=dIKgOJ$?^uC*5S@qCsffRMeWoY8?4w4{ZTF5Y9`}csSWni26~M z?Kv&Y9c1(<^zPtBI-fPK8zRho6GKqt0ahag{_BhT&U&TpNj3fZP&Qa~6D>CC-$%fJ z6Q$Y>^v~QSb(lbVES)(>)2bXQCAw+a8r$%q){aa6@-gLDm(}6H9Azzsx)%CH??JoU zne?M75dQU_2pZICSuXTQAz%<;_Sa{R^egllc-WP}zl^0i<4GkVj0$_R0>Cp%>na2U zRW!6ob$Z7&nA$8{@GlyVhP&Brgnq@@{aR>tC^-2KD?xPtn3zN>4|V1{tS?vN zmk1gcd#fWwEOe9Uj7kAH1qX8TNjV2F1wx*~iILI>-ZQ5+^z1u?PwTM|FKa$`M1A1vNx^q`%*6OOlP}9r#YCKaOLX zUndvIIAlS;k1*1IFe2~zb+qnE9T+*9M+LKVbd#)B+vSGemLLww!MsZN`5h-i>BhTv z$mbpYj@0jiLg`XTc@gLLkU%dSQX-+b8uVC^S;~x9mK^Em!inI}X0>NI zwXgEg{UZ73RdApb!tJYK=6$`S?}qixU^}9TlxWU*H$CKdCOf zAv|sodove1%Bl}{4tQfoRcOz;H0F&09k@Rt&S6*yagcXvP)n2<6APWCwTwvU2G0OX zWjZ2yQ#;PfscUmC+BB$7iZBm)2x$-2f+^$@<;oX@Lc*)`I^fc4k4xH6dCKFdkGSB& zHHvlC6?w7NV3^%Ww#WA z@dwl_q`4n$+Q36kI^=npyOmc7zAL8$_CXIHN>Z}a;6SMP52erZezCVL-+nw?z}((k z$Tm}+bXoP?f0y}GJq7(y;N!x*Ao40K* zpVk`J6XZpV(MhA4Ojg{?ua_@6lE0EF9enq*L2_CcS82<_28b!>Gwk@TOSl`3;WW`8GwI5XQ8MQj8i(l^Y6C zTgz`SEQaM|$XH9qqiqP`hPJ zt{95+!!m5>)A~;HSQ^!pQ!+C8%yI zz=BK!b=!S`ytkPV8nZ#vmj7EGX+njAt0kyL{jNx7|85ma;#|w)=+}#8^Y3@EjD>`k z?sieyWrRfSyvB-+^Rb>C>h-$8c!3N|%X2NH8%`hN(0JI%ZoQuR@qJYs(8Q)IHX6aZ zIfxYId=HY;>wh7{Id}!^_Qu~bLfQ_Ezw_MCVIyt`A6lV70sKRcj9cgmkx5Y+@jA6d zqapD+4W2C#A=vMD$(_zLEP2?)eR;9pveih$Zi@kr)LG{#cKYN?$!kH9;5TPC&fElN zA4@3Nv<8B#s|-%>paU|hH%}u~q|5hs$BQYZ9h&HEo6jOWc@mav&gG~4_u_7?_XNtv zF8=LNblt0ah+UhRAvl(*&!h${>PYbX-TccN@M@GF7@UI&JKXkH+)9j$D7eXf{4lSi z_I_KsUiL+aS*i=8Vdle10*NauZ5c6N?5%z%){p`Mk#&|AL5rA3{83LU zLJYOtq~CHjhDi8#ElR11ne>|1%(j;8aUbF3tZq)?Jvgf79Yyq?gVmBoflgabr|s)8 zBS%qAf*pK0km^(v5msQ*M{oQ2_@LvWoW*x9Xa8kb8c5_w<$23$DKSD+R!(K?G|%*vjIcvL zm=byKfAp6wXyGtv_Pn;WoIja6Yas~2&8xs)Hn>oo_WC>A@YS?Ff}j_vtDN*b$lXeO zibdfX7lkwP-F%}uC$zphgGsIz6owlR>quEM&&TiM4p4}f<-;~ELA0L+9T-vI=uX3R*C43(5cd;qFCLZx2-g3sVA|QC99bqcH ztj+6+;u2e++5m;Zs^A@sE)NZXA!(j3v&!3(Y(idj@wn%)a0UF{$iK8$y>kl7l~Pep zK5tj<1UbwxZcS*QT=}RdF&4}SRi2evPL1e(ApwabNk^+)bk!M5UWOceJmVQ~0tQzv z2TSdaJtu_^yrwq{klE|>L>`i$kzhOn56!ht1egXi*B}hFivK(eDx^KplL$VmEK0A< z`nHL*rIDyo%%75PfW$|SelK&gmaYnnLpL{D!<-JwQ|b=>l?Oj-dS>5?7m47}Z0Jcc zK&;vVbOw2GLFo!{dMLk)^|NWoGnE625oBCAlS&yIBdRVe_p_t`7xGW ze*T;6YY}X?XZ&yL*B6t#G9TE*5E2^jZyk!@4~1F~4HPCjB?2`KW;RU8Ua2$Z@VBUB z9MozMdTDY53VEVzxCCXUhZ$*d81d4jevPpvxi|>iKJ;V0-`al%p=4bQuQ*it6fODC z{`CS*$%P2~8s^mP2992j5a6@<%?tPMe(&j=_B_@$M_7m2S}tF1 zQ3;G^h!&*I^xZF)<+w^{eHa0?v*Z0)UBT7-aQsE`W^U5Ue_*Eu6}mVYB~P_fH9jc z0Fmt634`&v9be4X`arA^ zi@lDCNH+YOphs!EwIrrv^U`smto0rG?OSUt$WI%!-H@s%OPTC&rk7{}jxf?%!wQFM zP973E*bkYX-Ys~|QFo?}J@vkmV?JoY>R&%GYTS?~xjEg8|B?Xp5>T`lWL;MCd1Szx zBP0_GH|@{>U!#17n2A|r&YZ*7Bh_ifOzUw?;0XIK76(CBO)wU9;Ikb4oin|CFapma zEO;H5^A;BF;hUsXzfr*DwZzzo5n=NqUBT_sRps3|aT)Djes#?312rcU^i_E@^BI>< z{AB`QC}PDQ^|#hNx=wd@p^?JzogG}wZ>zGFoAw%A`00Pk{NDGPb|$aUxmvOhT?mQ5(c;b;gvvP)B{30CjDZXjvx z&l@Q=1CjkG1C~M-W9wg5t4OD9|Fl?(ybG7N`(hrHQj+;*>O+nV{7!OHaNDR1D7@jr z+5~-E^7q56em(LK_YpAJD5nU%=@5u#lTBHVkPESE;ZWtJjcugFeh{8j z>8UCoN!a_i=jD|YErYwjtbkNd#F(83Aa7@!Vo}%052z;zsg+)VR;M1CrGGt#5S75o zcWes?UQ@oz665*)*8w28%G@k_-AVA28>NaNN6x@?XCeVw{Lp?L;iUfAi{ujTBWjck zK_uWOInrXjDq)>{3k%jUs?4xA!_4jq%C`tX8CNA6aC2o51fhQFsaFK_g;#Wxd< z@#4Lgi%ch7UvYDSec|O&&i>79;OE2~_`sPFB(^%JD zXGIxkp0C&Xfhu7W(hWJ=fuHLjH)?in!SI3>QmP+9@q*vqw1)nWxiM3msPjgCFB2*w zp@uXZ8Y_27sPk~6W;yc>Gx_egZuxTm;rk9+l2x+Q{v;G`T3T$?Yl#@R{8_hhxBItN zT@??n8`cD~D(g-0eIN^&OY3wb5*j2FO?D~!Xp_onRGD1+JqvVFm6Cx#*k1(QDOGk= zrv|QNKb?Nk1~G(7IgKjW7jIK~{P)$!a6)K_JG(#T6I?X7Q+aWEVl#$JK=HZFdoFfMk1z?M9m2#aXi8t|!h5&Bvp z=s*Vn3Da6Q$dUz}U`Lg44F*Xcm9ZLU(A}hRNHcErPy?QB9aVwJ;Nw?;rpm9wO<`%5)HjvdE*|7&zTYC$*I+HbtkB$QB# z*`0yae92wIcT1@!1BDJDX^HTi@7nhpUb}1$M}!*su0e*sA+^|LwKaN*fn10hp6N6bMWqSHAOFv;8{YK=xTEKP#T4o2f{*+p+lI= zi3~6Poh&IRDsVW7$~m8NFZ_x)pNRY?qWsJ)*uxQ zqy>T*xZ0}*gH-o^c@J?9rX4n`{=Fg`2S`>kxbK(ZI>faLRThMSSvM@z#e4PpYP zf=(EjHAS;NzN;hgT*@)Zb3_e-bb=-nqWT=|g=m-jWyypDvWN?lTYMS?{@Xe_6;q<- zdBvH)kte{;3Hp5*{*VjfFX7s87KGKKrY?k*BYwV;!j8~Hr~RDTfjru+Y~Zckyc%JR z4cU>Y92K(%*vwqPT=CQ|l*-G$*VT?@*&!Uy+`p;ZEnx?o zU?|oRJuRPiBqv~~>3H*9vj2OK>rhQOz?WL)=a%QHsoH<4mArm71-h7c{pyYdo($+k zx0QfSi6yZ7!FsHbfjLU0u(XZ=&5m0x+8S6cQ}o)wP<*+VxriBcy!8+x&^&&9K03Fj zecB(V0j&&2kq{4G`o0<;CKHSy9UoA=F`+8k zkEBW)5D?tO2xq=g@ew>A-1ZOnhxWQmbNn{`PcK3r=(U>?k3(+gN4 zO&@r|I8Jod+2Nn=umt;vGc)3k?@^@mybLsMGnzqr_o3)VY)<)8j_V8?Gd*C3gE?YT zsMl=Rw;SNy{R&*c=wQ2L6K#uun1W3D4wTX_4ZTb zv;gzA9VZF6wUXat9N(az#o51#x0}e0FoXM&puz>yn~M$WWriY$fTx~LX%OwS<;ZNc zjWRI-jga0@!9UExepVmp?@?{y1sGG~gV2XBQZk-Rui~tggUox@xs)3*0%UH?vsoRt z-g(Gbo_RsT_jDtAjk02}MJsF#wGPr-4 z4owyY!hgU^j-RDG*!LABWN%EWt+%pFJMw$Xa=1FD^GsQFMO94jpXhaGt3MCD4>H>g zEqywQ!4;j3aL{`IFwH7I_?U;4L=Z|Z++$kX^_6_AI`l`^l#^NB9pFpd3o`>so;hPHZ)D)UGc%~ z`+Y!+Lxr#Z#*HmHjfNm#>>3p@(RO>8ROO~duF7e8_48idHMlUM!LJVucc;vUxzxKdPqKTv8>5d;i~lgi!*5Y z1I)WrQ0EaMUc4VfA}}&4MU`l*47(K??24WFI&?DXU8(N=+&UI6C4Wekj_XARS;fl) z+>2rz!sI*JNTw+fhmK|wt2HFKfc-oX^SH1r6B4iUBn=FnmLoCkQe7B6*8F*FBY;Ht z=m{JLfMsC%X9#DKk8ZWZPzf1|M-mFpQ zVjCKI;}dAe&~crT!|*Y2nl#&7**MKmLp+YCe`a;%nX7@n4i#{#8 zm6&#Tz`zI!jU;~W*66EM&4mdbx@tywEeZ6{fY#Wmr)r$Wg_xPx-!Ta+SOXqL{78_oBIa6f zU5Sob_3w(P;rw2A@dL(`OZihba?tF)(3GHMfqvjbVuAN{8OpaE&MUX(T?zTCJ9o+5 z8T8OVX-mZBHJkX!DjeMlxLQi+!+H5f2^P<+OpRvzHi8`LWC6yz#0P-abNg`F4s6h@ zUlsA=D~~#dP=HY5?j{bfX>(-ZC;K)K6~HV94e?k@4KCKho09@v;-KCjXH@S zLqnp97lXS{4SNp1CWW+?zwKTZy}j4qVgjmIv@#t98HJhqYX$RP&K z&MNPF+`jq$1(*ICXH|c&mYl6#?ehVhM1&wweuiJMux^+T{7efGdP2*yiiT?ha;Unp}o;YTAhR4HL zf~3-?5j;g~I*;oFeV=KPmKPd1uDi6XtbHSa1;ry(?lLuqxY|$KroetVx=4wCLl3jL zC!FxY^kx^B$1^VqP3n@J{suqBRnTzV zG}jrucCl%4iz<-uob(O8ez<1^-y5Qrz3#e7FG;D`KNMi-ChVu6Gxe8Wvh5r}%L`S2 z=Q~)!)6Pm|l$6u74j;^z!-+sa{o&%1;TTsRRh32!Z;g_$^U~s2>`^i>M2G zfXjX%`15rc^!R}Oyr?Wq)_K>@JCuww2=JIgYBu9&NZZ`!{4=GT? z1;)1%^=E`U8(nD=bz;$X2oC!jCa?G_fPPul z2_rNu5wkh3VX!X8%&fy}&?J~*0x*NP#f5RN&vsa7NF)_T0T!j@gfv~jV3MBpk*SEK zZwC!h8HmCe&d{1~OFB+fk^m_3Zy1yrvHzcZb%%$L3dEWZq<<5CP8nZzF+*ov465=R zv)_kr(RtnqC+)p8>CVwb$gQ@<`Pj0Fsni=S^TdeT8AB=6QS>VXn1-E^x6eMf0vd7O#f^0&|#u7>kF994>NON z))lvscH?%Pjpj5 z5&52=ZwYXL-=jw^QoeMNn;VXXWpZ?|KvnTVJsKyGkgNl(xkDPgQ0#@Fe6?-;w50Tj zQ6S*7!2R20c%TBcC;|CDZ^*5>$6Yn~AlZDU+?N)>O()2CrW2!H>W#yRvtYA8{aY6z zMq=HM7C5QGZ!~L8Di-P2+!So9^xX)ne>HvfB2ijpQouUjlB(Bale;#!=(ec~pAB*E zB?6>@_PE_7V$>Q9v#Mwz10WeFOBpx~)q!Odo~^(y#!h5n-z>WFxOh~+(Qk>+thjQj zYt7-jvP5Icz+?|^3p`j6A2Y-l?U81?Zx*4y5TaK@A`0w{)&J=mt`f9AoBo#`p#c8x z7c-7XU{2!HQc%y~=AILkpbw30vv)W7)5d)&W~59*NLPu+ipLhyJF1znUS4~ifmOzC z(7TbbPE6Z3pf9|zS)Qwx#~SE`Sgg14dNvftjU-8ST!k;?eaM966O*ZBjs#a@>U*4Y zxo)+kAh9lv2JzB~+cZ3xvoMaMFvpb}00oxk8gMrv#%BNO37PRE_@IQ6D=b}Hb|zC| zHvPEOjf`wUL080)+7OJFxx7Os4GSFs_F&rp9XZ<1nZf{$OhYa7%~k*Kh7#i>bLUKJ zZsim*Tt%EOwIKP00u%~(Z9;0%u6zrw&SJAgtm$g4#Jt;uAH1mackl@D+0-mLM6DWp zu+Ht~9%XsUh*J}ML4u4Rvc3P0d4LSho4VEyyHAg`HGh7+00u}2)_-?cJ0@UaOSlZH zl`2q2%~;^8QSw_l$n=h{FpxB~HHPh)6_GDz%@rLDZqIv67Z_Z*IV7{A>*6t#lxPh+ zzlP-odcnhDUEJD*y0@%gdx+NRaWafdji#5B%c$IX_$jjE9^%Koq#E)-(Cg%^*k4AqZNd-N3Bm*5k}WMZi$T_EHiHt&*|iDk z?&yTGRJg*^!u*l$l&re=`Rd4RrxrVQ%w$pfc-`=BZ`@x0C0`xm0C(_@aFGBR_!fE? zEBs}!ggil}gE@*k4zLEG;R>0f?f|VL^A8>q;LnhEUQ65iqs~J%A)|y$T>N*3zuQFi zB)JZ$6i`C98< z`XBEU?%bad_{{Ok0qulQ>zSI$z=p>j5v~Cp0H;){Ds!gP>#q1g0STJC0jT|Y0sN8D zUo|+Bu)%I`eE|JufMX}(S5y%1kLpiBN_%#Z<4Emt|FGn8v#SNVD zG9Y{a0t-`M(v?R%!_B`4_m-6wnGRBFJuxaQT2-Sf-dbZePM|Nr3y+TcrT-veREp5b$kNhCE>rd9)G%jmF%-NQBNcw5UKeZ z9R%oVQmCHNL zSjwmU$gW1aRxby5I>R1b4E|3IxUIrER)$$ESY*s_f%wkK(3gAIF zgqJS84nNySO_teBYIss4m+C#Xb#&-kDQ?^R<_sBS;X=bwX9ik9Y`D~+^R?bejX#*m zEW(!S3ne4JXMXm7@^0n*rou5)%{cy#bbMz^K)*2X8~o41EQ6TxGcX%RQ55P@6&fXm z_>*Zan0B5GcnLBB*Bo;}UkrYzwW{`~C82 zRpy8oEoA9-%mGKxiOnSaLpRv}ZjB1*x`a;t&j#c~ulEeTDPsymgd7KG|0Ye3-UnVH zV#^)1uavurSLB17Utm1KQB9`To$Nw;Ztz49KKUO(#p zN7YxbMfrWvs&q4ScMQ^vbfXB!sC0L?ba#V6cSwkobf7d%kA@LBF+t0!&E2a+WQRt3~-#?r&A`Wgn7*clH^15U6P;aMhl$tPX z-?T5jsDZytR~pz!2ag%k;HN@*$E!!+@k&*cOIMaW`F+#PLC(f*1=V>DK1F6wb{?F9 zJ#WR7M8ZX$VI!Z!@7$X>m$O#5nhL1;J)k_!*WY>_S=s$vI$c-Sk1{(0?{TP?)(hH6 zwrsAlda*4#U_+7bPzQOY-loiuH;h3KI>dN)oS9YTWcTo%VtHS`n`<>OlHxp-HKVt4oa~7Sg(xOh z>f>xd+t!<4_kX2>B3L{Jr445Uq97BOo^g#=490*cDU$?JEP)@OK$K=z}|P7Mf7n|}as4y++M&*(&Y zw{%QzZBLGK3P$&rh z-lJk}<9kM|2eVPbk!1``3KFh7uTkJ23JwBR8otPke zb41XhV4?rMAMU&%-L2&-;-M*Ee3>typc|}`5#|iyELSv`UJ5$|@FJJMihg)sb zLs6bd(*pjq9`+foE7SHT|1kfDqlojUDdd|WcNuQ3Gx>y)82Uc>5WKSz#b<>^R3hB= z;PU}IeV#%Qmvg%FPgTS@078x~m+jA+XvI)LOAZhqGczPOkRq#kh;7`jk0LIlPHp$3 zU=qZw7opQ36sCjKR+VIl#R#E6%(z`?#>u)oY)=ab=1nDyB;(Mcx&ofSN^t)l$CX(V zF_K0-M8dxo>8h{EBfRurl)yftnyV$fAoDV1rwina{G$R3dchQ>${~aAGfgCugKSzv z3+?`|0A~Ml^Lg{WI5baJ0LJXteo6Gpfj#n94z!ZJ4Z&LdjL1edfeh0Z<%habZqt0_ z`H>pyzuUO?GZzuU=6Jg*b=}(*nFm_=&XYa^z1dhO`r!I(AJC^nG}QqPwi!x>rc*KY zJxO)2TyzLr-drVq5mHJ+BaH+M+=GD|u!+tW9d+ed^*t-=?a_}D`6ipI!i}IjcRUZ^ zV zPrH6O{x^pYyR5laOK^z6mx;^_Ob7wF=;_BLIoNdZiNLh z;ZYKp$oBfAYv@zI$AA=M5cL(H zMxwL!P$A*xpi7`((((eS%5^$X6l}GX)#FZ}F@0F+tjvB{(T)jvt0oEZg12PwLifp> z+EyoU_}MVj=0jHQ1W5}n#T!?Oq?QN2>n(S4g&qemX9V)!espw&uk^33RF3VUJw=uR zvIqjP=%N^&pbfE7^AQRE-lYYy-qjfyo{Z7g!0<#|j0r;qbcam=hOUIx+4nC&u@icj zmcB8lXq}l?%+s=})yQVs>i=MWg>xA0w1P_|y@#7?hznSS)Ik<13bt=tP7QV5Vdzxg z!tmMKnJ0hQgQU?N7q#7;_z$9T-Bgu^<9j*grghuO@Se3tE=f+NmKm(7>RsYEw&}|= zBK`5LZeQmMhw`9tmIPFf1H_k7u`yg#=vNGyk#g|HSoY2-vS`|B*Z9D0ydNuF4NtzZ zEvv}B;6NmOZrN}A)^R_AO?OIyomOX2)wu+$J)ryh5@XA%I`{lX{D3$k-9!o+Xwn`d zc70`TT+$92tngz7VWGe5DAWRMYTJ$ZAkr$5sY*q(I~qZ-*n>Tu+_--cwV1NGb|DI{z~JVxedsnEsZye0qg z^Vs62rz>jLJ6TEdBe|2c5mKll3deG##AT>#$=_m5dsNE==Dse}`?}0}U81nU7am9{ zzii*=i!OdP5;g^9opZ$~J#KeHqfO^4kLmMJdp~>t6;$x=QY|C^`+9r_VLjPgjp`Cce!wiaOS@U;9+3g{h(OwOtXqr=UNfpHu1cB<3< z54N+BIDIS{wMd$->$u3`!qJTXKPJAqemuvNG|i~Um5Xb-L$ml&3Od-KZGK0RnaE3`0sIvx%6@F-^xK@AmWW{*EB)XH&hcBKCB3EFxExkX5()p>6Ui#g?YsRPw?W}hY1oR6Mz-(U3@_A8? zu`68ScdLALd2H2`;XQ@^dHM9wLG-aLTxbPElojK`68dw8-^a+P{d`@;F=5*18*^B2 zLnSTJ0FJEU9N@Y^?b7^z;~${s?8*t8#W=OdB;@h1F zY%1zH;3qVagO4lAJ>?PP;hT;BHEvo;LPyPK>YMN&DQ@d$E(A2YWc%sg+o577FCxkJ zRVGbT1uPF|k0VbM8`6_f#o+@YS=4(jH92$bEcQ{(A)PRqemaAZ-s}4`kS^RlVx(;&XcX z%OQk%VdV?{@55Ql)09X6M=4^{ecro01;xG}11R>h;KhD!ap_MP*)m>iYOKqs0!v{Q z$E2I?MELYw)CV3z#S#F$I|`Els8xPkbqRvyKaT!a<+o4g`Ar|zaCk_MueyV)eBki$ zkK3OQb^q0Aa&50p_BGvdh=A!^7cnX|4L)tCmfS^(9YygW(0l>K|K{s;Y-4y8x(muw z;#1)sem{a4A=P7?Rj{Q7vLNRg9X-YwZ6_EpzxH_|9#~%g@vj35T0I+^)TPm6^$PU{b>G~^q0cd6Q< z6DaO~0!wo~wO z6qw9^yO5QU%q``>J^z!JDZ>Uh*(VoOYR1lW9=ee`YbE`q602QlYhDx%1$T<{Ck~cx z2_q~tdYhoIhNUYUpemLt6~v@?vL3l}pMpj(C&N=mPzAS2%LB#gEwWnbZzXtIrd zWnFL~29Ym<0mgB=zRuB7HxpPw!s~;T2JdGb58q>cP8G_SPLy?-kWhVm{ z*v2%It5&FS5k%OnJTcte$caaf#s|qtk=3xH~d(|N5P?2V- z(SD1FfZ#6}%%GTbb<=!Wt-OuV`ePh+2PW`rKyFK6)7(ax z7tK&&c|Ic0zZnP9n$^$s2dTQV)&J_lW{FAWKwuAXwG=kwpa_x9@a?-ug}6{#5`h4!XK8*J4I`jtB^HvhT(S^3i%} z=~sx=veF^!#^cA=PY7ZU`+?>@RWN6Lm7lQc(18u8_I^lq74?~}etmPAHZ4(ANWppJ zyt28-52T20%!f`hGv(P&refHxA4^>}D8I_p9GFW?%83#kpY znrw(r4bs=*_$ra!r?eu)NT&z`_*fsk%>e8*`TK1dfXn3RANA<*SK)QFu6H9G8DwNc zGu~u)xW<3V4T(c%BtgLmc3&q07DUK5Ya*))t@*jH^7A@)Jmn`gr8{Y?v%Pi81+ht| z|92*egIWIOHvB5}DYXlhmV&%+--N(tTPn+f))H-oP;-{6fF)I_+~FB6!;&oa{H-%& zr=P0|?G&Fd#etEkqK2e8jh4_UU+;mNc=Rz0vnotgEpPnH$f|B526VQ^PlLgg6(NwUKSLf!OgQni=^`wwaaz&wBFL$9KfbTbtaSPi$b zSV>kpBL4U?{Fu&TFGRP3@FMApOlP$h;okiz#go4HAK7K6AQSS09!R`muFTnSqJHvpQR)^f!@yYn@5W%f(7>Ho(Qg7)ad*8X~ z*4OUi_XMAQQGk?SQBx3uU0_|RxMHR<$?}L|fXvtd3J0ToUy(W*$2Af_#r}i)=IgBj zcGpRAc)oqLE;ml^<6y87Vdta4*BJWVj(R6$kdV@F-h-9x(%eq35rBP1lgV2qKR3Df zh)OA!p182O#8#esjYB*&FFEL{W^6pTTd0gF%qnmWXTE+2wrnWkNtgXAnQ1})*>|K5 z9}rL}Y@R2~5-&dnCBXByz+h)(MPB68i`>imXsNZi)gcYM>=n-?vM0`O5mXupOw*+s zs%Ro0TC~N9iL>}wYB`7-7*PT%@=(?Hc9Ui+9h8W_9wP-pr|`*GpYC{}+Q*};ja0OJ z4_qwYDIk(%MO9fVlx4aP!+Az{P^|uKIamI!-NU;cBl!GNo~0h*3AZpt$LgKkGD=%^ zQ8{$OiC)N-jV5V}4@=vvymak3<+}rmp-^$3mMach-|G|O;$bhU3&e>pBPUI9hE{0O z**E6jnYf=9n@4G|0U(Ds%|+}il9zru*^xKl} zx+G%o8TnxRMNhqWV9EoAG`YbnCFni2@;~;`bSh?Mq=tSb9r8xxp{Xa)6IiDB63O#Q z4n^pnghv!BSEwQ9``AlywGe(jDhW?Ah6@pz9Pg`{spa@*ES0Rgy&P&t=~+r-(lkN- z|M-$`T1%s!krb0kl!WOM%Tn`)w`3C+z-%_+vK*v8Vy~=Au*c>2dFH{k+V&L8q0Vsl zvptM+K;!+!CfZIVl_=8GdhnDn=Dv%Ao!he$bqSgh`m12zm)>QnYE(;N`mDC!1U+x* zA_-3rvk*N2DS!v1a_n*O(^1ZW5L!=j%pqPA)$+!vDm&TC7iSE*-g)|UCb-Kl>q4QeW+zzSqO8reJ!ZNVp%DXwO zkWqg5Dm8!L-(B$$r*=E~HD_OMK_mv&7uCmk`CG_f2+*^hx>^F|$097&P&qcEvDnA=YL@`h@F>W8y0g;EM1BT{XeV7M%qwRHL8hdW}AL4WiEaiL%;uYsQt2 zC|CpmTH%k^cyu8FYh>-Z>Qp74zM_v~@#Hv;G#p^3 zd#X&1|F$P0{Tnxh?F9IDywL~1=1fjIW+_azp99cePqxD!iB%OvqA~y&zu`dR>1zU{ zt;jd4e*5Q@=YjMntIO@=fXTgH=P+3d+So358w)5w!uW-dd=Wqff${@&@hG}Cy~m#H zzjhuzEXphXYcBY9Jl^%_@5bEu-LQU~Fiiq3R3vsU+m9Sjb73PNcM~@qTTiHgR8i{U z6;)Vnⅈ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 diff --git a/plane/fuel_total_correlation.png b/plane/fuel_total_correlation.png new file mode 100644 index 0000000000000000000000000000000000000000..e5545688927e3ceb67fd148a2eaa67b740e17179 GIT binary patch literal 93299 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 z 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 P!q4=nGpC%GWb5}|P|x$D literal 0 HcmV?d00001 diff --git a/prob/p_B.pdf b/prob/p_B.pdf index e66cc475a77991d66b82cb677a97c29741afcb10..4a71604c8aa1798c7848851d6bb2e6c406eb2c97 100644 GIT binary patch delta 4901 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 delta 21 dcmaEJQ|8EasfHHD7N!>F7M2#)Eo?_-0|02q2(thH