Download app.py from testrro/AVOLD3: direct link, hf CLI and curl.
- Browser
- Download file 13.6 kB
-
https://huggingface.co/spaces/testrro/AVOLD3/resolve/main/app.py
- Command line
-
hf download hf://spaces/testrro/AVOLD3/app.py
-
curl -L -o app.py https://huggingface.co/spaces/testrro/AVOLD3/resolve/main/app.py
13.6 kB
| import gradio as gr | |
| import random | |
| from statistics import mean | |
| from datetime import datetime | |
| import time | |
| # ---------- কনফিগারেশন ---------- | |
| MAX_ROUNDS = 50 | |
| DEFAULT_ROUNDS = 20 | |
| # পিঙ্ক জোন টাইম উইন্ডো (মিনিট) | |
| PINK_WINDOWS = [ | |
| {"start": 55, "end": 57, "name": "প্রাইম পিঙ্ক", "multiplier": 1.9}, | |
| {"start": 59, "end": 1, "name": "প্রাইম পিঙ্ক", "multiplier": 1.9}, | |
| {"start": 18, "end": 20, "name": "পিঙ্ক জোন", "multiplier": 1.4}, | |
| {"start": 27, "end": 29, "name": "পিঙ্ক জোন", "multiplier": 1.4}, | |
| {"start": 38, "end": 40, "name": "পিঙ্ক জোন", "multiplier": 1.4}, | |
| {"start": 43, "end": 45, "name": "পিঙ্ক জোন", "multiplier": 1.4}, | |
| {"start": 48, "end": 50, "name": "পিঙ্ক জোন", "multiplier": 1.4}, | |
| ] | |
| # CSS স্টাইল | |
| CUSTOM_CSS = """ | |
| footer {visibility: hidden} | |
| .active-window { background: linear-gradient(135deg, #ff1493, #ff69b4) !important; color: white !important; } | |
| .approaching-window { background: linear-gradient(135deg, #ffa726, #ff9800) !important; color: white !important; } | |
| .waiting-window { background: linear-gradient(135deg, #1a1a2e, #16213e) !important; color: white !important; } | |
| .pink-text { color: #ff1493 !important; font-weight: bold !important; } | |
| .confidence-bar { height: 8px; background: #333; border-radius: 4px; overflow: hidden; margin: 5px 0; } | |
| .confidence-fill { height: 100%; background: linear-gradient(90deg, #00d4ff, #ff1493); transition: width 0.3s; } | |
| .risk-badge { padding: 2px 8px; border-radius: 12px; font-size: 12px; font-weight: 600; } | |
| .risk-high { background: #ff4757; color: white; padding: 2px 8px; border-radius: 12px; } | |
| .risk-medium { background: #ffa726; color: black; padding: 2px 8px; border-radius: 12px; } | |
| .risk-low { background: #66bb6a; color: white; padding: 2px 8px; border-radius: 12px; } | |
| .time-box { text-align: center; padding: 15px; border-radius: 10px; margin-bottom: 20px; transition: all 0.3s; font-weight: 500; } | |
| .gradio-container { background: #0a0a0f !important; } | |
| h1 { text-align: center; margin-bottom: 10px; } | |
| """ | |
| # ---------- হেল্পার ফাংশন ---------- | |
| def get_current_time_window(): | |
| """বর্তমান মিনিট অনুযায়ী পিঙ্ক জোন চেক করে""" | |
| now = datetime.now() | |
| minutes = now.minute | |
| for window in PINK_WINDOWS: | |
| if window["start"] <= window["end"]: | |
| if minutes >= window["start"] and minutes <= window["end"]: | |
| return window | |
| else: | |
| # ক্রস-আওয়ার বাউন্ডারি (যেমন 59-1) | |
| if minutes >= window["start"] or minutes <= window["end"]: | |
| return window | |
| return None | |
| def get_next_time_window(): | |
| """পরবর্তী পিঙ্ক জোন কত মিনিট পরে তা বের করে""" | |
| now = datetime.now() | |
| current_minutes = now.minute | |
| nearest = None | |
| min_distance = 60 | |
| for window in PINK_WINDOWS: | |
| if window["start"] <= window["end"]: | |
| if current_minutes <= window["start"]: | |
| distance = window["start"] - current_minutes | |
| else: | |
| distance = (60 - current_minutes) + window["start"] | |
| else: | |
| if current_minutes >= window["start"]: | |
| distance = (60 - current_minutes) + window["end"] | |
| elif current_minutes <= window["end"]: | |
| distance = 0 | |
| else: | |
| distance = window["start"] - current_minutes | |
| if 0 < distance < min_distance: | |
| min_distance = distance | |
| nearest = {"window": window, "minutes": distance} | |
| return nearest | |
| def compute_outputs(rounds): | |
| """এক্সপেক্টেড মাল্টিপ্লায়ার, অ্যানালাইসিস এবং ডিসিশন ক্যালকুলেট করে""" | |
| if not rounds: | |
| return "0.0x", "কোন ডাটা নেই", "N/A", 0, "medium", False | |
| # সর্বশেষ ১০টি রাউন্ড ব্যবহার করুন (অথবা কম) | |
| recent = rounds[-10:] if len(rounds) >= 10 else rounds | |
| avg = mean(recent) | |
| # ছোট র্যান্ডম ফ্লাকচুয়েশন যোগ করুন | |
| expected = round(avg * random.uniform(0.92, 1.08), 2) | |
| # ট্রেন্ড অ্যানালাইসিস | |
| if len(recent) >= 2: | |
| trend_val = recent[-1] - recent[-2] | |
| if trend_val > 0.15: | |
| trend = "উর্ধ্বমুখী 📈" | |
| elif trend_val < -0.15: | |
| trend = "নিম্নমুখী 📉" | |
| else: | |
| trend = "স্থিতিশীল ➡️" | |
| else: | |
| trend = "পর্যাপ্ত ডাটা নেই" | |
| # পিঙ্ক প্রোবাবিলিটি | |
| pink_count = sum(1 for r in recent if r >= 3.0) | |
| pink_prob = min(0.9, pink_count / len(recent) + 0.1) | |
| is_pink_expected = pink_prob > 0.4 or expected > 2.8 | |
| # টাইম উইন্ডো চেক | |
| current_window = get_current_time_window() | |
| if current_window: | |
| expected *= current_window["multiplier"] | |
| expected = round(min(15.0, expected), 2) | |
| pink_boost = f"✨ {current_window['name']} একটিভ!" | |
| else: | |
| pink_boost = "" | |
| # কনফিডেন্স লেভেল | |
| confidence = min(0.9, 0.5 + (len(rounds) / 100) + (pink_prob * 0.2)) | |
| # রিস্ক লেভেল | |
| if expected > 5.0: | |
| risk = "উচ্চ ⚠️" | |
| elif expected > 2.5: | |
| risk = "মাঝারি ⚖️" | |
| else: | |
| risk = "নিম্ন ✅" | |
| # ডিসিশন | |
| if is_pink_expected: | |
| decision = "পিঙ্ক আশান্বিত 🌸" | |
| elif expected > 3.0: | |
| decision = "বড় মাল্টিপ্লায়ার 🚀" | |
| elif expected > 1.8: | |
| decision = "মাঝারি 💪" | |
| else: | |
| decision = "ছোট 🎯" | |
| # অ্যানালাইসিস টেক্সট | |
| analysis_parts = [trend] | |
| if pink_boost: | |
| analysis_parts.append(pink_boost) | |
| if is_pink_expected: | |
| analysis_parts.append("🌸 পিঙ্ক সম্ভাবনা") | |
| analysis = " | ".join(analysis_parts) | |
| return f"{expected}x", analysis, decision, confidence, risk, is_pink_expected | |
| def update_ui(rounds): | |
| """UI আপডেট করার জন্য ডাটা প্রস্তুত করে""" | |
| table = [[i+1, f"{val}x"] for i, val in enumerate(rounds)] | |
| exp, ana, dec, conf, risk, pink = compute_outputs(rounds) | |
| return table, exp, ana, dec, conf, risk, pink | |
| def add_round(state, new_val): | |
| """নতুন মাল্টিপ্লায়ার যোগ করে""" | |
| if new_val <= 0: | |
| return state + update_ui(state)[:6] | |
| rounds = state.copy() | |
| rounds.append(new_val) | |
| if len(rounds) > MAX_ROUNDS: | |
| rounds = rounds[-MAX_ROUNDS:] | |
| table, exp, ana, dec, conf, risk, pink = update_ui(rounds) | |
| return rounds, table, exp, ana, dec, conf, risk, pink | |
| def reset_rounds(): | |
| """ডাটা রিসেট করে""" | |
| initial = [round(random.uniform(1.0, 3.5), 2) for _ in range(DEFAULT_ROUNDS)] | |
| table, exp, ana, dec, conf, risk, pink = update_ui(initial) | |
| return initial, table, exp, ana, dec, conf, risk, pink | |
| def get_time_status(): | |
| """সময়-ভিত্তিক স্ট্যাটাস আপডেট করে""" | |
| now = datetime.now() | |
| time_str = now.strftime("%H:%M:%S") | |
| current = get_current_time_window() | |
| next_window = get_next_time_window() | |
| if current: | |
| status = f"🌸 {current['name']} একটিভ! 🌸" | |
| detail = f"বুস্ট: +{int((current['multiplier']-1)*100)}%" | |
| css_class = "active-window" | |
| elif next_window and next_window["minutes"] <= 2: | |
| status = f"⚠️ {next_window['window']['name']} আসছে {next_window['minutes']} মিনিটে" | |
| detail = "প্রস্তুত হোন!" | |
| css_class = "approaching-window" | |
| else: | |
| status = "পিঙ্ক জোনের অপেক্ষায়..." | |
| detail = next_window and f"পরবর্তী: {next_window['window']['name']} {next_window['minutes']} মিনিটে" or "কোন উইন্ডো নেই" | |
| css_class = "waiting-window" | |
| return f""" | |
| <div class="time-box {css_class}"> | |
| <div style="font-size: 24px; font-weight: 700;">{time_str}</div> | |
| <div style="font-size: 16px; font-weight: 600; margin: 5px 0;">{status}</div> | |
| <div style="font-size: 12px; opacity: 0.9;">{detail}</div> | |
| </div> | |
| """ | |
| def update_time_display(): | |
| """টাইম ডিসপ্লে আপডেট করে""" | |
| return get_time_status() | |
| def update_confidence_display(conf, is_pink): | |
| """কনফিডেন্স বার আপডেট করে""" | |
| color_class = "pink-text" if is_pink else "" | |
| pink_text = "🌸 পিঙ্ক মোড" if is_pink else "" | |
| return f""" | |
| <div style="margin: 10px 0;"> | |
| <div style="display: flex; justify-content: space-between; margin-bottom: 4px;"> | |
| <span class="{color_class}">এমএল কনফিডেন্স: {int(conf*100)}%</span> | |
| <span class="{color_class}">{pink_text}</span> | |
| </div> | |
| <div class="confidence-bar"> | |
| <div class="confidence-fill" style="width: {int(conf*100)}%;"></div> | |
| </div> | |
| </div> | |
| """ | |
| # ---------- গ্র্যাডিও ইন্টারফেস ---------- | |
| with gr.Blocks() as demo: | |
| # হেডার | |
| gr.HTML(""" | |
| <div style="text-align: center; margin-bottom: 20px;"> | |
| <h1 style="color: #00d4ff; font-size: 48px; margin: 0; text-shadow: 0 0 10px #00d4ff;">✈️ AVOLD</h1> | |
| <p style="color: #888; font-size: 14px;">এভিয়েটর রাউন্ড অ্যানালাইজার</p> | |
| </div> | |
| """) | |
| # স্টেট | |
| rounds_state = gr.State([round(random.uniform(1.0, 3.5), 2) for _ in range(DEFAULT_ROUNDS)]) | |
| pink_state = gr.State(False) | |
| conf_state = gr.State(0.5) | |
| # টাইম সেকশন | |
| time_html = gr.HTML(value=get_time_status()) | |
| # ইনপুট রো | |
| with gr.Row(): | |
| new_multiplier = gr.Number( | |
| label="নতুন মাল্টিপ্লায়ার", | |
| value=1.0, | |
| step=0.1, | |
| minimum=1.0, | |
| maximum=100.0 | |
| ) | |
| add_btn = gr.Button("➕ যোগ করুন", variant="primary") | |
| # রিসেট বাটন | |
| reset_btn = gr.Button("🔄 রিসেট ডাটা", variant="secondary") | |
| # তিনটি আউটপুট এক লাইনে | |
| with gr.Row(): | |
| expected_out = gr.Textbox(label="📊 এক্সপেক্টেড", interactive=False) | |
| analysis_out = gr.Textbox(label="📈 অ্যানালাইসিস", interactive=False) | |
| decision_out = gr.Textbox(label="🎯 ডিসিশন", interactive=False) | |
| # কনফিডেন্স এবং রিস্ক | |
| with gr.Row(): | |
| with gr.Column(scale=3): | |
| confidence_html = gr.HTML(value=update_confidence_display(0.5, False)) | |
| with gr.Column(scale=1): | |
| risk_out = gr.Textbox(label="রিস্ক লেভেল", interactive=False) | |
| # টেবিল | |
| rounds_table = gr.Dataframe( | |
| label="📜 শেষ ৫০ রাউন্ড", | |
| headers=["রাউন্ড", "মাল্টিপ্লায়ার"], | |
| row_count=10, | |
| interactive=False | |
| ) | |
| # ---------- ইভেন্ট হ্যান্ডলার ---------- | |
| # অ্যাড বাটন | |
| add_btn.click( | |
| add_round, | |
| inputs=[rounds_state, new_multiplier], | |
| outputs=[rounds_state, rounds_table, expected_out, analysis_out, decision_out, conf_state, risk_out, pink_state] | |
| ).then( | |
| update_confidence_display, | |
| inputs=[conf_state, pink_state], | |
| outputs=[confidence_html] | |
| ).then( | |
| update_time_display, | |
| outputs=[time_html] | |
| ) | |
| # রিসেট বাটন | |
| reset_btn.click( | |
| reset_rounds, | |
| outputs=[rounds_state, rounds_table, expected_out, analysis_out, decision_out, conf_state, risk_out, pink_state] | |
| ).then( | |
| update_confidence_display, | |
| inputs=[conf_state, pink_state], | |
| outputs=[confidence_html] | |
| ).then( | |
| update_time_display, | |
| outputs=[time_html] | |
| ) | |
| # ইনিশিয়াল লোড | |
| demo.load( | |
| fn=lambda s: update_ui(s) + (0.5, False), | |
| inputs=[rounds_state], | |
| outputs=[rounds_table, expected_out, analysis_out, decision_out, conf_state, risk_out, pink_state] | |
| ).then( | |
| update_confidence_display, | |
| inputs=[conf_state, pink_state], | |
| outputs=[confidence_html] | |
| ).then( | |
| update_time_display, | |
| outputs=[time_html] | |
| ) | |
| # ---------- অ্যাপ রান ---------- | |
| if __name__ == "__main__": | |
| demo.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| theme='dark', | |
| css=CUSTOM_CSS | |
| ) |