|
import os |
|
import json |
|
import threading |
|
import gradio as gr |
|
import statistics |
|
from scipy import stats |
|
|
|
DATA_DIR = './storage' |
|
DATA_FILE = os.path.join(DATA_DIR, 'guesses.json') |
|
lock = threading.Lock() |
|
|
|
def ensure_data_directory(): |
|
os.makedirs(DATA_DIR, exist_ok=True) |
|
|
|
def load_guesses(): |
|
ensure_data_directory() |
|
if not os.path.exists(DATA_FILE): |
|
with open(DATA_FILE, 'w') as f: |
|
json.dump([], f) |
|
with open(DATA_FILE, 'r') as f: |
|
return json.load(f) |
|
|
|
def save_guesses(guesses): |
|
with open(DATA_FILE, 'w') as f: |
|
json.dump(guesses, f) |
|
|
|
def add_guess(guess): |
|
with lock: |
|
guesses = load_guesses() |
|
guesses.append(guess) |
|
save_guesses(guesses) |
|
|
|
n = len(guesses) |
|
average = sum(guesses) / n |
|
|
|
if n >= 2: |
|
|
|
s = statistics.stdev(guesses) |
|
|
|
SE = s / (n ** 0.5) |
|
|
|
df = n - 1 |
|
|
|
confidence_level = 0.95 |
|
alpha = 1 - confidence_level |
|
|
|
t_value = stats.t.ppf(1 - alpha/2, df) |
|
|
|
ME = t_value * SE |
|
|
|
ci_lower = average - ME |
|
ci_upper = average + ME |
|
|
|
return ( |
|
f"Your guess has been recorded.\n" |
|
f"Current average of all guesses: {average:.2f}\n" |
|
f"95% confidence interval: ({ci_lower:.2f}, {ci_upper:.2f})" |
|
) |
|
else: |
|
|
|
return ( |
|
f"Your guess has been recorded.\n" |
|
f"Current average of all guesses: {average:.2f}\n" |
|
f"Not enough data to compute confidence interval." |
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Collective Guessing Game") |
|
gr.Markdown("Submit your guess and contribute to the global average!") |
|
|
|
guess_input = gr.Number(label="Enter your guess") |
|
submit_button = gr.Button("Submit Guess") |
|
|
|
with gr.Accordion("View Current Results!", open=False): |
|
output_text = gr.Textbox(label="Results", lines=10) |
|
|
|
submit_button.click(fn=add_guess, inputs=guess_input, outputs=output_text) |
|
|
|
demo.launch() |
|
|