Esmaeilkiani commited on
Commit
697d810
·
verified ·
1 Parent(s): 2ae352f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +191 -338
app.py CHANGED
@@ -1,345 +1,198 @@
1
- import subprocess
2
- import gradio as gr
3
  import pandas as pd
4
- from apscheduler.schedulers.background import BackgroundScheduler
5
- from huggingface_hub import snapshot_download
6
-
7
- from src.about import (
8
- CITATION_BUTTON_LABEL,
9
- CITATION_BUTTON_TEXT,
10
- EVALUATION_QUEUE_TEXT,
11
- INTRODUCTION_TEXT,
12
- LLM_BENCHMARKS_TEXT,
13
- TITLE,
14
- )
15
- from src.display.css_html_js import custom_css
16
- from src.display.utils import (
17
- BENCHMARK_COLS,
18
- COLS,
19
- EVAL_COLS,
20
- EVAL_TYPES,
21
- NUMERIC_INTERVALS,
22
- TYPES,
23
- AutoEvalColumn,
24
- ModelType,
25
- fields,
26
- WeightType,
27
- Precision
28
  )
29
- from src.envs import API, EVAL_REQUESTS_PATH, EVAL_RESULTS_PATH, QUEUE_REPO, REPO_ID, RESULTS_REPO, TOKEN
30
- from src.populate import get_evaluation_queue_df, get_leaderboard_df
31
- from src.submission.submit import add_new_eval
32
-
33
 
