import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import sys

def create_plots(csv_file_path):
    """
    读取CSV文件，生成图表并保存到磁盘
    """
    try:
        df = pd.read_csv(csv_file_path)
    except FileNotFoundError:
        print(f"错误：找不到文件 {csv_file_path}")
        sys.exit(1)

    # 算法名称映射
    algo_names = {
        'v1': '朴素动态规划（三层循环）',
        'v2': '优化二维动态规划',
        'v3': '空间优化一维动态规划'
    }
    df['algo_name'] = df['algo'].map(algo_names)

    # 设置绘图风格
    sns.set_theme(style="whitegrid")

    # 图表1：运行时间与物品数量的关系
    plt.figure(figsize=(10, 6))
    time_plot = sns.lineplot(data=df, x='n', y='time_us', hue='algo_name', marker='o', palette='viridis')
    plt.title('平均运行时间与物品种类数量(n)的关系')
    plt.xlabel('物品种类数量(n)')
    plt.ylabel('平均运行时间（微秒）')
    time_plot.legend(title='算法')
    plt.grid(True, which='both', linestyle='--')
    plt.savefig('time_vs_n.png', dpi=300)
    plt.close()

    # 图表2：操作次数与物品数量的关系
    plt.figure(figsize=(10, 6))
    ops_plot = sns.lineplot(data=df, x='n', y='ops', hue='algo_name', marker='o', palette='plasma')
    plt.title('关键操作次数与物品种类数量(n)的关系')
    plt.xlabel('物品种类数量(n)')
    plt.ylabel('平均关键操作次数（对数尺度）')
    plt.yscale('log')
    ops_plot.legend(title='算法')
    plt.grid(True, which='both', linestyle='--')
    plt.savefig('ops_vs_n.png', dpi=300)
    plt.close()

if __name__ == '__main__':
    if len(sys.argv) > 1:
        # 使用命令行参数指定的CSV文件
        create_plots(sys.argv[1])
    else:
        # 如果没有提供参数，使用默认文件名
        create_plots('results.csv')
