File size: 5,849 Bytes
a005c19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from typing import Dict, Tuple
import logging
import gspread
from sheet_manager.sheet_crud.sheet_crud import SheetManager

class SheetChecker:
    def __init__(self, sheet_manager: SheetManager):
        """SheetChecker 초기화"""
        self.sheet_manager = sheet_manager
        self.bench_sheet_manager = None
        self.logger = logging.getLogger(__name__)
        self._init_bench_sheet()

    def _init_bench_sheet(self):
        """model 시트용 시트 매니저 초기화"""
        self.bench_sheet_manager = type(self.sheet_manager)(
            spreadsheet_url=self.sheet_manager.spreadsheet_url,
            worksheet_name="model",
            column_name="Model name"
        )

    def add_benchmark_column(self, column_name: str):
        """새로운 벤치마크 컬럼 추가"""
        try:
            headers = self.bench_sheet_manager.get_available_columns()
            
            if column_name in headers:
                return
            
            new_col_index = len(headers) + 1
            cell = gspread.utils.rowcol_to_a1(1, new_col_index)
            self.bench_sheet_manager.sheet.update(cell, [[column_name]])
            

           # 관련 컬럼 추가 (벤치마크이름*100)
            next_col_index = new_col_index + 1
            next_cell = gspread.utils.rowcol_to_a1(1, next_col_index)
            self.bench_sheet_manager.sheet.update(next_cell, [[f"{column_name}*100"]])
            
            self.logger.info(f"새로운 벤치마크 컬럼들 추가됨: {column_name}, {column_name}*100")
            # 컬럼 추가 후 시트 매니저 재연결
            self.bench_sheet_manager._connect_to_sheet(validate_column=False)
            
        except Exception as e:
            self.logger.error(f"벤치마크 컬럼 {column_name} 추가 중 오류 발생: {str(e)}")
            raise

    def check_model_and_benchmark(self, model_name: str, benchmark_name: str) -> Tuple[bool, bool]:
        """
        모델 존재 여부와 벤치마크 상태를 확인하고, 필요한 경우 모델 정보를 추가
        
        Args:
            model_name: 확인할 모델 이름
            benchmark_name: 확인할 벤치마크 이름
            
        Returns:
            Tuple[bool, bool]: (모델이 새로 추가되었는지 여부, 벤치마크가 이미 존재하는지 여부)
        """
        try:
            # 모델 존재 여부 확인
            model_exists = self._check_model_exists(model_name)
            model_added = False

            # 모델이 없으면 추가
            if not model_exists:
                self._add_new_model(model_name)
                model_added = True
                self.logger.info(f"새로운 모델 추가됨: {model_name}")

            # 벤치마크 컬럼이 없으면 추가
            available_columns = self.bench_sheet_manager.get_available_columns()
            if benchmark_name not in available_columns:
                self.add_benchmark_column(benchmark_name)
                self.logger.info(f"새로운 벤치마크 컬럼 추가됨: {benchmark_name}")

            # 벤치마크 상태 확인
            benchmark_exists = self._check_benchmark_exists(model_name, benchmark_name)
            
            return model_added, benchmark_exists

        except Exception as e:
            self.logger.error(f"모델/벤치마크 확인 중 오류 발생: {str(e)}")
            raise

    def _check_model_exists(self, model_name: str) -> bool:
        """모델 존재 여부 확인"""
        try:
            self.bench_sheet_manager.change_column("Model name")
            values = self.bench_sheet_manager.get_all_values()
            return model_name in values
        except Exception as e:
            self.logger.error(f"모델 존재 여부 확인 중 오류 발생: {str(e)}")
            raise

    def _add_new_model(self, model_name: str):
        """새로운 모델 정보 추가"""
        try:
            model_info = {
                "Model name": model_name,
                "Model link": f"https://huggingface.co/PIA-SPACE-LAB/{model_name}",
                "Model": f'<a target="_blank" href="https://huggingface.co/PIA-SPACE-LAB/{model_name}" style="color: var(--link-text-color); text-decoration: underline;text-decoration-style: dotted;">{model_name}</a>'
            }
            
            for column_name, value in model_info.items():
                self.bench_sheet_manager.change_column(column_name)
                self.bench_sheet_manager.push(value)
                
        except Exception as e:
            self.logger.error(f"모델 정보 추가 중 오류 발생: {str(e)}")
            raise

    def _check_benchmark_exists(self, model_name: str, benchmark_name: str) -> bool:
        """벤치마크 값 존재 여부 확인"""
        try:
            # 해당 모델의 벤치마크 값 확인
            self.bench_sheet_manager.change_column("Model name")
            all_values = self.bench_sheet_manager.get_all_values()
            row_index = all_values.index(model_name) + 2

            self.bench_sheet_manager.change_column(benchmark_name)
            value = self.bench_sheet_manager.sheet.cell(row_index, self.bench_sheet_manager.col_index).value
            
            return bool(value and value.strip())
            
        except Exception as e:
            self.logger.error(f"벤치마크 존재 여부 확인 중 오류 발생: {str(e)}")
            raise

# 사용 예시
if __name__ == "__main__":
    sheet_manager = SheetManager()
    checker = SheetChecker(sheet_manager)
    
    model_added, benchmark_exists = checker.check_model_and_benchmark(
        model_name="test-model",
        benchmark_name="COCO"
    )
    
    print(f"Model added: {model_added}")
    print(f"Benchmark exists: {benchmark_exists}")