34
- def restart_space():
35
- API.restart_space(repo_id=REPO_ID)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
- try:
38
- print(EVAL_REQUESTS_PATH)
39
- snapshot_download(
40
- repo_id=QUEUE_REPO, local_dir=EVAL_REQUESTS_PATH, repo_type="dataset", tqdm_class=None, etag_timeout=30, token=TOKEN
41
- )
42
- except Exception:
43
- restart_space()
44
- try:
45
- print(EVAL_RESULTS_PATH)
46
- snapshot_download(
47
- repo_id=RESULTS_REPO, local_dir=EVAL_RESULTS_PATH, repo_type="dataset", tqdm_class=None, etag_timeout=30, token=TOKEN
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  )
49
- except Exception:
50
- restart_space()
51
-
52
-
53
- raw_data, original_df = get_leaderboard_df(EVAL_RESULTS_PATH, EVAL_REQUESTS_PATH, COLS, BENCHMARK_COLS)
54
- leaderboard_df = original_df.copy()
55
-
56
- (
57
- finished_eval_queue_df,
58
- running_eval_queue_df,
59
- pending_eval_queue_df,
60
- ) = get_evaluation_queue_df(EVAL_REQUESTS_PATH, EVAL_COLS)
61
-
62
-
63
- # Searching and filtering
64
- def update_table(
65
- hidden_df: pd.DataFrame,
66
- columns: list,
67
- type_query: list,
68
- precision_query: str,
69
- size_query: list,
70
- show_deleted: bool,
71
- query: str,
72
- ):
73
- filtered_df = filter_models(hidden_df, type_query, size_query, precision_query, show_deleted)
74
- filtered_df = filter_queries(query, filtered_df)
75
- df = select_columns(filtered_df, columns)
76
- return df
77
-
78
-
79
- def search_table(df: pd.DataFrame, query: str) -> pd.DataFrame:
80
- return df[(df[AutoEvalColumn.model.name].str.contains(query, case=False))]
81
-
82
-
83
- def select_columns(df: pd.DataFrame, columns: list) -> pd.DataFrame:
84
- always_here_cols = [
85
- AutoEvalColumn.model_type_symbol.name,
86
- AutoEvalColumn.model.name,
87
- ]
88
- # We use COLS to maintain sorting
89
- filtered_df = df[
90
- always_here_cols + [c for c in COLS if c in df.columns and c in columns]
91
- ]
92
- return filtered_df
93
-
94
-
95
- def filter_queries(query: str, filtered_df: pd.DataFrame) -> pd.DataFrame:
96
- final_df = []
97
- if query != "":
98
- queries = [q.strip() for q in query.split(";")]
99
- for _q in queries:
100
- _q = _q.strip()
101
- if _q != "":
102
- temp_filtered_df = search_table(filtered_df, _q)
103
- if len(temp_filtered_df) > 0:
104
- final_df.append(temp_filtered_df)
105
- if len(final_df) > 0:
106
- filtered_df = pd.concat(final_df)
107
- filtered_df = filtered_df.drop_duplicates(
108
- subset=[AutoEvalColumn.model.name, AutoEvalColumn.precision.name, AutoEvalColumn.revision.name]
109
- )
110
-
111
- return filtered_df
112
-
113
-
114
- def filter_models(
115
- df: pd.DataFrame, type_query: list, size_query: list, precision_query: list, show_deleted: bool
116
- ) -> pd.DataFrame:
117
- # Show all models
118
- if show_deleted:
119
- filtered_df = df
120
- else: # Show only still on the hub models
121
- filtered_df = df[df[AutoEvalColumn.still_on_hub.name] == True]
122
-
123
- type_emoji = [t[0] for t in type_query]
124
- filtered_df = filtered_df.loc[df[AutoEvalColumn.model_type_symbol.name].isin(type_emoji)]
125
- filtered_df = filtered_df.loc[df[AutoEvalColumn.precision.name].isin(precision_query + ["None"])]
126
-
127
- numeric_interval = pd.IntervalIndex(sorted([NUMERIC_INTERVALS[s] for s in size_query]))
128
- params_column = pd.to_numeric(df[AutoEvalColumn.params.name], errors="coerce")
129
- mask = params_column.apply(lambda x: any(numeric_interval.contains(x)))
130
- filtered_df = filtered_df.loc[mask]
131
-
132
- return filtered_df
133
-
134
-
135
- demo = gr.Blocks(css=custom_css)
136
- with demo:
137
- gr.HTML(TITLE)
138
- gr.Markdown(INTRODUCTION_TEXT, elem_classes="markdown-text")
139
-
140
- with gr.Tabs(elem_classes="tab-buttons") as tabs:
141
- with gr.TabItem("🏅 LLM Benchmark", elem_id="llm-benchmark-tab-table", id=0):
142
- with gr.Row():
143
- with gr.Column():
144
- with gr.Row():
145
- search_bar = gr.Textbox(
146
- placeholder=" 🔍 Search for your model (separate multiple queries with `;`) and press ENTER...",
147
- show_label=False,
148
- elem_id="search-bar",
149
- )
150
- with gr.Row():
151
- shown_columns = gr.CheckboxGroup(
152
- choices=[
153
- c.name
154
- for c in fields(AutoEvalColumn)
155
- if not c.hidden and not c.never_hidden
156
- ],
157
- value=[
158
- c.name
159
- for c in fields(AutoEvalColumn)
160
- if c.displayed_by_default and not c.hidden and not c.never_hidden
161
- ],
162
- label="Select columns to show",
163
- elem_id="column-select",
164
- interactive=True,
165
- )
166
- with gr.Row():
167
- deleted_models_visibility = gr.Checkbox(
168
- value=False, label="Show gated/private/deleted models", interactive=True
169
- )
170
- with gr.Column(min_width=320):
171
- #with gr.Box(elem_id="box-filter"):
172
- filter_columns_type = gr.CheckboxGroup(
173
- label="Model types",
174
- choices=[t.to_str() for t in ModelType],
175
- value=[t.to_str() for t in ModelType],
176
- interactive=True,
177
- elem_id="filter-columns-type",
178
- )
179
- filter_columns_precision = gr.CheckboxGroup(
180
- label="Precision",
181
- choices=[i.value.name for i in Precision],
182
- value=[i.value.name for i in Precision],
183
- interactive=True,
184
- elem_id="filter-columns-precision",
185
- )
186
- filter_columns_size = gr.CheckboxGroup(
187
- label="Model sizes (in billions of parameters)",
188
- choices=list(NUMERIC_INTERVALS.keys()),
189
- value=list(NUMERIC_INTERVALS.keys()),
190
- interactive=True,
191
- elem_id="filter-columns-size",
192
- )
193
-
194
- leaderboard_table = gr.components.Dataframe(
195
- value=leaderboard_df[
196
- [c.name for c in fields(AutoEvalColumn) if c.never_hidden]
197
- + shown_columns.value
198
- ],
199
- headers=[c.name for c in fields(AutoEvalColumn) if c.never_hidden] + shown_columns.value,
200
- datatype=TYPES,
201
- elem_id="leaderboard-table",
202
- interactive=False,
203
- visible=True,
204
- )
205
-
206
- # Dummy leaderboard for handling the case when the user uses backspace key
207
- hidden_leaderboard_table_for_search = gr.components.Dataframe(
208
- value=original_df[COLS],
209
- headers=COLS,
210
- datatype=TYPES,
211
- visible=False,
212
- )
213
- search_bar.submit(
214
- update_table,
215
- [
216
- hidden_leaderboard_table_for_search,
217
- shown_columns,
218
- filter_columns_type,
219
- filter_columns_precision,
220
- filter_columns_size,
221
- deleted_models_visibility,
222
- search_bar,
223
- ],
224
- leaderboard_table,
225
- )
226
- for selector in [shown_columns, filter_columns_type, filter_columns_precision, filter_columns_size, deleted_models_visibility]:
227
- selector.change(
228
- update_table,
229
- [
230
- hidden_leaderboard_table_for_search,
231
- shown_columns,
232
- filter_columns_type,
233
- filter_columns_precision,
234
- filter_columns_size,
235
- deleted_models_visibility,
236
- search_bar,
237
- ],
238
- leaderboard_table,
239
- queue=True,
240
- )
241
-
242
- with gr.TabItem("📝 About", elem_id="llm-benchmark-tab-table", id=2):
243
- gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
244
-
245
- with gr.TabItem("🚀 Submit here! ", elem_id="llm-benchmark-tab-table", id=3):
246
- with gr.Column():
247
- with gr.Row():
248
- gr.Markdown(EVALUATION_QUEUE_TEXT, elem_classes="markdown-text")
249
-
250
- with gr.Column():
251
- with gr.Accordion(
252
- f"✅ Finished Evaluations ({len(finished_eval_queue_df)})",
253
- open=False,
254
- ):
255
- with gr.Row():
256
- finished_eval_table = gr.components.Dataframe(
257
- value=finished_eval_queue_df,
258
- headers=EVAL_COLS,
259
- datatype=EVAL_TYPES,
260
- row_count=5,
261
- )
262
- with gr.Accordion(
263
- f"🔄 Running Evaluation Queue ({len(running_eval_queue_df)})",
264
- open=False,
265
- ):
266
- with gr.Row():
267
- running_eval_table = gr.components.Dataframe(
268
- value=running_eval_queue_df,
269
- headers=EVAL_COLS,
270
- datatype=EVAL_TYPES,
271
- row_count=5,
272
- )
273
-
274
- with gr.Accordion(
275
- f"⏳ Pending Evaluation Queue ({len(pending_eval_queue_df)})",
276
- open=False,
277
- ):
278
- with gr.Row():
279
- pending_eval_table = gr.components.Dataframe(
280
- value=pending_eval_queue_df,
281
- headers=EVAL_COLS,
282
- datatype=EVAL_TYPES,
283
- row_count=5,
284
- )
285
- with gr.Row():
286
- gr.Markdown("# ✉️✨ Submit your model here!", elem_classes="markdown-text")
287
-
288
- with gr.Row():
289
- with gr.Column():
290
- model_name_textbox = gr.Textbox(label="Model name")
291
- revision_name_textbox = gr.Textbox(label="Revision commit", placeholder="main")
292
- model_type = gr.Dropdown(
293
- choices=[t.to_str(" : ") for t in ModelType if t != ModelType.Unknown],
294
- label="Model type",
295
- multiselect=False,
296
- value=None,
297
- interactive=True,
298
  )
