"""四个方向(A/B/C/D)各一个可用实例,共用同一个合成数据集。

方向定义(对齐《自研AI立项与计划.md》与《自研AI_P3算法原型计划.md》):
  A. 功能聚类       —— signal='F':按激活响应模式聚类,替代几何欧氏距离聚类
  B. 多尺度树       —— regionify_hierarchical:先粗分区成大区、再细分小区
  C. 区域函数升级    —— order=0(质心)→ order=1(低秩/主成分)
  D. 逐层区域化     —— signal='S':按结构边界切分,层间不混聚

目的:保证可用性——四个方向都能在当前库代码上真实跑通,且生成物可
reconstruct() 还原成近似权重(当模型权重用)。

运行:python examples/four_directions_demo.py
"""
import numpy as np

import _common  # noqa: F401  # 先导入:完成 src 路径引导
import nrfunc


def _recon_ev(W, res):
    """重建权重并返回还原保真度,用于验证「生成物可当模型权重用」。"""
    recon = nrfunc.reconstruct(res)
    return nrfunc.explained_variance(W, res['assign'], res['K'], lambda: recon)


def main():
    # —— 同一个合成数据集(四个方向共用)——
    rng = np.random.default_rng(0)
    n, D, T = 256, 64, 48
    W = rng.standard_normal((n, D))                      # 一层权重
    A = rng.standard_normal((n, T))                      # 激活响应(给 F 信号)
    groups = np.repeat(np.arange(8), n // 8)             # 8 层/头结构归属(给 S 信号)
    print("=" * 64)
    print(f"共用数据集:W=({n},{D})  激活 A=({n},{T})  结构 groups=8 层")
    print("=" * 64)

    # —— A. 功能聚类(按激活响应模式,而非权重欧氏距离)——
    resA = nrfunc.regionify(W, signal='F', K=16, order=1, r=8, activations=A)
    evA = _recon_ev(W, resA)
    print(f"[A 功能聚类]  K={resA['K']}  口径={resA['explained']:.3f}  "
          f"重建={evA:.3f}  一致={abs(resA['explained'] - evA) < 1e-9}")

    # —— B. 多尺度树(先 8 个大区,再每区 4 个小区)——
    resB = nrfunc.regionify_hierarchical(
        W, signal='G', K_top=8, K_sub=4, order=1, r=8)
    evB = _recon_ev(W, resB)
    print(f"[B 多尺度树]  顶层={resB['K_top']} × 区内={resB['K_sub']} → 叶子 K={resB['K']}  "
          f"口径={resB['explained']:.3f}  重建={evB:.3f}  "
          f"一致={abs(resB['explained'] - evB) < 1e-9}")

    # —— C. 区域函数升级(0 阶质心 → 1 阶低秩,同一 K)——
    resC0 = nrfunc.regionify(W, signal='G', K=16, order=0)
    resC1 = nrfunc.regionify(W, signal='G', K=16, order=1, r=8)
    evC1 = _recon_ev(W, resC1)
    print(f"[C 阶数升级]  0 阶={resC0['explained']:.3f}  →  1 阶={resC1['explained']:.3f}  "
          f"(+{resC1['explained'] - resC0['explained']:.3f})  重建={evC1:.3f}")

    # —— D. 逐层区域化(按结构边界,8 层各自独立区域化,不跨层混聚)——
    resD = nrfunc.regionify(W, signal='S', groups=groups, order=1, r=8)
    evD = _recon_ev(W, resD)
    print(f"[D 逐层区域化]  K={resD['K']}(=结构层数)  口径={resD['explained']:.3f}  "
          f"重建={evD:.3f}  一致={abs(resD['explained'] - evD) < 1e-9}")

    print("=" * 64)
    print("四个方向全部跑通:生成物均可 reconstruct() 还原成近似权重(可用)。")
    print("=" * 64)


if __name__ == '__main__':
    main()