File size: 7,053 Bytes
d772529
 
 
 
 
2de76f0
da95145
 
 
d772529
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
da95145
 
 
 
 
 
d772529
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b373b61
 
 
 
 
 
2de76f0
b373b61
 
 
 
d772529
 
 
 
 
 
 
 
0413a8c
e41f931
 
 
 
 
 
 
 
 
 
d772529
 
 
 
e41f931
d772529
e41f931
d772529
e41f931
d772529
e41f931
 
d772529
 
0413a8c
 
d772529
e41f931
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d772529
 
 
e41f931
 
 
6a74ee1
d772529
 
 
 
 
 
 
 
 
 
e41f931
 
369782e
d772529
e41f931
0413a8c
da95145
 
 
 
 
 
 
0413a8c
 
d772529
e41f931
 
d772529
e41f931
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d772529
 
 
 
 
0413a8c
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import streamlit as st
import wandb
import pandas as pd
import os
import time
import datetime
from utils import fetch_competition_summary, fetch_models_evaluation

st.set_page_config(layout="wide")

### WANDB

# Access the API key from the environment variable
wandb_api_key = os.getenv('WANDB_API_KEY')

# Log in to wandb using the API key
if wandb_api_key:
    wandb.login(key=wandb_api_key)
else:
    st.error("WANDB_API_KEY not found in environment variables.")

# Initialize W&B API
api = wandb.Api()

### STREAMLIT APP

# Define available projects (bookmarks)
projects = {
    "Melanoma TestNet": {
        "entity": "safe-scan-ai",
        "project": "melanoma-testnet",
        "description": "This is a testnet competition for melanoma detection."
    },
    
    # Add more projects as needed
}

# Initialize leader info
@st.cache_data
def update_leader_info(leader_info, competition, best_model):
    if leader_info.get(competition) is None:
        leader_info[competition] = {
            "Username": best_model["Username"],
            "Model Name": best_model["Model Name"],
            "Hotkey": best_model["Hotkey"],
            "Date": time.strftime("%Y-%m-%d"),
            "UID": "xd",
            "Days on Top": 1
        }
    else:
        if leader_info[competition]["UID"] == "xd": #best_model["ID"]:
            # # update the days on top to the difference between the current date and the date of the last update
            # current_date = time.strftime("%Y-%m-%d")
            # last_update_date = leader_info[competition]["Date"]
            # # Convert the dates from string format to datetime objects
            # current_date_obj = datetime.strptime(current_date, "%Y-%m-%d")
            # last_update_date_obj = datetime.strptime(last_update_date, "%Y-%m-%d")

            # # Calculate the difference in days
            # days_on_top = (current_date_obj - last_update_date_obj).days
            # leader_info[competition]["Days on Top"] = days_on_top
            leader_info[competition]["Days on Top"] += 1
        else:
            leader_info[competition]["Username"] = best_model["Username"]
            leader_info[competition]["Model Name"] = best_model["Model Name"]
            leader_info[competition]["Hotkey"] = best_model["Hotkey"]
            leader_info[competition]["Date"] = time.strftime("%Y-%m-%d")
            leader_info[competition]["UID"] = best_model["ID"]
            leader_info[competition]["Days on Top"] = 1
    return leader_info[competition]

@st.cache_data()
def load_competition_data(last_update_time=None):
    competition_summaries = {}
    model_evaluations = {}
    for competition in projects:
        competition_summaries[competition] = fetch_competition_summary(api, projects, competition)
        model_evaluations[competition] = fetch_models_evaluation(api, projects, competition)
    
    last_update_time = time.time()
    return competition_summaries, model_evaluations, last_update_time

# Streamlit app main function
def main():
    st.title("LaUltimate Dashboard")
    st.title("JEDZIESZMALINA")
    st.subheader("Welcome to the Competition Dashboard!")
    st.write("Explore the various AI competitions and their respective rankings. Select a competition to view more details and rankings.")

    update_interval = 20 * 60  # 20 minutes in seconds

    if 'last_update_time' not in st.session_state:
        st.session_state.last_update_time = None
    if "leader_info" not in st.session_state:
        st.session_state.leader_info = {}
    if 'selected_competition' not in st.session_state:
        st.session_state.selected_competition = None

    if st.session_state.last_update_time is None or (time.time() - st.session_state.last_update_time > update_interval):
        competition_summaries, model_evaluations, st.session_state.last_update_time = load_competition_data(st.session_state.last_update_time)

        for competition in projects:
            if not model_evaluations[competition].empty:
                best_model = model_evaluations[competition].iloc[0]
                st.session_state.leader_info[competition] = update_leader_info(st.session_state.leader_info, competition, best_model)
            else:
                st.session_state.leader_info[competition] = {
                    "Username": "N/A", "Model Name": "N/A", "Hotkey": "N/A",
                    "Date": "N/A", "UID": "N/A", "Days on Top": "N/A"
                }
    else:
        competition_summaries, model_evaluations, _ = load_competition_data(st.session_state.last_update_time)

    st.write(f"Last updated: {time.ctime(st.session_state.last_update_time)}")

    st.markdown("### Competitions")

    st.write("### Select Competition")

    # Create a header for the table
    cols = st.columns([1, 3, 2, 2, 2, 2, 1, 2])
    cols[0].write("Index")
    cols[1].write("Competition Name")
    cols[2].write("Leader")
    cols[3].write("Model")
    cols[4].write("Date")
    cols[5].write("UID")
    cols[6].write("Hotkey")
    cols[7].write("Days on Top")

    for index, (competition, details) in enumerate(projects.items(), start=1):
        leader_info = st.session_state.get("leader_info", {}).get(competition, {})

        cols = st.columns([1, 3, 2, 2, 2, 2, 1, 2])
        cols[0].write(index)
        if cols[1].button(competition):
            st.session_state.selected_competition = competition
        cols[2].write(leader_info.get("Username", "N/A"))
        cols[3].write(leader_info.get("Model Name", "N/A"))
        cols[4].write(leader_info.get("Date", "N/A"))
        cols[5].write(leader_info.get("UID", "N/A"))
        cols[6].write(leader_info.get("Hotkey", "N/A"))
        cols[7].write(leader_info.get("Days on Top", "N/A"))

    if st.session_state.selected_competition:
        competition_name = st.session_state.selected_competition
        st.write(f"Selected competition: {competition_name}")
        competition_details = projects.get(competition_name, {})
        description = competition_details.get("description", "No description available.")
        
        st.header(f"Competition: {competition_name}")
        st.write(description)

        st.subheader("Competition Summary")
        competition_summary_df = competition_summaries.get(competition_name, pd.DataFrame())
        if not competition_summary_df.empty:
            st.dataframe(competition_summary_df)
        else:
            st.warning("No competition summary data available.")

        st.subheader("Models Evaluation")
        models_evaluation_df = model_evaluations.get(competition_name, pd.DataFrame())
        if not models_evaluation_df.empty:
            st.dataframe(models_evaluation_df)
        else:
            st.warning("No models evaluation data available.")
    else:
        st.write("Please select a competition to view details.")

# Run the app
if __name__ == "__main__":
    main()