| | import contextlib |
| | from datetime import datetime, timezone, timedelta |
| | import hashlib |
| | import os |
| | from typing import Iterable, Union |
| |
|
| | from datasets import load_dataset |
| | import gradio as gr |
| | import pandas as pd |
| |
|
| | from constants import ( |
| | RESULTS_REPO, |
| | ASSAY_RENAME, |
| | LEADERBOARD_RESULTS_COLUMNS, |
| | BASELINE_USERNAMES, |
| | ) |
| |
|
| | pd.set_option("display.max_columns", None) |
| |
|
| |
|
| | def get_time(tz_name="EST") -> str: |
| | offsets = {"EST": -5, "UTC": 0} |
| | if tz_name not in offsets: |
| | print("Invalid timezone, using EST") |
| | tz_name = "EST" |
| | offset = offsets[tz_name] |
| | return ( |
| | datetime.now(timezone(timedelta(hours=offset))).strftime("%Y-%m-%d %H:%M:%S") |
| | + f" ({tz_name})" |
| | ) |
| |
|
| |
|
| | def show_output_box(message): |
| | return gr.update(value=message, visible=True) |
| |
|
| |
|
| | def anonymize_user(username: str) -> str: |
| | |
| | return hashlib.sha256(username.encode()).hexdigest()[:8] |
| |
|
| |
|
| | def fetch_hf_results(): |
| | |
| | df = load_dataset( |
| | RESULTS_REPO, |
| | data_files="auto_submissions/metrics_all.csv", |
| | )["train"].to_pandas() |
| | assert all( |
| | col in df.columns for col in LEADERBOARD_RESULTS_COLUMNS |
| | ), f"Expected columns {LEADERBOARD_RESULTS_COLUMNS} not found in {df.columns}. Missing columns: {set(LEADERBOARD_RESULTS_COLUMNS) - set(df.columns)}" |
| |
|
| | df_baseline = df[df["user"].isin(BASELINE_USERNAMES)] |
| | df_non_baseline = df[~df["user"].isin(BASELINE_USERNAMES)] |
| | |
| | |
| | df_baseline = df_baseline.sort_values( |
| | "submission_time", ascending=False |
| | ).drop_duplicates(subset=["model", "assay", "dataset", "user"], keep="first") |
| | |
| | df_non_baseline = df_non_baseline.sort_values( |
| | "submission_time", ascending=False |
| | ).drop_duplicates(subset=["assay", "dataset", "user"], keep="first") |
| | df = pd.concat([df_baseline, df_non_baseline], ignore_index=True) |
| | df["property"] = df["assay"].map(ASSAY_RENAME) |
| |
|
| | |
| | df.loc[df["user"].isin(BASELINE_USERNAMES), "user"] = "Baseline" |
| | |
| | |
| | df.loc[df["anonymous"], "user"] = "anon-" + df.loc[df["anonymous"], "user"].apply( |
| | readable_hash |
| | ) |
| |
|
| | |
| | if os.path.exists("debug-current-results.csv"): |
| | old_df = pd.read_csv("debug-current-results.csv") |
| | if len(df) != len(old_df): |
| | print(f"New results: Length {len(old_df)} -> {len(df)} ({get_time()})") |
| |
|
| | df.to_csv("debug-current-results.csv", index=False) |
| |
|
| |
|
| | def fetch_latest_data(stop_event): |
| | import time |
| |
|
| | while not stop_event.is_set(): |
| | try: |
| | fetch_hf_results() |
| | except Exception as e: |
| | print(f"Error fetching latest data: {e}") |
| | time.sleep(3) |
| | print("Exiting data fetch thread") |
| |
|
| |
|
| | @contextlib.asynccontextmanager |
| | async def periodic_data_fetch(app): |
| | import threading |
| |
|
| | event = threading.Event() |
| | t = threading.Thread(target=fetch_latest_data, args=(event,), daemon=True) |
| | t.start() |
| | yield |
| | event.set() |
| | t.join(3) |
| |
|
| |
|
| | |
| | ADJECTIVES = [ |
| | "ancient", |
| | "brave", |
| | "calm", |
| | "clever", |
| | "crimson", |
| | "curious", |
| | "dapper", |
| | "eager", |
| | "fuzzy", |
| | "gentle", |
| | "glowing", |
| | "golden", |
| | "happy", |
| | "icy", |
| | "jolly", |
| | "lucky", |
| | "magical", |
| | "mellow", |
| | "nimble", |
| | "peachy", |
| | "quick", |
| | "royal", |
| | "shiny", |
| | "silent", |
| | "sly", |
| | "sparkly", |
| | "spicy", |
| | "spry", |
| | "sturdy", |
| | "sunny", |
| | "swift", |
| | "tiny", |
| | "vivid", |
| | "witty", |
| | ] |
| |
|
| | ANIMALS = [ |
| | "ant", |
| | "bat", |
| | "bear", |
| | "bee", |
| | "bison", |
| | "boar", |
| | "bug", |
| | "cat", |
| | "crab", |
| | "crow", |
| | "deer", |
| | "dog", |
| | "duck", |
| | "eel", |
| | "elk", |
| | "fox", |
| | "frog", |
| | "goat", |
| | "gull", |
| | "hare", |
| | "hawk", |
| | "hen", |
| | "horse", |
| | "ibis", |
| | "kid", |
| | "kiwi", |
| | "koala", |
| | "lamb", |
| | "lark", |
| | "lemur", |
| | "lion", |
| | "llama", |
| | "loon", |
| | "lynx", |
| | "mole", |
| | "moose", |
| | "mouse", |
| | "newt", |
| | "otter", |
| | "owl", |
| | "ox", |
| | "panda", |
| | "pig", |
| | "prawn", |
| | "puma", |
| | "quail", |
| | "quokka", |
| | "rabbit", |
| | "rat", |
| | "ray", |
| | "robin", |
| | "seal", |
| | "shark", |
| | "sheep", |
| | "shrew", |
| | "skunk", |
| | "slug", |
| | "snail", |
| | "snake", |
| | "swan", |
| | "toad", |
| | "trout", |
| | "turtle", |
| | "vole", |
| | "walrus", |
| | "wasp", |
| | "whale", |
| | "wolf", |
| | "worm", |
| | "yak", |
| | "zebra", |
| | ] |
| | NOUNS = [ |
| | "rock", |
| | "sand", |
| | "star", |
| | "tree", |
| | "leaf", |
| | "seed", |
| | "stone", |
| | "cloud", |
| | "rain", |
| | "snow", |
| | "wind", |
| | "fire", |
| | "ash", |
| | "dirt", |
| | "mud", |
| | "ice", |
| | "wave", |
| | "shell", |
| | "dust", |
| | "sun", |
| | "moon", |
| | "hill", |
| | "lake", |
| | "pond", |
| | "reef", |
| | "root", |
| | "twig", |
| | "wood", |
| | ] |
| |
|
| |
|
| | def readable_hash( |
| | data: Union[str, bytes, Iterable[int]], |
| | *, |
| | salt: Union[str, bytes, None] = None, |
| | words: tuple[list[str], list[str]] = (ADJECTIVES, ANIMALS + NOUNS), |
| | sep: str = "-", |
| | checksum_len: int = 2, |
| | case: str = "lower", |
| | ) -> str: |
| | """ |
| | Deterministically map input data to 'adjective-animal[-checksum]'. Generated using ChatGPT. |
| | |
| | Examples |
| | -------- |
| | >>> readable_hash("hello world") |
| | 'magical-panda-6h' |
| | |
| | >>> readable_hash("hello world", salt="my-app-v1", checksum_len=3) |
| | 'royal-otter-1pz' |
| | |
| | >>> readable_hash(b"\x00\x01\x02\x03", case="title", checksum_len=0) |
| | 'Fuzzy-Tiger' |
| | |
| | Vocabulary |
| | ---------- |
| | ADJECTIVES: ~160 safe, descriptive words (e.g. "ancient", "brave", "silent", "swift") |
| | ANIMALS: ~80 short, common animals (e.g. "dog", "owl", "whale", "tiger") |
| | NOUNS: optional set of ~30 neutral nouns (e.g. "rock", "star", "tree", "cloud") |
| | |
| | Combinations |
| | ------------ |
| | - adjective + animal: ~13,000 unique names |
| | - adjective + noun: ~5,000 unique names |
| | - adjective + animal + noun: ~390,000 unique names |
| | |
| | Checksum |
| | -------- |
| | An optional short base-36 suffix (e.g. "-6h" or "-1pz"). The checksum |
| | acts as a disambiguator in case two different inputs map to the same |
| | word combination. With 2-3 characters, collisions become vanishingly rare. |
| | If you only need fun, human-readable names, you can disable it by setting |
| | ``checksum_len=0``. If you need unique, stable identifiers, keep it enabled. |
| | """ |
| | if isinstance(data, str): |
| | data = data.encode() |
| | elif isinstance(data, Iterable) and not isinstance(data, (bytes, bytearray)): |
| | data = bytes(data) |
| |
|
| | h = hashlib.blake2b(digest_size=8) |
| | if salt: |
| | h.update(salt.encode() if isinstance(salt, str) else salt) |
| | h.update(b"\x00") |
| | h.update(data) |
| | digest = h.digest() |
| |
|
| | |
| | n1 = int.from_bytes(digest[0:3], "big") |
| | n2 = int.from_bytes(digest[3:6], "big") |
| |
|
| | adj = words[0][n1 % len(words[0])] |
| | noun = words[1][n2 % len(words[1])] |
| | phrase = f"{adj}{sep}{noun}" |
| |
|
| | if checksum_len > 0: |
| | |
| | cs = int.from_bytes(digest[6:], "big") |
| | base36 = "" |
| | alphabet = "0123456789abcdefghijklmnopqrstuvwxyz" |
| | while cs: |
| | cs, r = divmod(cs, 36) |
| | base36 = alphabet[r] + base36 |
| | base36 = (base36 or "0")[:checksum_len] |
| | phrase = f"{phrase}{sep}{base36}" |
| |
|
| | if case == "title": |
| | phrase = sep.join(p.capitalize() for p in phrase.split(sep)) |
| | elif case == "upper": |
| | phrase = phrase.upper() |
| |
|
| | return phrase |
| |
|