Spaces:
Sleeping
Sleeping
import matplotlib.pyplot as plt | |
import firebase_admin | |
from firebase_admin import credentials, firestore | |
import io | |
from PIL import Image | |
import os | |
import json | |
# === Initialize Firebase | |
if not firebase_admin._apps: | |
cred = credentials.Certificate("firebase_key.json") | |
firebase_admin.initialize_app(cred) | |
db = firestore.client() | |
# === π³οΈ Feedback Summary Plot (Solution 1 vs Solution 2) | |
def update_dashboard_plot(): | |
try: | |
docs = db.collection("evo_feedback").stream() | |
count_1, count_2 = 0, 0 | |
for doc in docs: | |
winner = doc.to_dict().get("winner", "").strip() | |
if winner == "1": | |
count_1 += 1 | |
elif winner == "2": | |
count_2 += 1 | |
total = count_1 + count_2 | |
fig, ax = plt.subplots() | |
if total == 0: | |
ax.text(0.5, 0.5, "No feedback collected yet.", ha="center", va="center", fontsize=12) | |
ax.axis("off") | |
else: | |
ax.bar(["Solution 1", "Solution 2"], [count_1, count_2], color=["skyblue", "lightgreen"]) | |
ax.set_ylabel("Votes") | |
ax.set_title(f"π³οΈ Feedback Summary (Total: {total})") | |
for i, v in enumerate([count_1, count_2]): | |
ax.text(i, v + 0.5, str(v), ha='center', fontweight='bold') | |
plt.tight_layout() | |
buf = io.BytesIO() | |
plt.savefig(buf, format="png") | |
buf.seek(0) | |
return Image.open(buf) | |
except Exception as e: | |
return _fallback_plot(f"Error loading feedback chart: {e}") | |
# === π Evolution Accuracy Plot (Accuracy vs Generation) | |
def evolution_accuracy_plot(): | |
try: | |
log_path = "trained_model/evolution_log.json" | |
if not os.path.exists(log_path): | |
return _fallback_plot("β οΈ No evolution log found") | |
with open(log_path, "r") as f: | |
log_data = json.load(f) | |
if not log_data: | |
return _fallback_plot("β οΈ Evolution log is empty") | |
generations = list(range(1, len(log_data) + 1)) | |
accuracies = [round(entry.get("accuracy", 0), 4) for entry in log_data] | |
tooltips = [ | |
f"L: {entry.get('num_layers', '?')}, H: {entry.get('num_heads', '?')}, FFN: {entry.get('ffn_dim', '?')}, Mem: {entry.get('use_memory', '?')}" | |
for entry in log_data | |
] | |
fig, ax = plt.subplots(figsize=(7, 4)) | |
ax.plot(generations, accuracies, marker='o', color="purple", label="Accuracy") | |
for i, tooltip in enumerate(tooltips): | |
offset = (i % 2) * 5 - 2 | |
ax.annotate(tooltip, (generations[i], accuracies[i]), | |
fontsize=7, xytext=(0, 8 + offset), textcoords='offset points', | |
ha='center') | |
ax.set_xlabel("Generation") | |
ax.set_ylabel("Accuracy") | |
ax.set_title("π EvoTransformer Evolution Accuracy") | |
ax.set_ylim([0, 1.05]) | |
ax.grid(True) | |
plt.tight_layout() | |
buf = io.BytesIO() | |
plt.savefig(buf, format="png") | |
buf.seek(0) | |
return Image.open(buf) | |
except Exception as e: | |
return _fallback_plot(f"β οΈ Error loading evolution plot: {e}") | |
# === π Hall of Fame Plot (most frequent goals) | |
def leaderboard_plot(): | |
try: | |
docs = db.collection("evo_feedback").stream() | |
goal_counter = {} | |
for doc in docs: | |
goal = doc.to_dict().get("goal", "").strip() | |
if goal: | |
goal_counter[goal] = goal_counter.get(goal, 0) + 1 | |
sorted_goals = sorted(goal_counter.items(), key=lambda x: x[1], reverse=True)[:10] | |
if not sorted_goals: | |
return _fallback_plot("π No top goals yet.") | |
labels = [g[0][:25] + "..." if len(g[0]) > 25 else g[0] for g, _ in sorted_goals] | |
counts = [c for _, c in sorted_goals] | |
fig, ax = plt.subplots(figsize=(8, 4)) | |
ax.barh(labels[::-1], counts[::-1], color="orange") | |
ax.set_xlabel("Votes") | |
ax.set_title("π Hall of Fame: Top 10 Goals") | |
plt.tight_layout() | |
buf = io.BytesIO() | |
plt.savefig(buf, format="png") | |
buf.seek(0) | |
return Image.open(buf) | |
except Exception as e: | |
return _fallback_plot(f"β οΈ Error loading leaderboard: {e}") | |
# === π’ Real-time vote count for display | |
def get_vote_counts(): | |
try: | |
docs = db.collection("evo_feedback").stream() | |
count_1, count_2 = 0, 0 | |
for doc in docs: | |
winner = doc.to_dict().get("winner", "").strip() | |
if winner == "1": | |
count_1 += 1 | |
elif winner == "2": | |
count_2 += 1 | |
return {"1": count_1, "2": count_2} | |
except: | |
return {"1": 0, "2": 0} | |
# === π οΈ Fallback Plot | |
def _fallback_plot(message): | |
fig, ax = plt.subplots() | |
ax.text(0.5, 0.5, message, ha="center", va="center", fontsize=11) | |
ax.axis('off') | |
plt.tight_layout() | |
buf = io.BytesIO() | |
plt.savefig(buf, format="png") | |
buf.seek(0) | |
return Image.open(buf) | |