"""Generate MIB-style sample data for the dataset visualizer.""" import pandas as pd import numpy as np from pathlib import Path np.random.seed(42) # MIB uses k in {.001, .002, .005, .01, .02, .05, .1, .2, .5, 1} K_VALUES = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0] TASKS = ["IOI", "MCQA", "Arithmetic", "ARC-E", "ARC-C"] MODELS = ["GPT-2", "Qwen-2.5", "Gemma-2", "Llama-3.1"] METHODS = [ "EAP-IG (CF)", "EAP (CF)", "NAP-IG (CF)", "UGS", "IFR", "Random", ] # Realistic-ish faithfulness curves: better methods rise faster, Random stays low def sample_f(k: float, method: str, task: str) -> float: base = np.clip(0.1 + 0.85 * (k ** 0.6) + np.random.uniform(-0.05, 0.05), 0, 1) if method == "Random": return np.clip(0.2 + 0.3 * k + np.random.uniform(-0.08, 0.08), 0, 1) if method == "IFR": base *= 0.75 elif method == "NAP-IG (CF)": base *= 0.85 elif method == "EAP (CF)": base *= 0.92 elif method == "UGS": base *= 0.88 return np.clip(base + np.random.uniform(-0.03, 0.03), 0, 1) def main(): out = Path(__file__).resolve().parents[1] / "data" out.mkdir(parents=True, exist_ok=True) # 1. Faithfulness curves: method, task, model, k, f rows = [] for method in METHODS: for task in TASKS[:3]: # subset for size for model in MODELS[:2]: for k in K_VALUES: f = sample_f(k, method, task) rows.append({"method": method, "task": task, "model": model, "k": k, "f": round(f, 4)}) curves = pd.DataFrame(rows) curves.to_csv(out / "faithfulness_curves.csv", index=False) # 2. Dataset overview (MIB Table 4 style) overview = pd.DataFrame([ {"dataset": "IOI", "split": "Train", "count": 10000}, {"dataset": "IOI", "split": "Validation", "count": 10000}, {"dataset": "IOI", "split": "Test (Public)", "count": 10000}, {"dataset": "IOI", "split": "Test (Private)", "count": 10000}, {"dataset": "MCQA", "split": "Train", "count": 110}, {"dataset": "MCQA", "split": "Validation", "count": 50}, {"dataset": "MCQA", "split": "Test (Public)", "count": 50}, {"dataset": "MCQA", "split": "Test (Private)", "count": 50}, {"dataset": "Arithmetic (+)", "split": "Train", "count": 34400}, {"dataset": "Arithmetic (+)", "split": "Validation", "count": 4920}, {"dataset": "Arithmetic (+)", "split": "Test (Public)", "count": 4920}, {"dataset": "Arithmetic (+)", "split": "Test (Private)", "count": 4920}, {"dataset": "Arithmetic (-)", "split": "Train", "count": 17400}, {"dataset": "Arithmetic (-)", "split": "Validation", "count": 2484}, {"dataset": "Arithmetic (-)", "split": "Test (Public)", "count": 2484}, {"dataset": "Arithmetic (-)", "split": "Test (Private)", "count": 2484}, {"dataset": "ARC (Easy)", "split": "Train", "count": 2251}, {"dataset": "ARC (Easy)", "split": "Validation", "count": 570}, {"dataset": "ARC (Easy)", "split": "Test (Public)", "count": 1188}, {"dataset": "ARC (Easy)", "split": "Test (Private)", "count": 1188}, {"dataset": "ARC (Challenge)", "split": "Train", "count": 1119}, {"dataset": "ARC (Challenge)", "split": "Validation", "count": 299}, {"dataset": "ARC (Challenge)", "split": "Test (Public)", "count": 586}, {"dataset": "ARC (Challenge)", "split": "Test (Private)", "count": 586}, ]) overview.to_csv(out / "dataset_overview.csv", index=False) # 3. Aggregate metrics table (CPR, CMD) — MIB Table 2 style metrics = [] for method in METHODS: for task in TASKS: for model in MODELS: cpr = round(np.random.uniform(0.2, 1.0) if method != "Random" else np.random.uniform(0.2, 0.35), 3) cmd = round(np.random.uniform(0.01, 0.4) if method != "Random" else np.random.uniform(0.68, 0.78), 3) metrics.append({"method": method, "task": task, "model": model, "CPR": cpr, "CMD": cmd}) metrics_df = pd.DataFrame(metrics) metrics_df.to_csv(out / "metrics_table.csv", index=False) print("Wrote:", out / "faithfulness_curves.csv", out / "dataset_overview.csv", out / "metrics_table.csv") if __name__ == "__main__": main()