Download app.py from testrro/AVOLDML: direct link, hf CLI and curl.
- Browser
- Download file 39.5 kB
-
https://huggingface.co/spaces/testrro/AVOLDML/resolve/main/app.py
- Command line
-
hf download hf://spaces/testrro/AVOLDML/app.py
-
curl -L -o app.py https://huggingface.co/spaces/testrro/AVOLDML/resolve/main/app.py
39.5 kB
| import gradio as gr | |
| import numpy as np | |
| import pandas as pd | |
| from datetime import datetime | |
| import random | |
| from collections import defaultdict | |
| import math | |
| import traceback | |
| # ==================== কনফিগারেশন ==================== | |
| CONFIG = { | |
| "HISTORY_LIMIT": 1000, | |
| "SEQUENCE_LENGTH": 12, | |
| "PATTERN_DEPTH": 6, | |
| "PINK_THRESHOLD": 3.0, | |
| "BIG_PINK_THRESHOLD": 5.0, | |
| "CONFIDENCE_THRESHOLD": 0.65, | |
| "ENSEMBLE_WEIGHTS": { | |
| "neuralNetwork": 0.35, | |
| "sequencePattern": 0.30, | |
| "markovChain": 0.20, | |
| "statisticalModel": 0.15 | |
| } | |
| } | |
| # টাইম উইন্ডো কনফিগারেশন (পিঙ্ক জোন) | |
| TIME_WINDOWS = [ | |
| {"start": 55, "end": 57, "name": "প্রাইম পিঙ্ক", "multiplier": 1.9, "probability": 0.90}, | |
| {"start": 59, "end": 1, "name": "প্রাইম পিঙ্ক", "multiplier": 1.9, "probability": 0.90}, | |
| {"start": 18, "end": 20, "name": "পিঙ্ক জোন", "multiplier": 1.4, "probability": 0.70}, | |
| {"start": 27, "end": 29, "name": "পিঙ্ক জোন", "multiplier": 1.4, "probability": 0.70}, | |
| {"start": 38, "end": 40, "name": "পিঙ্ক জোন", "multiplier": 1.4, "probability": 0.70}, | |
| {"start": 43, "end": 45, "name": "পিঙ্ক জোন", "multiplier": 1.4, "probability": 0.70}, | |
| {"start": 48, "end": 50, "name": "পিঙ্ক জোন", "multiplier": 1.4, "probability": 0.70}, | |
| ] | |
| # ==================== এমএল মডেল ক্লাস ==================== | |
| class NeuralNetwork: | |
| """নিউরাল নেটওয়ার্ক - প্যাটার্ন রিকগনিশনের জন্য""" | |
| def __init__(self): | |
| self.weights = { | |
| 'input': np.random.randn(15) * 0.1, | |
| 'hidden': np.random.randn(10) * 0.1, | |
| 'output': np.random.randn(5) * 0.1 | |
| } | |
| self.performance_history = [] | |
| def extract_features(self, history): | |
| """ডাটা থেকে ফিচার এক্সট্র্যাক্ট করে""" | |
| recent = history[:12] | |
| features = [] | |
| # 1. সাম্প্রতিক ভ্যালু (লগ স্কেলে) | |
| for val in recent: | |
| features.append(math.log(val + 0.1) / math.log(10)) | |
| # 2. পরিসংখ্যানিক ফিচার | |
| mean_val = np.mean(recent) if recent else 1.5 | |
| std_val = np.std(recent) if recent else 0.2 | |
| features.append(mean_val) | |
| features.append(std_val / (mean_val + 0.1)) # কোএফিশিয়েন্ট অফ ভেরিয়েশন | |
| # 3. ট্রেন্ড | |
| if len(recent) >= 3: | |
| trend = (recent[0] - recent[-1]) / len(recent) | |
| features.append(trend) | |
| else: | |
| features.append(0) | |
| # 4. পিঙ্ক রেশিও | |
| pink_count = sum(1 for v in recent if v >= CONFIG["PINK_THRESHOLD"]) | |
| features.append(pink_count / len(recent) if recent else 0) | |
| # প্যাডিং যদি কম হয় | |
| while len(features) < 15: | |
| features.append(0) | |
| return np.array(features[:15]) # ম্যাক্স ১৫টি ফিচার | |
| def predict(self, history): | |
| """প্রেডিকশন করে""" | |
| try: | |
| if len(history) < 5: | |
| return {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'পর্যাপ্ত ডাটা নেই', 'raw_value': 0} | |
| features = self.extract_features(history) | |
| # সিম্পল নিউরাল নেটওয়ার্ক ফরওয়ার্ড পাস | |
| hidden = np.tanh(np.dot(features, self.weights['input'][:len(features)])) | |
| output = np.tanh(hidden * np.mean(self.weights['hidden'])) | |
| # প্রেডিকশন ক্যালকুলেশন | |
| prediction = 1.5 + (output * 3.0) | |
| prediction = max(1.05, min(15.0, prediction)) | |
| # কনফিডেন্স ক্যালকুলেশন | |
| confidence = min(0.9, 0.5 + (len(history) / 200) + abs(output) * 0.2) | |
| analysis = self.generate_analysis(features, output) | |
| return { | |
| 'prediction': float(prediction), | |
| 'confidence': float(confidence), | |
| 'analysis': analysis, | |
| 'raw_value': float(output) | |
| } | |
| except Exception as e: | |
| print(f"NeuralNetwork error: {e}") | |
| return {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'এরর হয়েছে', 'raw_value': 0} | |
| def generate_analysis(self, features, output): | |
| """অ্যানালাইসিস জেনারেট করে""" | |
| if output > 0.6: | |
| return "🧠 শক্তিশালী নিউরাল সিগন্যাল" | |
| elif output < -0.4: | |
| return "🧠 দুর্বল নিউরাল সিগন্যাল" | |
| else: | |
| return "🧠 নিউট্রাল নিউরাল প্যাটার্ন" | |
| class SequenceAnalyzer: | |
| """সিকোয়েন্স অ্যানালাইজার - প্যাটার্ন খুঁজে বের করে""" | |
| def __init__(self): | |
| self.patterns = defaultdict(list) | |
| self.max_pattern_length = CONFIG["PATTERN_DEPTH"] | |
| def find_patterns(self, history): | |
| """ইতিহাসে প্যাটার্ন খুঁজে বের করে""" | |
| patterns = [] | |
| for length in range(2, min(self.max_pattern_length, len(history) // 2)): | |
| for i in range(len(history) - length * 2): | |
| pattern = history[i:i+length] | |
| next_seq = history[i+length:i+length*2] | |
| similarity = self.calculate_similarity(pattern, next_seq) | |
| if similarity > 0.6: | |
| patterns.append({ | |
| 'pattern': pattern, | |
| 'next': next_seq, | |
| 'similarity': similarity, | |
| 'length': length | |
| }) | |
| return patterns | |
| def calculate_similarity(self, seq1, seq2): | |
| """দুটি সিকোয়েন্সের মিল ক্যালকুলেট করে""" | |
| if len(seq1) != len(seq2) or len(seq1) == 0: | |
| return 0 | |
| diffs = [abs(seq1[i] - seq2[i]) / (max(seq1[i], seq2[i]) + 0.1) | |
| for i in range(len(seq1))] | |
| avg_diff = np.mean(diffs) if diffs else 1 | |
| return max(0, 1 - avg_diff) | |
| def predict(self, history): | |
| """প্যাটার্ন-ভিত্তিক প্রেডিকশন""" | |
| try: | |
| if len(history) < 4: | |
| return {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'পর্যাপ্ত প্যাটার্ন নেই'} | |
| patterns = self.find_patterns(history) | |
| if not patterns: | |
| return { | |
| 'prediction': 1.5, | |
| 'confidence': 0.4, | |
| 'analysis': '🔗 কোন প্যাটার্ন মেলেনি' | |
| } | |
| # সেরা প্যাটার্ন নির্বাচন | |
| best_pattern = max(patterns, key=lambda p: p['similarity'] * p['length']) | |
| # প্যাটার্ন থেকে প্রেডিকশন | |
| trend = (best_pattern['pattern'][-1] - best_pattern['pattern'][0]) / len(best_pattern['pattern']) | |
| prediction = best_pattern['pattern'][-1] + trend | |
| # অ্যাডজাস্টমেন্ট | |
| prediction = max(1.05, min(12.0, prediction)) | |
| confidence = best_pattern['similarity'] * 0.8 | |
| analysis = f"🔗 {best_pattern['length']}-দৈর্ঘ্যের প্যাটার্ন ({int(best_pattern['similarity']*100)}% মিল)" | |
| return { | |
| 'prediction': float(prediction), | |
| 'confidence': float(confidence), | |
| 'analysis': analysis | |
| } | |
| except Exception as e: | |
| print(f"SequenceAnalyzer error: {e}") | |
| return {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'প্যাটার্ন অ্যানালাইসিস এরর'} | |
| class MarkovChain: | |
| """মার্কভ চেইন - স্টেট ট্রানজিশন প্রেডিক্ট করে""" | |
| def __init__(self): | |
| self.transition_matrix = defaultdict(lambda: defaultdict(float)) | |
| self.states = ['খুব_ছোট', 'ছোট', 'মাঝারি', 'বড়', 'পিঙ্ক'] | |
| def discretize(self, value): | |
| """ভ্যালুকে স্টেটে রূপান্তর করে""" | |
| if value < 1.3: | |
| return 'খুব_ছোট' | |
| elif value < 1.8: | |
| return 'ছোট' | |
| elif value < 2.5: | |
| return 'মাঝারি' | |
| elif value < CONFIG["PINK_THRESHOLD"]: | |
| return 'বড়' | |
| else: | |
| return 'পিঙ্ক' | |
| def build_model(self, history): | |
| """ট্রানজিশন ম্যাট্রিক্স বিল্ড করে""" | |
| self.transition_matrix.clear() | |
| for i in range(len(history) - 1): | |
| current = self.discretize(history[i]) | |
| next_state = self.discretize(history[i + 1]) | |
| self.transition_matrix[current][next_state] += 1 | |
| # নরমালাইজেশন | |
| for state in self.transition_matrix: | |
| total = sum(self.transition_matrix[state].values()) | |
| if total > 0: | |
| for next_state in self.transition_matrix[state]: | |
| self.transition_matrix[state][next_state] /= total | |
| def predict(self, history): | |
| """মার্কভ চেইন থেকে প্রেডিকশন""" | |
| try: | |
| if len(history) < 2: | |
| return {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'পর্যাপ্ত ডাটা নেই'} | |
| self.build_model(history) | |
| current_state = self.discretize(history[0]) | |
| next_state_probs = self.transition_matrix.get(current_state, {}) | |
| if not next_state_probs: | |
| # ডিফল্ট প্রোবাবিলিটি | |
| next_state_probs = { | |
| 'খুব_ছোট': 0.2, | |
| 'ছোট': 0.4, | |
| 'মাঝারি': 0.25, | |
| 'বড়': 0.1, | |
| 'পিঙ্ক': 0.05 | |
| } | |
| # স্টেট ভ্যালু ম্যাপিং | |
| state_values = { | |
| 'খুব_ছোট': 1.15, | |
| 'ছোট': 1.5, | |
| 'মাঝারি': 2.2, | |
| 'বড়': 2.8, | |
| 'পিঙ্ক': 4.5 | |
| } | |
| # ওয়েটেড এভারেজ | |
| prediction = 0 | |
| total_prob = 0 | |
| for s, prob in next_state_probs.items(): | |
| prediction += state_values.get(s, 1.5) * prob | |
| total_prob += prob | |
| if total_prob > 0: | |
| prediction /= total_prob | |
| else: | |
| prediction = 1.5 | |
| confidence = max(next_state_probs.values()) * 0.9 if next_state_probs else 0.3 | |
| most_likely = max(next_state_probs.items(), key=lambda x: x[1])[0] if next_state_probs else 'ছোট' | |
| analysis = f"⛓️ মার্কভ: {current_state} → {most_likely} ({int(max(next_state_probs.values())*100)}%)" | |
| return { | |
| 'prediction': float(prediction), | |
| 'confidence': float(confidence), | |
| 'analysis': analysis | |
| } | |
| except Exception as e: | |
| print(f"MarkovChain error: {e}") | |
| return {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'মার্কভ এরর'} | |
| class StatisticalModel: | |
| """পরিসংখ্যানিক মডেল - গড়, মিডিয়ান, ট্রেন্ড""" | |
| def predict(self, history): | |
| """পরিসংখ্যানিক প্রেডিকশন""" | |
| try: | |
| if len(history) < 3: | |
| return {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'পর্যাপ্ত ডাটা নেই'} | |
| recent = history[:10] | |
| # বিভিন্ন পরিসংখ্যানিক মাপক | |
| mean_val = np.mean(recent) if recent else 1.5 | |
| median_val = np.median(recent) if recent else 1.5 | |
| std_val = np.std(recent) if recent else 0.2 | |
| # ট্রেন্ড | |
| if len(recent) >= 3: | |
| x = np.arange(len(recent)) | |
| z = np.polyfit(x, recent, 1) | |
| trend = z[0] | |
| else: | |
| trend = 0 | |
| # প্রেডিকশন (মিডিয়ান + ট্রেন্ড) | |
| prediction = median_val + trend * 2 | |
| # স্ট্যান্ডার্ড ডিভিয়েশন অনুযায়ী অ্যাডজাস্টমেন্ট | |
| if std_val > 1.0: | |
| prediction += random.uniform(-0.5, 0.5) | |
| prediction = max(1.05, min(10.0, prediction)) | |
| # কনফিডেন্স | |
| confidence = min(0.8, 0.5 + (len(history) / 200) - (std_val / 10)) | |
| # অ্যানালাইসিস | |
| if abs(trend) > 0.2: | |
| trend_text = "উর্ধ্বমুখী" if trend > 0 else "নিম্নমুখী" | |
| analysis = f"📊 {trend_text} ট্রেন্ড, মিডিয়ান: {median_val:.2f}x" | |
| else: | |
| analysis = f"📊 স্থিতিশীল, গড়: {mean_val:.2f}x" | |
| return { | |
| 'prediction': float(prediction), | |
| 'confidence': float(confidence), | |
| 'analysis': analysis | |
| } | |
| except Exception as e: | |
| print(f"StatisticalModel error: {e}") | |
| return {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'স্ট্যাটিস্টিক্যাল এরর'} | |
| class EnsemblePredictor: | |
| """এনসেম্বল মডেল - সব মডেলকে একত্রে ব্যবহার করে""" | |
| def __init__(self): | |
| self.models = { | |
| 'neuralNetwork': NeuralNetwork(), | |
| 'sequencePattern': SequenceAnalyzer(), | |
| 'markovChain': MarkovChain(), | |
| 'statisticalModel': StatisticalModel() | |
| } | |
| self.weights = CONFIG["ENSEMBLE_WEIGHTS"].copy() | |
| self.pattern_memory = {} | |
| self.performance = {'overall': []} | |
| def predict(self, history): | |
| """এনসেম্বল প্রেডিকশন""" | |
| try: | |
| if len(history) < 5: | |
| return self.get_default_prediction() | |
| predictions = {} | |
| total_weighted = 0 | |
| total_weight = 0 | |
| for name, model in self.models.items(): | |
| try: | |
| pred = model.predict(history) | |
| predictions[name] = pred | |
| weight = self.weights.get(name, 0.2) * pred['confidence'] | |
| total_weighted += pred['prediction'] * weight | |
| total_weight += weight | |
| except Exception as e: | |
| print(f"Error in {name}: {e}") | |
| predictions[name] = {'prediction': 1.5, 'confidence': 0.3, 'analysis': 'এরর'} | |
| # এনসেম্বল প্রেডিকশন | |
| ensemble_pred = total_weighted / total_weight if total_weight > 0 else 1.5 | |
| # টাইম উইন্ডো এফেক্ট | |
| time_window = self.get_current_time_window() | |
| if time_window: | |
| ensemble_pred *= time_window['multiplier'] | |
| ensemble_pred = min(15.0, ensemble_pred) | |
| # কনফিডেন্স ক্যালকুলেশন | |
| confidences = [p.get('confidence', 0.3) for p in predictions.values()] | |
| avg_confidence = np.mean(confidences) if confidences else 0.3 | |
| # পিঙ্ক সম্ভাবনা | |
| pink_prob = self.calculate_pink_probability(history, predictions, time_window) | |
| is_pink_expected = pink_prob > 0.4 | |
| # প্রেডিকশন ইন্টারভ্যাল | |
| interval = self.calculate_prediction_interval(predictions, ensemble_pred, avg_confidence) | |
| # রিস্ক লেভেল | |
| risk = self.calculate_risk(interval, avg_confidence) | |
| # অ্যানালাইসিস জেনারেট | |
| analysis = self.generate_analysis(predictions, time_window, is_pink_expected) | |
| # মডেল ডিটেইলস স্ট্রিং ফরম্যাটে | |
| model_details_str = self.format_model_details(predictions) | |
| return { | |
| 'prediction': float(ensemble_pred), | |
| 'interval_lower': float(interval['lower']), | |
| 'interval_upper': float(interval['upper']), | |
| 'confidence': float(avg_confidence), | |
| 'risk': risk, | |
| 'is_pink_expected': is_pink_expected, | |
| 'pink_probability': float(pink_prob), | |
| 'analysis': analysis, | |
| 'model_details': model_details_str, | |
| 'time_window': time_window['name'] if time_window else None | |
| } | |
| except Exception as e: | |
| print(f"EnsemblePredictor error: {e}") | |
| return self.get_default_prediction() | |
| def format_model_details(self, predictions): | |
| """মডেল ডিটেইলসকে স্ট্রিং ফরম্যাটে কনভার্ট করে""" | |
| lines = [] | |
| for name, pred in predictions.items(): | |
| model_names = { | |
| 'neuralNetwork': '🧠 নিউরাল', | |
| 'sequencePattern': '🔗 সিকোয়েন্স', | |
| 'markovChain': '⛓️ মার্কভ', | |
| 'statisticalModel': '📊 স্ট্যাট' | |
| } | |
| display_name = model_names.get(name, name) | |
| lines.append(f"{display_name}: {pred.get('prediction', 1.5):.2f}x (কনফি: {int(pred.get('confidence', 0)*100)}%) - {pred.get('analysis', '')[:30]}") | |
| return "\n".join(lines) | |
| def get_default_prediction(self): | |
| """ডিফল্ট প্রেডিকশন""" | |
| return { | |
| 'prediction': 1.5, | |
| 'interval_lower': 1.3, | |
| 'interval_upper': 1.7, | |
| 'confidence': 0.3, | |
| 'risk': 'মাঝারি ⚖️', | |
| 'is_pink_expected': False, | |
| 'pink_probability': 0.1, | |
| 'analysis': '🧠 পর্যাপ্ত ডাটা নেই। কমপক্ষে ৫টি রাউন্ড প্রয়োজন।', | |
| 'model_details': 'কোন মডেল ডাটা নেই', | |
| 'time_window': None | |
| } | |
| def get_current_time_window(self): | |
| """বর্তমান টাইম উইন্ডো চেক করে""" | |
| now = datetime.now() | |
| minutes = now.minute | |
| for window in TIME_WINDOWS: | |
| if window['start'] <= window['end']: | |
| if minutes >= window['start'] and minutes <= window['end']: | |
| return window | |
| else: | |
| if minutes >= window['start'] or minutes <= window['end']: | |
| return window | |
| return None | |
| def calculate_pink_probability(self, history, predictions, time_window): | |
| """পিঙ্ক হওয়ার সম্ভাবনা ক্যালকুলেট করে""" | |
| factors = [] | |
| # টাইম উইন্ডো ফ্যাক্টর | |
| if time_window: | |
| factors.append(time_window['probability']) | |
| # মডেল কনসেনসাস | |
| if predictions: | |
| pink_predictions = sum(1 for p in predictions.values() | |
| if p.get('prediction', 1.5) >= CONFIG["PINK_THRESHOLD"]) | |
| factors.append(pink_predictions / len(predictions)) | |
| # হিস্টোরিক্যাল ফ্যাক্টর | |
| if history: | |
| recent_pinks = sum(1 for v in history[:20] if v >= CONFIG["PINK_THRESHOLD"]) | |
| factors.append(min(0.9, recent_pinks / 20)) | |
| return np.mean(factors) if factors else 0.2 | |
| def calculate_prediction_interval(self, predictions, center, confidence): | |
| """প্রেডিকশন ইন্টারভ্যাল ক্যালকুলেট করে""" | |
| pred_values = [p.get('prediction', 1.5) for p in predictions.values()] | |
| std = np.std(pred_values) if len(pred_values) > 1 else 0.2 | |
| spread = std * (2 - confidence) | |
| spread = max(0.1, min(1.5, spread)) | |
| return { | |
| 'lower': max(1.01, center - spread/2), | |
| 'upper': center + spread/2 | |
| } | |
| def calculate_risk(self, interval, confidence): | |
| """রিস্ক লেভেল ক্যালকুলেট করে""" | |
| spread = interval['upper'] - interval['lower'] | |
| avg = (interval['lower'] + interval['upper']) / 2 | |
| relative_spread = spread / avg if avg > 0 else 0.5 | |
| if relative_spread < 0.2 and confidence > 0.7: | |
| return "নিম্ন ✅" | |
| elif relative_spread > 0.5 or confidence < 0.45: | |
| return "উচ্চ ⚠️" | |
| else: | |
| return "মাঝারি ⚖️" | |
| def generate_analysis(self, predictions, time_window, is_pink): | |
| """অ্যানালাইসিস টেক্সট জেনারেট করে""" | |
| parts = [] | |
| # মডেল অ্যানালাইসিস | |
| for name, pred in predictions.items(): | |
| if pred.get('confidence', 0) > 0.6: | |
| parts.append(pred.get('analysis', '')) | |
| # টাইম উইন্ডো | |
| if time_window: | |
| parts.append(f"⏰ {time_window['name']}") | |
| # পিঙ্ক | |
| if is_pink: | |
| parts.append("🌸 পিঙ্ক সম্ভাবনা") | |
| if not parts: | |
| return "🧠 মডেল অ্যানালাইসিস চলছে..." | |
| return " | ".join(parts[:3]) # সর্বোচ্চ ৩টি অংশ | |
| # ==================== মেইন অ্যাপ্লিকেশন ==================== | |
| class AviatorPredictorApp: | |
| """মেইন অ্যাপ্লিকেশন ক্লাস""" | |
| def __init__(self): | |
| self.history = [] | |
| self.predictor = EnsemblePredictor() | |
| self.last_prediction = None | |
| def add_round(self, multiplier): | |
| """নতুন রাউন্ড যোগ করে""" | |
| if multiplier <= 0: | |
| return False | |
| self.history.insert(0, float(multiplier)) | |
| if len(self.history) > CONFIG["HISTORY_LIMIT"]: | |
| self.history = self.history[:CONFIG["HISTORY_LIMIT"]] | |
| return True | |
| def reset(self): | |
| """হিস্ট্রি রিসেট করে""" | |
| self.history = [] | |
| self.last_prediction = None | |
| # ২০টি র্যান্ডম রাউন্ড জেনারেট করে | |
| for _ in range(20): | |
| self.history.append(round(random.uniform(1.0, 3.5), 2)) | |
| self.history.sort(reverse=True) | |
| def get_prediction(self): | |
| """বর্তমান প্রেডিকশন রিটার্ন করে""" | |
| if len(self.history) < 3: | |
| return self.predictor.get_default_prediction() | |
| self.last_prediction = self.predictor.predict(self.history) | |
| return self.last_prediction | |
| def get_history_table(self): | |
| """হিস্ট্রি টেবিল রিটার্ন করে (শুধু ডাটা, কোন বুলিয়ান না)""" | |
| return [[i+1, f"{val:.2f}x"] for i, val in enumerate(self.history[:50])] | |
| def get_time_status(self): | |
| """টাইম স্ট্যাটাস রিটার্ন করে""" | |
| now = datetime.now() | |
| time_str = now.strftime("%H:%M:%S") | |
| current = self.predictor.get_current_time_window() | |
| if current: | |
| status = f"🌸 {current['name']} একটিভ! 🌸" | |
| detail = f"বুস্ট: +{int((current['multiplier']-1)*100)}% | {int(current['probability']*100)}% পিঙ্ক সম্ভাবনা" | |
| css_class = "active-window" | |
| else: | |
| # পরবর্তী উইন্ডো খুঁজে বের করা | |
| next_window = None | |
| min_minutes = 60 | |
| for window in TIME_WINDOWS: | |
| if window['start'] <= window['end']: | |
| if now.minute < window['start']: | |
| minutes = window['start'] - now.minute | |
| else: | |
| minutes = (60 - now.minute) + window['start'] | |
| else: | |
| if now.minute >= window['start']: | |
| minutes = (60 - now.minute) + window['end'] | |
| elif now.minute <= window['end']: | |
| minutes = 0 | |
| else: | |
| minutes = window['start'] - now.minute | |
| if 0 < minutes < min_minutes: | |
| min_minutes = minutes | |
| next_window = window | |
| if next_window and min_minutes <= 2: | |
| status = f"⚠️ {next_window['name']} আসছে {min_minutes} মিনিটে" | |
| detail = "প্রস্তুত হোন!" | |
| css_class = "approaching-window" | |
| else: | |
| status = "পিঙ্ক জোনের অপেক্ষায়..." | |
| detail = next_window and f"পরবর্তী: {next_window['name']} {min_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 get_confidence_html(self): | |
| """কনফিডেন্স বার এইচটিএমএল রিটার্ন করে""" | |
| if not self.last_prediction: | |
| conf = 0.3 | |
| is_pink = False | |
| else: | |
| conf = self.last_prediction.get('confidence', 0.3) | |
| is_pink = self.last_prediction.get('is_pink_expected', False) | |
| 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> | |
| """ | |
| # ==================== কাস্টম সিএসএস ==================== | |
| CUSTOM_CSS = """ | |
| /* ডার্ক মোড বেস */ | |
| .gradio-container { | |
| background: #0a0a0f !important; | |
| color: #ffffff !important; | |
| } | |
| footer {visibility: hidden} | |
| /* টাইম বক্স স্টাইল */ | |
| .time-box { | |
| text-align: center; | |
| padding: 15px; | |
| border-radius: 10px; | |
| margin-bottom: 20px; | |
| transition: all 0.3s; | |
| font-weight: 500; | |
| } | |
| .active-window { | |
| background: linear-gradient(135deg, #ff1493, #ff69b4) !important; | |
| color: white !important; | |
| box-shadow: 0 0 20px #ff1493; | |
| } | |
| .approaching-window { | |
| background: linear-gradient(135deg, #ffa726, #ff9800) !important; | |
| color: white !important; | |
| box-shadow: 0 0 20px #ffa726; | |
| } | |
| .waiting-window { | |
| background: linear-gradient(135deg, #1a1a2e, #16213e) !important; | |
| color: white !important; | |
| border: 1px solid #00d4ff; | |
| } | |
| /* পিঙ্ক টেক্সট */ | |
| .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; | |
| } | |
| /* প্রেডিকশন ইন্টারভ্যাল */ | |
| .prediction-interval { | |
| font-size: 32px; | |
| font-weight: 700; | |
| text-align: center; | |
| margin: 10px 0; | |
| padding: 15px; | |
| background: rgba(255,255,255,0.05); | |
| border-radius: 10px; | |
| } | |
| .prediction-interval.pink-mode { | |
| color: #ff1493; | |
| text-shadow: 0 0 10px #ff1493; | |
| } | |
| .interval-lower { | |
| color: #00d4ff; | |
| } | |
| .interval-upper { | |
| color: #ffa726; | |
| } | |
| .interval-separator { | |
| color: white; | |
| margin: 0 10px; | |
| } | |
| /* টেক্সটবক্স স্টাইল */ | |
| .gr-box { | |
| border: 1px solid #333 !important; | |
| background: rgba(255,255,255,0.05) !important; | |
| } | |
| .gr-box label { | |
| color: #00d4ff !important; | |
| } | |
| /* বাটন স্টাইল */ | |
| .gr-button-primary { | |
| background: linear-gradient(135deg, #00d4ff, #0088ff) !important; | |
| border: none !important; | |
| } | |
| .gr-button-secondary { | |
| background: rgba(255,255,255,0.1) !important; | |
| border: 1px solid #00d4ff !important; | |
| } | |
| /* ডাটাফ্রেম */ | |
| .gr-dataframe { | |
| background: rgba(255,255,255,0.05) !important; | |
| } | |
| """ | |
| # ==================== গ্র্যাডিও ইন্টারফেস ==================== | |
| # অ্যাপ ইনিশিয়ালাইজ | |
| app = AviatorPredictorApp() | |
| app.reset() # শুরুতেই কিছু ডাটা জেনারেট করে | |
| # গ্র্যাডিও ইন্টারফেস | |
| with gr.Blocks(css=CUSTOM_CSS) 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 ML</h1> | |
| <p style="color: #888; font-size: 14px;">এনসেম্বল এমএল এভিয়েটর প্রেডিক্টর v3.0</p> | |
| </div> | |
| """) | |
| # টাইম সেকশন | |
| time_html = gr.HTML(value=app.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(): | |
| with gr.Column(): | |
| gr.Markdown("### 🎯 প্রেডিকশন ইন্টারভ্যাল") | |
| prediction_html = gr.HTML() | |
| # তিনটি আউটপুট এক লাইনে | |
| 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=app.get_confidence_html()) | |
| with gr.Column(scale=1): | |
| risk_out = gr.Textbox(label="রিস্ক লেভেল", interactive=False) | |
| # পিঙ্ক প্রোবাবিলিটি | |
| pink_prob_out = gr.Textbox(label="🌸 পিঙ্ক সম্ভাবনা", interactive=False) | |
| # মডেল ডিটেইলস (টেক্সট বক্স হিসেবে - JSON এরর এড়াতে) | |
| model_details = gr.Textbox( | |
| label="🧠 মডেল ডিটেইলস", | |
| interactive=False, | |
| lines=5 | |
| ) | |
| # টেবিল | |
| rounds_table = gr.Dataframe( | |
| label="📜 শেষ ৫০ রাউন্ড", | |
| headers=["রাউন্ড", "মাল্টিপ্লায়ার"], | |
| row_count=10, | |
| interactive=False | |
| ) | |
| # ---------- আপডেট ফাংশন ---------- | |
| def update_all(): | |
| """সব ডিসপ্লে আপডেট করে - শুধু ডাটা রিটার্ন করে, কোন বুলিয়ান না""" | |
| try: | |
| pred = app.get_prediction() | |
| history_table = app.get_history_table() | |
| time_status = app.get_time_status() | |
| confidence = app.get_confidence_html() | |
| # প্রেডিকশন এইচটিএমএল | |
| pink_class = "pink-mode" if pred.get('is_pink_expected', False) else "" | |
| prediction_html_str = f""" | |
| <div class="prediction-interval {pink_class}"> | |
| <span class="interval-lower">{pred.get('interval_lower', 1.3):.2f}x</span> | |
| <span class="interval-separator">—</span> | |
| <span class="interval-upper">{pred.get('interval_upper', 1.7):.2f}x</span> | |
| </div> | |
| """ | |
| # ডিসিশন | |
| if pred.get('is_pink_expected', False): | |
| decision = "পিঙ্ক আশান্বিত 🌸" | |
| elif pred.get('prediction', 1.5) > 3.0: | |
| decision = "বড় মাল্টিপ্লায়ার 🚀" | |
| elif pred.get('prediction', 1.5) > 1.8: | |
| decision = "মাঝারি 💪" | |
| else: | |
| decision = "ছোট 🎯" | |
| # পিঙ্ক প্রোবাবিলিটি টেক্সট | |
| pink_prob_text = f"{int(pred.get('pink_probability', 0)*100)}%" | |
| # মডেল ডিটেইলস | |
| model_text = pred.get('model_details', 'কোন ডাটা নেই') | |
| return [ | |
| history_table, # dataframe | |
| time_status, # html | |
| confidence, # html | |
| prediction_html_str, # html | |
| f"{pred.get('prediction', 1.5):.2f}x", # textbox | |
| pred.get('analysis', 'অ্যানালাইসিস নেই'), # textbox | |
| decision, # textbox | |
| pred.get('risk', 'মাঝারি ⚖️'), # textbox | |
| pink_prob_text, # textbox | |
| model_text # textbox | |
| ] | |
| except Exception as e: | |
| print(f"Update error: {e}") | |
| traceback.print_exc() | |
| # এরর হলে ডিফল্ট ভ্যালু রিটার্ন | |
| default_table = [[1, "1.00x"]] | |
| default_time = '<div class="time-box waiting-window"><div style="font-size:24px;">--:--:--</div><div>আপডেট এরর</div></div>' | |
| default_conf = '<div>এমএল কনফিডেন্স: 0%</div>' | |
| default_pred = '<div class="prediction-interval"><span class="interval-lower">1.30x</span><span class="interval-separator">—</span><span class="interval-upper">1.70x</span></div>' | |
| return [ | |
| default_table, | |
| default_time, | |
| default_conf, | |
| default_pred, | |
| "1.50x", | |
| "আপডেট এরর", | |
| "ছোট 🎯", | |
| "মাঝারি ⚖️", | |
| "0%", | |
| "মডেল লোড করতে সমস্যা হয়েছে" | |
| ] | |
| # অ্যাড বাটন ক্লিক | |
| add_btn.click( | |
| fn=lambda x: ( | |
| app.add_round(x), # এইটা True রিটার্ন করে, কিন্তু আমরা ইউজ করছি না | |
| *update_all() # শুধু আপডেট ডাটা রিটার্ন করছি | |
| )[-10:], # শুধু শেষ ১০টি ভ্যালু নিচ্ছি (ডাটাফ্রেম থেকে শুরু) | |
| inputs=[new_multiplier], | |
| outputs=[rounds_table, time_html, confidence_html, prediction_html, | |
| expected_out, analysis_out, decision_out, risk_out, | |
| pink_prob_out, model_details] | |
| ) | |
| # রিসেট বাটন ক্লিক | |
| reset_btn.click( | |
| fn=lambda: ( | |
| app.reset(), | |
| *update_all() | |
| )[-10:], | |
| outputs=[rounds_table, time_html, confidence_html, prediction_html, | |
| expected_out, analysis_out, decision_out, risk_out, | |
| pink_prob_out, model_details] | |
| ) | |
| # ইনিশিয়াল লোড | |
| demo.load( | |
| fn=update_all, | |
| outputs=[rounds_table, time_html, confidence_html, prediction_html, | |
| expected_out, analysis_out, decision_out, risk_out, | |
| pink_prob_out, model_details] | |
| ) | |
| # ==================== অ্যাপ রান ==================== | |
| if __name__ == "__main__": | |
| demo.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=False | |
| ) |