299
-
300
- with gr.Column():
301
- precision = gr.Dropdown(
302
- choices=[i.value.name for i in Precision if i != Precision.Unknown],
303
- label="Precision",
304
- multiselect=False,
305
- value="float16",
306
- interactive=True,
307
- )
308
- weight_type = gr.Dropdown(
309
- choices=[i.value.name for i in WeightType],
310
- label="Weights type",
311
- multiselect=False,
312
- value="Original",
313
- interactive=True,
 
 
 
 
 
 
 
314
  )
315
- base_model_name_textbox = gr.Textbox(label="Base model (for delta or adapter weights)")
316
-
317
- submit_button = gr.Button("Submit Eval")
318
- submission_result = gr.Markdown()
319
- submit_button.click(
320
- add_new_eval,
321
- [
322
- model_name_textbox,
323
- base_model_name_textbox,
324
- revision_name_textbox,
325
- precision,
326
- weight_type,
327
- model_type,
328
- ],
329
- submission_result,
330
- )
331
-
332
- with gr.Row():
333
- with gr.Accordion("📙 Citation", open=False):
334
- citation_button = gr.Textbox(
335
- value=CITATION_BUTTON_TEXT,
336
- label=CITATION_BUTTON_LABEL,
337
- lines=20,
338
- elem_id="citation-button",
339
- show_copy_button=True,
340
- )
341
-
342
- scheduler = BackgroundScheduler()
343
- scheduler.add_job(restart_space, "interval", seconds=1800)
344
- scheduler.start()
345
- demo.queue(default_concurrency_limit=40).launch()
 
