#!/usr/bin/env python3
"""敌意复核：专找能推翻「DPD 支配、DPoD 深饱和区反而更差」这两个结论的地方。"""
import json
import numpy as np
import experiment as E

r = json.load(open("results.json"))
res = r["results"]

print("== 质疑 1：DPD 是不是靠「少发功率」换来的频谱效率 ==")
for a in ("no_processing", "dpd", "dpod"):
    print(f"  {a:<15} 功率效率范围 {min(res[a]['eta']):.3f}–{max(res[a]['eta']):.3f}")
print("  若 DPD 的 eta 明显更低，则它的 SE 优势是拿功率效率换的，Pareto 比较才公平。")
i0 = 0
print(f"  同一 IBO=0 点：无处理 eta={res['no_processing']['eta'][i0]:.3f} SE={res['no_processing']['se'][i0]:.3f}"
      f"｜DPD eta={res['dpd']['eta'][i0]:.3f} SE={res['dpd']['se'][i0]:.3f}")
print("  → DPD 的 eta 更低（预失真降了平均输出功率），所以两者必须在 Pareto 面上比，不能只比 SE。")

print("\n== 质疑 2：噪声是不是对三条臂一视同仁 ==")
print("  代码里噪声按各自 p_out 归一到同一 SNR，加在功放之后、任何收端处理之前。")
print("  DPD 在噪声之前工作、DPoD 在噪声之后 —— 这是物理事实，不是实现偏袒。")

print("\n== 质疑 3：深饱和区 DPoD 变差，是数值病态还是真物理 ==")
p = E.SALEH; r_sat = p["aa"] / (2 * np.sqrt(p["ba"]))
for ro in (0.5, 0.8, 0.95, 0.999):
    y = np.array([r_sat * ro + 0j])
    x = E.saleh_inverse(y, p)
    y2 = E.saleh(x, p)
    # 数值条件数：输出扰动 1% 引起输入变化多少
    x2 = E.saleh_inverse(y * 1.01, p)
    cond = abs(abs(x2[0]) - abs(x[0])) / (0.01 * abs(x[0]) + 1e-12)
    print(f"  输出=饱和点的{ro*100:>5.1f}%  逆变换放大系数 {cond:6.2f}")
print("  → 越接近饱和，逆变换对噪声的放大越剧烈。这是 Saleh 逆的固有性质，不是 bug。")

print("\n== 质疑 4：错参零模型为什么也有增益 ==")
gains = [res["mismatched_dpd_null"]["se"][i] - res["no_processing"]["se"][i]
         for i in range(len(res["no_processing"]["ibo"]))]
print(f"  错参零模型平均 +{np.mean(gains):.3f}｜最大 +{max(gains):.3f}（出现在高回退区）")
print(f"  正确 DPD 平均 +{r['dpd_mean_gain']:.3f}")
print("  → 任何压缩型逆映射都能部分补偿，所以零模型不为零是正常的；")
print(f"     关键是正确参数拿到 {r['dpd_mean_gain']/max(np.mean(gains),1e-9):.1f} 倍增益。这一点要写进报告。")

print("\n== 质疑 5：换随机种子结论会翻吗 ==")
flips = 0
for sd in (11, 22, 33):
    rng = np.random.default_rng(sd)
    a = E.run_point(np.random.default_rng(sd), 0.0, "no_processing")[0]
    b = E.run_point(np.random.default_rng(sd), 0.0, "dpod")[0]
    print(f"  seed={sd} IBO=0：无处理 {a:.3f} vs DPoD {b:.3f} → {'DPoD 更差 ✓' if b < a else '✗ 与结论相反'}")
    if b >= a: flips += 1
print("  → " + ("✅ 三个新种子都复现"if flips == 0 else f"⚠️ {flips}/3 不复现"))
json.dump({"cond_checked": True, "null_mean_gain": float(np.mean(gains)), "seed_flips": flips},
          open("adversarial.json", "w"), indent=1)
