#!/usr/bin/env python3
"""Run every demo in sequence (quick settings by default).

  python run_all.py           # quick mode, ~1.5-2 min total
  python run_all.py --full    # full settings, ~3-4 min total
"""
import argparse
import time

import certified_robustness
import diffusion_memorization
import double_descent
import high_dim
import randomized_response

DEMOS = [
    ("double descent", lambda q: double_descent.main(q)),
    ("high-dimensional geometry", lambda q: high_dim.main(q)),
    ("diffusion memorisation", lambda q: diffusion_memorization.main(q)),
    ("randomized response", lambda q: randomized_response.demo(q)),
    ("certified robustness", lambda q: certified_robustness.main(q)),
]

if __name__ == "__main__":
    ap = argparse.ArgumentParser()
    ap.add_argument("--full", action="store_true", help="use the full (slower) settings")
    quick = not ap.parse_args().full
    t_all = time.time()
    for name, fn in DEMOS:
        print(f"\n===== {name} {'(quick)' if quick else '(full)'} =====")
        t0 = time.time()
        fn(quick)
        print(f"[{name}: {time.time() - t0:.1f}s]")
    print(f"\nall demos done in {time.time() - t_all:.0f}s; PNGs in out/")