1
+ import streamlit as st
 
2
  import pandas as pd
3
+ import folium
4
+ from streamlit_folium import folium_static
5
+ import jdatetime
6
+ import plotly.express as px
7
+ import json
8
+ from pathlib import Path
9
+
10
+ # تنظیمات اولیه صفحه
11
+ st.set_page_config(
12
+ page_title="مدیریت چاهک‌های مزارع نیشکر",
13
+ page_icon="🌱",
14
+ layout="wide",
15
+ initial_sidebar_state="expanded"
 
 
 
 
 
 
 
 
 
 
 
16
  )
 
 
 
 
17
 
18
+ # CSS برای راست به چپ کردن متن‌ها
19
+ st.markdown(
20
+ """
21
+ <style>
22
+ .css-1d391kg {
23
+ direction: rtl;
24
+ }
25
+ .stButton>button {
26
+ float: right;
27
+ }
28
+ .stSelectbox>div>div {
29
+ direction: rtl;
30
+ text-align: right;
31
+ }
32
+ </style>
33
+ """,
34
+ unsafe_allow_html=True
35
+ )
36
 
37
+ # تعریف داده‌های اولیه
38
+ @st.cache_data
39
+ def load_initial_data():
40
+ data = {
41
+ 'مزرعه': ['01-28', '02-19', '02-27', '03-08', '03-30', '03-32'],
42
+ 'کانال': ['01', '02', '02', '03', '03', '03'],
43
+ 'اداره': [1, 2, 2, 1, 1, 1],
44
+ 'واریته': ['CP69', 'CP69', 'CP69', 'CP69', 'IR01-412', 'IRC00-14'],
45
+ 'مساحت': [23.83, 24.53, 24.84, 23.17, 23.35, 22.97],
46
+ 'چاهک_1_نصب': [False] * 6,
47
+ 'چاهک_1_تکنسین': [''] * 6,
48
+ 'چاهک_1_تاریخ': [''] * 6,
49
+ 'چاهک_1_lat': [0.0] * 6,
50
+ 'چاهک_1_lon': [0.0] * 6,
51
+ 'چاهک_2_نصب': [False] * 6,
52
+ 'چاهک_2_تکنسین': [''] * 6,
53
+ 'چاهک_2_تاریخ': [''] * 6,
54
+ 'چاهک_2_lat': [0.0] * 6,
55
+ 'چاهک_2_lon': [0.0] * 6,
56
+ }
57
+ return pd.DataFrame(data)
58
+
59
+ # لود داده‌ها
60
+ if 'farms_data' not in st.session_state:
61
+ st.session_state.farms_data = load_initial_data()
62
+
63
+ # تعریف تکنسین‌ها
64
+ TECHNICIANS = [
65
+ 'علی دغاغله',
66
+ 'علیرضا حمیدی',
67
+ 'مسعود بن موسی',
68
+ 'امین هنری'
69
+ ]
70
+
71
+ # عنوان اصلی
72
+ st.title("🌱 مدیریت چاهک‌های مزارع نیشکر")
73
+
74
+ # ساید‌بار برای فیلتر کردن
75
+ with st.sidebar:
76
+ st.header("فیلترها")
77
+ selected_department = st.selectbox(
78
+ "انتخاب اداره",
79
+ options=[0, 1, 2, 3, 4],
80
+ format_func=lambda x: "همه ادارات" if x == 0 else f"اداره {x}",
81
  )
