File size: 5,307 Bytes
4097ba4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import pandas as pd
import os
from typing import Optional, List

class DataLoader:
    def __init__(self, results_dir: str = "./data"):
        self.results_dir = results_dir
        self.df_all: Optional[pd.DataFrame] = None
        self.reload_data()

    def reload_data(self) -> str:
        csv_path = os.path.join(self.results_dir, "results.csv")

        if not os.path.exists(csv_path):
            self._create_sample_data(csv_path)

        try:
            self.df_all = pd.read_csv(csv_path)
            # Ensure numeric columns are float
            numeric_cols = self.df_all.select_dtypes(include=['float64', 'int64']).columns
            for col in numeric_cols:
                self.df_all[col] = pd.to_numeric(self.df_all[col], errors='coerce')
            return f"✅ Loaded {len(self.df_all)} models from {csv_path}"
        except Exception as e:
            self.df_all = None
            return f"❌ Error loading data: {str(e)}"

    def _create_sample_data(self, path: str):
        os.makedirs(os.path.dirname(path), exist_ok=True)
        data = {
            "Model": [
                "NVIDIA Cosmos", "HunyuanVideo-1.5", "WAN 2.2", "CogVideoX-I2V", "YUME 1.5",
                "Matrix-game 2.0", "HY-World 1.5",
                "CameraCtrl", "MotionCtrl", "CamI2V", "RealCam-I2V", "videox-fun-Wan", "AC3D", "ASTRA"
            ],
            "Category": [
                "Text-Conditioned", "Text-Conditioned", "Text-Conditioned", "Text-Conditioned", "Text-Conditioned",
                "One-hot", "One-hot",
                "Intrinsics/Extrinsics", "Intrinsics/Extrinsics", "Intrinsics/Extrinsics",
                "Intrinsics/Extrinsics", "Intrinsics/Extrinsics", "Intrinsics/Extrinsics", "Intrinsics/Extrinsics"
            ],
            "Average": [0.6275, 0.7188, 0.5731, 0.6963, 0.6209, 0.5663, 0.7873,
                        0.5762, 0.5486, 0.5765, 0.6865, 0.7474, 0.7149, 0.5980],
            "Image Quality": [0.6778, 0.7128, 0.5545, 0.6521, 0.6232, 0.4851, 0.6675,
                              0.4473, 0.4562, 0.5284, 0.6227, 0.6410, 0.4573, 0.5335],
            "Brightness Consistency": [0.6952, 0.7027, 0.3886, 0.8988, 0.3810, 0.2963, 0.8051,
                                        0.3717, 0.3980, 0.4343, 0.4130, 0.5972, 0.7307, 0.5091],
            "Color Temperature": [0.7170, 0.7477, 0.3411, 0.8129, 0.4165, 0.2937, 0.7819,
                                  0.2511, 0.2012, 0.3568, 0.5547, 0.5473, 0.6524, 0.4338],
            "Sharpness Retention": [0.4363, 0.5545, 0.3428, 0.7951, 0.4023, 0.4149, 0.6634,
                                    0.4545, 0.4294, 0.4297, 0.6269, 0.5998, 0.5332, 0.5488],
            "Motion Smoothness": [0.9907, 0.9908, 0.9557, 0.9938, 0.9765, 0.9848, 0.9921,
                                  0.9796, 0.9735, 0.9861, 0.9860, 0.9858, 0.9919, 0.9799],
            "Trajectory Accuracy": [0.4955, 0.6844, 0.6514, 0.5950, 0.7113, 0.7008, 0.7472,
                                    0.6778, 0.6730, 0.6314, 0.5630, 0.7172, 0.5785, 0.6115],
            "Memory Symmetry": [0.3738, 0.6336, 0.4480, 0.6010, 0.5276, 0.3311, 0.8481,
                                0.4279, 0.3098, 0.3631, 0.7948, 0.9009, 0.9068, 0.4323],
            "Trajectory Alignment": [0.6419, 0.6449, 0.5703, 0.4084, 0.5988, 0.6362, 0.6776,
                                     0.6097, 0.5932, 0.6038, 0.6668, 0.6876, 0.6250, 0.5518],
            "Year": [2024] * 14
        }
        df = pd.DataFrame(data)
        df.to_csv(path, index=False)
        print(f"Created sample data at {path}")

    def get_open_source_choices(self) -> List[str]:
        if self.df_all is None:
            return ["All"]
        if "Open Source" not in self.df_all.columns:
            return ["All"]
        choices = ["All"] + sorted(self.df_all["Open Source"].dropna().unique().tolist())
        return choices

    def get_year_choices(self) -> List[str]:
        if self.df_all is None:
            return ["All"]
        if "Year" not in self.df_all.columns:
            return ["All"]
        choices = ["All"] + sorted(self.df_all["Year"].dropna().unique().tolist(), reverse=True)
        return choices

    def get_category_choices(self) -> List[str]:
        if self.df_all is None:
            return ["All"]
        if "Category" not in self.df_all.columns:
            return ["All"]
        choices = ["All"] + sorted(self.df_all["Category"].dropna().unique().tolist())
        return choices

    def filter_data(self, model_filter: str = "", open_source_filter: str = "All",

                   year_filter: str = "All", category_filter: str = "All") -> pd.DataFrame:
        if self.df_all is None:
            return pd.DataFrame()
        df = self.df_all.copy()
        if model_filter:
            df = df[df["Model"].str.contains(model_filter, case=False, na=False)]
        if open_source_filter != "All" and "Open Source" in df.columns:
            df = df[df["Open Source"] == open_source_filter]
        if year_filter != "All" and "Year" in df.columns:
            df = df[df["Year"] == int(year_filter)]
        if category_filter != "All" and "Category" in df.columns:
            df = df[df["Category"] == category_filter]
        return df