import numpy as np
import pandas as pd
from pulp import LpProblem, LpVariable, LpBinary, lpSum, LpMaximize, value
import networkx as nx
import matplotlib.pyplot as plt


# 入力データの読み込み
def read_input_data(file_path):
    # CSVファイルを読み込む
    df_yunyu = pd.read_csv(file_path)
    
    # セクター数を取得
    #NSec = int(df.iloc[0, 1])
    NSec = 37
    
    # A行列を取得（2行目以降を数値行列として読み込む）
    #A = df.iloc[2:, 2:].replace({',': ''}, regex=True).values.astype(float)
    A = df_yunyu.replace({',': ''}, regex=True).values.astype(float)

    return NSec, A

# 最適化問題の定義と解決
def solve_triangulation(NSec, A):
    problem = LpProblem("Triangulation", LpMaximize)
    
    # セクターの範囲
    SSec = range(NSec)
    
    # 決定変数
    X = [[LpVariable(f"X_{i}_{j}", cat=LpBinary) for j in SSec] for i in SSec]
    
    # 制約条件
    for i in SSec:
        for j in SSec:
            if i < j:
                for k in SSec:
                    if j < k:
                        problem += X[i][j] + X[j][k] - X[i][k] >= 0, f"Transitivity1_{i}_{j}_{k}"
                        problem += X[i][j] + X[j][k] - X[i][k] <= 1, f"Transitivity2_{i}_{j}_{k}"
    
    # 目的関数
    LowSum = lpSum(
        (A[i, j] - A[j, i]) * X[i][j] + A[j, i]
        for i in SSec for j in SSec if i < j
    )
    problem += LowSum
    
    # 問題を解く
    problem.solve()
    
    # 結果を取り出す
    Xo = np.zeros((NSec, NSec))
    Rank = np.zeros(NSec)
    for i in SSec:
        for j in SSec:
            if i < j:
                Xo[i, j] = value(X[i][j])
            elif i > j:
                Xo[i, j] = 1 - value(X[j][i])
        Xo[i, i] = 1
        Rank[i] = sum(Xo[i, :])
    
    return Xo, Rank

# 結果(rank)をファイルに出力
def write_output_data(file_path, Rank):
    df = pd.DataFrame({"Sector": np.arange(1, len(Rank) + 1), "Rank": Rank})
    # インデックスをリセットして1からの連番にする
    df.reset_index(drop=True, inplace=True)  # 現在のインデックスをリセット
    df.index = df.index + 1        # インデックスを1から始める

    # 産業名リスト
    industry_names = [
        "農林漁業", "鉱業", "飲食料品", "繊維製品", "パルプ・紙・木製品", "化学製品", "石油・石炭製品", 
        "プラスチック・ゴム製品", "窯業・土石製品", "鉄鋼", "非鉄金属", "金属製品", "はん用機械", 
        "生産用機械", "業務用機械", "電子部品", "電気機械", "情報通信機器", "輸送機械", "その他の製造工業製品", 
        "建設", "電力・ガス・熱供給", "水道", "廃棄物処理", "商業", "金融・保険", "不動産", "運輸・郵便", 
        "情報通信", "公務", "教育・研究", "医療・福祉", "他に分類されない会員制団体", "対事業所サービス", 
        "対個人サービス", "事務用品", "分類不明"
    ]

    # インデックスを産業名に置き換える
    df.index = industry_names

    df.to_csv(file_path, encoding="utf-8-sig")



    # Rank 列を昇順でソート
    df_rank_sorted = df.sort_values(by="Rank", ascending=True)
    df_rank_sorted.to_csv("C:/Users/ta_na/OneDrive/デスクトップ/sankakuka_2/sankakuka_2/csv/out_data/Japan2020_37_rank_sort_kihon_tonyukeisu.csv", encoding="utf-8-sig")  # index=False でインデックスを保存しない

# 結果(行列X)をファイルに出力
def write_output_matrix(file_path, matrix):
    # 行列をデータフレームに変換して保存
    df = pd.DataFrame(matrix)
    df.to_csv(file_path, index=False, header=False)





# メイン処理
if __name__ == "__main__":
    # 入力ファイルと出力ファイル
    IN_FILE = "C:/Users/ta_na/OneDrive/デスクトップ/kawasehendou/kawasehendou/csv/coefficient_matrix_kihon.csv"
    OUT_FILE_RANK = "C:/Users/ta_na/OneDrive/デスクトップ/sankakuka_2/sankakuka_2/csv/out_data/Japan2020_37_rank_kihon_tonyukeisu.csv"
    OUT_FILE_X = "C:/Users/ta_na/OneDrive/デスクトップ/sankakuka_2/sankakuka_2/csv/out_data/Japan2020_37_X_kihon_tonyukeisu.csv"

    # データの読み込み
    NSec, A = read_input_data(IN_FILE)
    
    # 最適化の実行
    Xo, Rank = solve_triangulation(NSec, A)
    
    # 結果を保存
    write_output_data(OUT_FILE_RANK, Rank)
    write_output_matrix(OUT_FILE_X, Xo)
    print(f"Results saved to {OUT_FILE_RANK}")
    print(f"Results saved to {OUT_FILE_X}")




    