82
+
83
+ search_term = st.text_input("جستجو بر اساس نام مزرعه یا کانال")
84
+
85
+ # فیلتر کردن داده‌ها
86
+ filtered_data = st.session_state.farms_data.copy()
87
+ if selected_department != 0:
88
+ filtered_data = filtered_data[filtered_data['اداره'] == selected_department]
89
+ if search_term:
90
+ mask = (filtered_data['مزرعه'].str.contains(search_term)) | (filtered_data['کانال'].str.contains(search_term))
91
+ filtered_data = filtered_data[mask]
92
+
93
+ # نمایش آمار کلی
94
+ col1, col2, col3 = st.columns(3)
95
+ with col1:
96
+ total_wells = len(filtered_data) * 2
97
+ installed_wells = filtered_data['چاهک_1_نصب'].sum() + filtered_data['چاهک_2_نصب'].sum()
98
+ st.metric("کل چاهک‌ها", total_wells)
99
+
100
+ with col2:
101
+ st.metric("چاهک‌های نصب شده", installed_wells)
102
+
103
+ with col3:
104
+ st.metric("چاهک‌های باقی‌مانده", total_wells - installed_wells)
105
+
106
+ # نمایش نقشه
107
+ st.header("🗺️ نقشه چاهک‌ها")
108
+ m = folium.Map(location=[31.3183, 48.6706], zoom_start=10)
109
+
110
+ for idx, row in filtered_data.iterrows():
111
+ if row['چاهک_1_نصب'] and row['چاهک_1_lat'] != 0:
112
+ folium.Marker(
113
+ [row['چاهک_1_lat'], row['چاهک_1_lon']],
114
+ popup=f"مزرعه: {row['مزرعه']}<br>چاهک: 1<br>تکنسین: {row['چاهک_1_تکنسین']}<br>تاریخ: {row['چاهک_1_تاریخ']}",
115
+ icon=folium.Icon(color='red')
116
+ ).add_to(m)
117
+
118
+ if row['چاهک_2_نصب'] and row['چاهک_2_lat'] != 0:
119
+ folium.Marker(
120
+ [row['چاهک_2_lat'], row['چاهک_2_lon']],
121
+ popup=f"مزرعه: {row['مزرعه']}<br>چاهک: 2<br>تکنسین: {row['چاهک_2_تکنسین']}<br>تاریخ: {row['چاهک_2_تاریخ']}",
122
+ icon=folium.Icon(color='blue')
123
+ ).add_to(m)
124
+
125
+ folium_static(m)
126
+
127
+ # لیست مزارع و ثبت چاهک
128
+ st.header("📝 لیست مزارع و ثبت چاهک")
129
+
130
+ for idx, row in filtered_data.iterrows():
131
+ with st.expander(f"مزرعه {row['مزرعه']} - کانال {row['کانال']}"):
132
+ st.write(f"واریته: {row['واریته']}")
133
+ st.write(f"مساحت: {row['مساحت']} هکتار")
134
+
135
+ col1, col2 = st.columns(2)
136
+
137
+ # چاهک 1
138
+ with col1:
139
+ st.subheader("چاهک 1")
140
+ if not row['چاهک_1_نصب']:
141
+ if st.button(f"ثبت نصب چاهک 1 - مزرعه {row['مزرعه']}", key=f"well1_{idx}"):
142
+ technician = st.selectbox(
143
+ "انتخاب تکنسین",
144
+ options=TECHNICIANS,
145
+ key=f"tech1_{idx}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  )
147
+ lat = st.number_input("عرض جغرافیایی", value=31.3183, key=f"lat1_{idx}")
148
+ lon = st.number_input("طول جغرافیایی", value=48.6706, key=f"lon1_{idx}")
149
+ if st.button("ثبت نهایی", key=f"save1_{idx}"):
150
+ st.session_state.farms_data.at[idx, 'چاهک_1_نصب'] = True
151
+ st.session_state.farms_data.at[idx, 'چاهک_1_تکنسین'] = technician
152
+ st.session_state.farms_data.at[idx, 'چاهک_1_تاریخ'] = jdatetime.datetime.now().strftime("%Y/%m/%d")
153
+ st.session_state.farms_data.at[idx, 'چاهک_1_lat'] = lat
154
+ st.session_state.farms_data.at[idx, 'چاهک_1_lon'] = lon
155
+ st.success("چاهک 1 با موفقیت ثبت شد")
156
+ st.rerun()
157
+ else:
158
+ st.info(f"نصب شده توسط {row['چاهک_1_تکنسین']} در تاریخ {row['چاهک_1_تاریخ']}")
159
+
160
+ # چاهک 2
161
+ with col2:
162
+ st.subheader("چاهک 2")
163
+ if not row['چاهک_2_نصب']:
164
+ if st.button(f"ثبت نصب چاهک 2 - مزرعه {row['مزرعه']}", key=f"well2_{idx}"):
165
+ technician = st.selectbox(
166
+ "انتخاب تکنسین",
167
+ options=TECHNICIANS,
168
+ key=f"tech2_{idx}"
169
  )
170
+ lat = st.number_input("عرض جغرافیایی", value=31.3183, key=f"lat2_{idx}")
171
+ lon = st.number_input("طول جغرافیایی", value=48.6706, key=f"lon2_{idx}")
172
+ if st.button("ثبت نهایی", key=f"save2_{idx}"):
173
+ st.session_state.farms_data.at[idx, 'چاهک_2_نصب'] = True
174
+ st.session_state.farms_data.at[idx, 'چاهک_2_تکنسین'] = technician
175
+ st.session_state.farms_data.at[idx, 'چاهک_2_تاریخ'] = jdatetime.datetime.now().strftime("%Y/%m/%d")
176
+ st.session_state.farms_data.at[idx, 'چاهک_2_lat'] = lat
177
+ st.session_state.farms_data.at[idx, 'چاهک_2_lon'] = lon
178
+ st.success("چاهک 2 با موفقیت ثبت شد")
179
+ st.rerun()
180
+ else:
181
+ st.info(f"نصب شده توسط {row['چاهک_2_تکنسین']} در تاریخ {row['چاهک_2_تاریخ']}")
182
+
183
+ # نمودار پیشرفت نصب به تفکیک اداره
184
+ st.header("📊 گزارش پیشرفت نصب")
185
+ progress_data = []
186
+ for dept in range(1, 5):
187
+ dept_data = st.session_state.farms_data[st.session_state.farms_data['اداره'] == dept]
188
+ total = len(dept_data) * 2
189
+ installed = dept_data['چاهک_1_نصب'].sum() + dept_data['چاهک_2_نصب'].sum()
190
+ progress_data.append({
191
+ 'اداره': f'اداره {dept}',
192
+ 'درصد پیشرفت': (installed / total * 100) if total > 0 else 0
193
+ })
194
+
195
+ progress_df = pd.DataFrame(progress_data)
196
+ fig = px.bar(progress_df, x='اداره', y='درصد پیشرفت',
197
+ title='درصد پیشرفت نصب چاهک‌ها به تفکیک اداره')
198
+ st.plotly_chart(fig)