import os import pandas as pd import numpy as np from sklearn.metrics.pairwise import cosine_similarity
def compiler_absolute_isomorphic_collision(): print("【真理の絶対アンカー同型衝突コンパイラ】 起動...\n")
# 入出力ファイルの定義
stream_a_csv = r"C:\Users\141798\Desktop\Voynich_Base\Stream_A_Dense_56D.csv"
stream_b_csv = r"C:\Users\141798\Desktop\Voynich_Base\Stream_B_Dense_56D.csv"
output_csv = r"C:\Users\141798\Desktop\Voynich_Base\Voynich_Absolute_Anchors_Strict.csv"

if not os.path.exists(stream_a_csv) or not os.path.exists(stream_b_csv):
    print("!!! 致命的エラー: 必要な56次元密行列データが存在しません。")
    return

# =====================================================================
# Phase 0: 56次元密行列のロード
# =====================================================================
print("■ Phase 0: 56次元密行列のロード")
df_a = pd.read_csv(stream_a_csv)
df_b = pd.read_csv(stream_b_csv)

# ラベルとベクトル空間の分離
target_symbols = df_a.iloc[:, 0].astype(str).to_numpy()
stream_a_matrix = df_a.iloc[:, 1:].to_numpy()

keywords = df_b.iloc[:, 0].astype(str).to_numpy()
stream_b_matrix = df_b.iloc[:, 1:].to_numpy()

print(f" -> [Stream A / 内部宇宙] {stream_a_matrix.shape[0]} 変数 × {stream_a_matrix.shape[1]} 次元")
print(f" -> [Stream B / 外部宇宙] {stream_b_matrix.shape[0]} 語彙 × {stream_b_matrix.shape[1]} 次元\n")

# =====================================================================
# Phase 1: 多次元トポロジーの衝突 (コサイン類似度行列の生成)
# =====================================================================
print("■ Phase 1: 多次元トポロジーの衝突")
sim_matrix = cosine_similarity(stream_a_matrix, stream_b_matrix)
print(f" -> 引力マトリクス (Cost Matrix) 生成完了: {sim_matrix.shape}\n")

# =====================================================================
# Phase 2: 相互最近傍（MNN: Mutual Nearest Neighbors）の絶対ロック
# =====================================================================
print("■ Phase 2: 相互最近傍 (MNN) の絶対ロック")

# Stream A から見た 第1位の B
best_b_for_a = np.argmax(sim_matrix, axis=1)

# Stream B から見た 第1位の A
best_a_for_b = np.argmax(sim_matrix, axis=0)

mnn_pairs = []
# ギャップ計算用の準備（Aから見た全候補の類似度をソート）
sorted_sim_a = np.sort(sim_matrix, axis=1)
gap_a = sorted_sim_a[:, -1] - sorted_sim_a[:, -2] # 1位と2位の引力の差(Gap)

for a_idx, b_idx in enumerate(best_b_for_a):
    # 【禁忌の排除】ハンガリアン法を使用せず、純粋な「相互の第1位」のみをロック
    if best_a_for_b[b_idx] == a_idx:
        mnn_pairs.append({
            'Target_Symbol': target_symbols[a_idx],
            'Keyword': keywords[b_idx],
            'Cos_Sim': sim_matrix[a_idx, b_idx],
            'Gap': gap_a[a_idx]
        })

print(f" -> 【結果】片思いをパージし、相互完全一致ペアを {len(mnn_pairs)} 件抽出。\n")

# =====================================================================
# Phase 3: 特異ギャップ（断崖）の数学的証明
# =====================================================================
print("■ Phase 3: 特異ギャップ（断崖）の数学的証明")
if len(mnn_pairs) == 0:
    print("!!! 相互完全一致するペアが一つも存在しません。プロトコルを停止します。")
    return

# 空間全体の偶然性を測るため、Stream A全体（全変数）のGap分布を基準とする
global_mean_gap = np.mean(gap_a)
global_std_gap = np.std(gap_a)

print(f" -> 空間全体のGap分布: 平均 {global_mean_gap:.4f} / 標準偏差 {global_std_gap:.4f}")

absolute_anchors = []
# 【数理的足切り】Zスコア >= 2.0 (上位約2.28%の特異点)
Z_THRESHOLD = 2.0

for pair in mnn_pairs:
    z_score = (pair['Gap'] - global_mean_gap) / global_std_gap if global_std_gap > 0 else 0
    pair['Z_Score'] = round(z_score, 4)
   
    if z_score >= Z_THRESHOLD:
        absolute_anchors.append(pair)

print(f" -> 【結果】Zスコア {Z_THRESHOLD} 以上の数学的断崖を持つ絶対アンカーを {len(absolute_anchors)} 件確定。\n")

# =====================================================================
# Phase 4: アンカーの確定と未定義ロック
# =====================================================================
print("■ Phase 4: アンカーの確定とマトリクスの未定義ロック")
if len(absolute_anchors) > 0:
    df_anchors = pd.DataFrame(absolute_anchors)
    # Zスコアの降順でソート
    df_anchors = df_anchors.sort_values(by='Z_Score', ascending=False)
    df_anchors.to_csv(output_csv, index=False, encoding="utf-8")
   
    print("👑 【絶対アンカー 確定リスト】")
    for i, row in df_anchors.iterrows():
        print(f"  [Z:{row['Z_Score']:.2f}] EVA: '{row['Target_Symbol']}' <===> Latin: '{row['Keyword']}' (CosSim: {row['Cos_Sim']:.4f}, Gap: {row['Gap']:.4f})")
       
    print(f"\n -> 確定ファイル出力完了: {output_csv}")
    print(f" -> 条件をクリアできなかった残り {len(target_symbols) - len(absolute_anchors)} 個の変数は、妥協なく [未定義_XXX] として保留・ロックされます。")
else:
    print(" !!! Zスコアの条件をクリアしたペアが存在しませんでした。")
    print(" !!! 全ての変数は [未定義_XXX] として保留・ロックされます。")

print("\n" + "="*80)
print("👑 【コンパイル完了】")
print("="*80)
if name == "main": compiler_absolute_isomorphic_collision()