Spaces:
Runtime error
Runtime error
Upload 100 files
Browse files- README.md +4 -11
- app.py +32 -14
- requirements.txt +2 -3
README.md
CHANGED
|
@@ -1,23 +1,15 @@
|
|
| 1 |
---
|
| 2 |
title: QuarksLab
|
| 3 |
-
emoji:
|
| 4 |
colorFrom: indigo
|
| 5 |
colorTo: blue
|
| 6 |
sdk: gradio
|
| 7 |
sdk_version: 4.44.1
|
| 8 |
-
python_version: 3.10
|
| 9 |
app_file: app.py
|
| 10 |
pinned: false
|
| 11 |
-
license: mit
|
| 12 |
---
|
| 13 |
|
| 14 |
-
# QuarksLab — TwoQuarks Interactive Lab
|
| 15 |
-
|
| 16 |
-
Real, interactive experiments. Modify seed/episodes/params and run.
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
# TwoQuarks — QuarksLab (Interactive)
|
| 22 |
|
| 23 |
This is a Hugging Face Space intended to **run real, bounded experiments** from Three Quarks:
|
|
@@ -35,4 +27,5 @@ python app.py
|
|
| 35 |
|
| 36 |
## Deploy to Hugging Face Spaces
|
| 37 |
|
| 38 |
-
Create a new Space (Gradio) and push this repository.
|
|
|
|
|
|
| 1 |
---
|
| 2 |
title: QuarksLab
|
| 3 |
+
emoji: "🧪"
|
| 4 |
colorFrom: indigo
|
| 5 |
colorTo: blue
|
| 6 |
sdk: gradio
|
| 7 |
sdk_version: 4.44.1
|
| 8 |
+
python_version: 3.10
|
| 9 |
app_file: app.py
|
| 10 |
pinned: false
|
|
|
|
| 11 |
---
|
| 12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
# TwoQuarks — QuarksLab (Interactive)
|
| 14 |
|
| 15 |
This is a Hugging Face Space intended to **run real, bounded experiments** from Three Quarks:
|
|
|
|
| 27 |
|
| 28 |
## Deploy to Hugging Face Spaces
|
| 29 |
|
| 30 |
+
Create a new Space (Gradio) and push this repository.
|
| 31 |
+
|
app.py
CHANGED
|
@@ -2,6 +2,7 @@ import os
|
|
| 2 |
import sys
|
| 3 |
import time
|
| 4 |
import uuid
|
|
|
|
| 5 |
from pathlib import Path
|
| 6 |
|
| 7 |
import gradio as gr
|
|
@@ -103,7 +104,9 @@ def run_down(episodes_per_phase: int, seed: int):
|
|
| 103 |
'artifact_csv': str(out_csv),
|
| 104 |
}
|
| 105 |
|
| 106 |
-
|
|
|
|
|
|
|
| 107 |
|
| 108 |
|
| 109 |
def run_antidown(n_episodes: int, base_seed: int):
|
|
@@ -190,7 +193,9 @@ def run_antidown(n_episodes: int, base_seed: int):
|
|
| 190 |
'artifact_csv': str(out_csv),
|
| 191 |
}
|
| 192 |
|
| 193 |
-
|
|
|
|
|
|
|
| 194 |
|
| 195 |
|
| 196 |
# =========================
|
|
@@ -238,7 +243,7 @@ def run_strange(n_episodes: int, max_steps: int, seed: int, mode: str):
|
|
| 238 |
'artifact_csv': str(out_csv),
|
| 239 |
}
|
| 240 |
|
| 241 |
-
return metrics, fig, str(out_csv)
|
| 242 |
|
| 243 |
|
| 244 |
# =========================
|
|
@@ -278,7 +283,7 @@ def run_charm(n_episodes: int, seed: int):
|
|
| 278 |
'artifact_csv': str(out_csv),
|
| 279 |
}
|
| 280 |
|
| 281 |
-
return metrics, fig_r, fig_l, fig_rho, str(out_csv)
|
| 282 |
|
| 283 |
|
| 284 |
# =========================
|
|
@@ -288,9 +293,10 @@ def run_charm(n_episodes: int, seed: int):
|
|
| 288 |
def build_ui():
|
| 289 |
with gr.Blocks(title='TwoQuarks — QuarksLab (Interactive)') as demo:
|
| 290 |
gr.Markdown(
|
| 291 |
-
"""# TwoQuarks • QuarksLab (Interactive)
|
| 292 |
-
|
| 293 |
-
|
|
|
|
| 294 |
)
|
| 295 |
|
| 296 |
with gr.Tab('DOWN / AntiDown'):
|
|
@@ -299,8 +305,12 @@ def build_ui():
|
|
| 299 |
down_eps = gr.Slider(50, 800, value=200, step=50, label='DOWN: episodes_per_phase')
|
| 300 |
down_seed = gr.Number(value=2025, precision=0, label='DOWN: seed')
|
| 301 |
run_down_btn = gr.Button('Run DOWN')
|
| 302 |
-
down_meta = gr.
|
| 303 |
-
down_table = gr.Dataframe(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 304 |
down_plot = gr.Plot(label='DOWN: mean reward by phase')
|
| 305 |
down_file = gr.File(label='DOWN: results CSV')
|
| 306 |
|
|
@@ -315,8 +325,12 @@ def build_ui():
|
|
| 315 |
ad_eps = gr.Slider(20, 400, value=120, step=20, label='AntiDown: episodes_per_phase')
|
| 316 |
ad_seed = gr.Number(value=1234, precision=0, label='AntiDown: base seed')
|
| 317 |
run_ad_btn = gr.Button('Run AntiDown')
|
| 318 |
-
ad_meta = gr.
|
| 319 |
-
ad_table = gr.Dataframe(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 320 |
ad_plot = gr.Plot(label='AntiDown: mean total reward by phase')
|
| 321 |
ad_file = gr.File(label='AntiDown: results CSV')
|
| 322 |
|
|
@@ -334,7 +348,7 @@ def build_ui():
|
|
| 334 |
ssteps = gr.Slider(10, 120, value=50, step=5, label='Max steps per episode')
|
| 335 |
sseed = gr.Number(value=0, precision=0, label='Seed')
|
| 336 |
run_s_btn = gr.Button('Run')
|
| 337 |
-
s_meta = gr.
|
| 338 |
s_plot = gr.Plot(label='Return per episode')
|
| 339 |
s_file = gr.File(label='Results CSV')
|
| 340 |
run_s_btn.click(fn=run_strange, inputs=[seps, ssteps, sseed, mode], outputs=[s_meta, s_plot, s_file])
|
|
@@ -345,7 +359,7 @@ def build_ui():
|
|
| 345 |
ceps = gr.Slider(50, 600, value=300, step=50, label='Episodes')
|
| 346 |
cseed = gr.Number(value=0, precision=0, label='Seed')
|
| 347 |
run_c_btn = gr.Button('Run CHARM')
|
| 348 |
-
c_meta = gr.
|
| 349 |
c_plot_r = gr.Plot(label='Reward')
|
| 350 |
c_plot_l = gr.Plot(label='Lambda')
|
| 351 |
c_plot_rho = gr.Plot(label='Rho_mean')
|
|
@@ -365,4 +379,8 @@ def build_ui():
|
|
| 365 |
demo = build_ui()
|
| 366 |
|
| 367 |
if __name__ == '__main__':
|
| 368 |
-
demo.launch(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
import sys
|
| 3 |
import time
|
| 4 |
import uuid
|
| 5 |
+
import json
|
| 6 |
from pathlib import Path
|
| 7 |
|
| 8 |
import gradio as gr
|
|
|
|
| 104 |
'artifact_csv': str(out_csv),
|
| 105 |
}
|
| 106 |
|
| 107 |
+
headers = ['agent', 'phase', 'mean_total_reward', 'std_total_reward', 'mean_valley_visits', 'n']
|
| 108 |
+
rows = [[row.get(h) for h in headers] for row in table_lines]
|
| 109 |
+
return json.dumps(meta, indent=2), rows, fig, str(out_csv)
|
| 110 |
|
| 111 |
|
| 112 |
def run_antidown(n_episodes: int, base_seed: int):
|
|
|
|
| 193 |
'artifact_csv': str(out_csv),
|
| 194 |
}
|
| 195 |
|
| 196 |
+
headers = ['agent', 'phase', 'mean_reward', 'std_reward', 'n']
|
| 197 |
+
rows = [[row.get(h) for h in headers] for row in table_lines]
|
| 198 |
+
return json.dumps(meta, indent=2), rows, fig, str(out_csv)
|
| 199 |
|
| 200 |
|
| 201 |
# =========================
|
|
|
|
| 243 |
'artifact_csv': str(out_csv),
|
| 244 |
}
|
| 245 |
|
| 246 |
+
return json.dumps(metrics, indent=2), fig, str(out_csv)
|
| 247 |
|
| 248 |
|
| 249 |
# =========================
|
|
|
|
| 283 |
'artifact_csv': str(out_csv),
|
| 284 |
}
|
| 285 |
|
| 286 |
+
return json.dumps(metrics, indent=2), fig_r, fig_l, fig_rho, str(out_csv)
|
| 287 |
|
| 288 |
|
| 289 |
# =========================
|
|
|
|
| 293 |
def build_ui():
|
| 294 |
with gr.Blocks(title='TwoQuarks — QuarksLab (Interactive)') as demo:
|
| 295 |
gr.Markdown(
|
| 296 |
+
"""# TwoQuarks • QuarksLab (Interactive)
|
| 297 |
+
|
| 298 |
+
Real runs, real knobs: seed/episodes/steps. Short-bounded experiments (public CPU).
|
| 299 |
+
"""
|
| 300 |
)
|
| 301 |
|
| 302 |
with gr.Tab('DOWN / AntiDown'):
|
|
|
|
| 305 |
down_eps = gr.Slider(50, 800, value=200, step=50, label='DOWN: episodes_per_phase')
|
| 306 |
down_seed = gr.Number(value=2025, precision=0, label='DOWN: seed')
|
| 307 |
run_down_btn = gr.Button('Run DOWN')
|
| 308 |
+
down_meta = gr.Code(label='DOWN: run meta (JSON)', language='json')
|
| 309 |
+
down_table = gr.Dataframe(
|
| 310 |
+
headers=['agent', 'phase', 'mean_reward', 'std_reward', 'n'],
|
| 311 |
+
label='DOWN: summary (mean/std by phase+agent)',
|
| 312 |
+
interactive=False,
|
| 313 |
+
)
|
| 314 |
down_plot = gr.Plot(label='DOWN: mean reward by phase')
|
| 315 |
down_file = gr.File(label='DOWN: results CSV')
|
| 316 |
|
|
|
|
| 325 |
ad_eps = gr.Slider(20, 400, value=120, step=20, label='AntiDown: episodes_per_phase')
|
| 326 |
ad_seed = gr.Number(value=1234, precision=0, label='AntiDown: base seed')
|
| 327 |
run_ad_btn = gr.Button('Run AntiDown')
|
| 328 |
+
ad_meta = gr.Code(label='AntiDown: run meta (JSON)', language='json')
|
| 329 |
+
ad_table = gr.Dataframe(
|
| 330 |
+
headers=['agent', 'phase', 'mean_total_reward', 'std_total_reward', 'mean_valley_visits', 'n'],
|
| 331 |
+
label='AntiDown: summary',
|
| 332 |
+
interactive=False,
|
| 333 |
+
)
|
| 334 |
ad_plot = gr.Plot(label='AntiDown: mean total reward by phase')
|
| 335 |
ad_file = gr.File(label='AntiDown: results CSV')
|
| 336 |
|
|
|
|
| 348 |
ssteps = gr.Slider(10, 120, value=50, step=5, label='Max steps per episode')
|
| 349 |
sseed = gr.Number(value=0, precision=0, label='Seed')
|
| 350 |
run_s_btn = gr.Button('Run')
|
| 351 |
+
s_meta = gr.Code(label='Run meta (JSON)', language='json')
|
| 352 |
s_plot = gr.Plot(label='Return per episode')
|
| 353 |
s_file = gr.File(label='Results CSV')
|
| 354 |
run_s_btn.click(fn=run_strange, inputs=[seps, ssteps, sseed, mode], outputs=[s_meta, s_plot, s_file])
|
|
|
|
| 359 |
ceps = gr.Slider(50, 600, value=300, step=50, label='Episodes')
|
| 360 |
cseed = gr.Number(value=0, precision=0, label='Seed')
|
| 361 |
run_c_btn = gr.Button('Run CHARM')
|
| 362 |
+
c_meta = gr.Code(label='Run meta (JSON)', language='json')
|
| 363 |
c_plot_r = gr.Plot(label='Reward')
|
| 364 |
c_plot_l = gr.Plot(label='Lambda')
|
| 365 |
c_plot_rho = gr.Plot(label='Rho_mean')
|
|
|
|
| 379 |
demo = build_ui()
|
| 380 |
|
| 381 |
if __name__ == '__main__':
|
| 382 |
+
demo.launch(
|
| 383 |
+
server_name='0.0.0.0',
|
| 384 |
+
server_port=int(os.getenv('PORT', '7860')),
|
| 385 |
+
show_api=False,
|
| 386 |
+
)
|
requirements.txt
CHANGED
|
@@ -1,4 +1,3 @@
|
|
| 1 |
-
gradio==4.44.1
|
| 2 |
-
huggingface_hub==0.24.7
|
| 3 |
numpy
|
| 4 |
-
matplotlib
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
numpy
|
| 2 |
+
matplotlib
|
| 3 |
+
huggingface_hub<1.0
|