Skip to content

Commit 42a4aa5

Browse files
committed
Adds interactive dashboard and GitHub Pages deployment
Enables hosting of benchmark dashboard via GitHub Pages, integrating interactive Plotly charts for accuracy, training speed, and inference latency. Improves documentation and workflow for sharing results and visualizations.
1 parent 7289dbb commit 42a4aa5

13 files changed

Lines changed: 507 additions & 11 deletions

.github/workflows/pages.yml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
name: Deploy Docs Dashboard
2+
3+
on:
4+
push:
5+
branches: ["master"]
6+
paths:
7+
- "docs/**"
8+
- ".github/workflows/pages.yml"
9+
workflow_dispatch:
10+
11+
permissions:
12+
contents: read
13+
pages: write
14+
id-token: write
15+
16+
concurrency:
17+
group: "pages"
18+
cancel-in-progress: false
19+
20+
jobs:
21+
deploy:
22+
environment:
23+
name: github-pages
24+
url: ${{ steps.deployment.outputs.page_url }}
25+
runs-on: ubuntu-latest
26+
steps:
27+
- name: Checkout
28+
uses: actions/checkout@v4
29+
30+
- name: Setup Pages
31+
uses: actions/configure-pages@v5
32+
33+
- name: Upload docs artifact
34+
uses: actions/upload-pages-artifact@v3
35+
with:
36+
path: docs
37+
38+
- name: Deploy to GitHub Pages
39+
id: deployment
40+
uses: actions/deploy-pages@v4

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ for versioning even while in research-stage development.
2929
- `scripts/generate_readme_figures.py`
3030
- generated PNG benchmark charts under `docs/figures/`
3131
- illustrative circadian adaptation GIF (`docs/figures/circadian_sleep_dynamics.gif`)
32+
- interactive Plotly HTML chart outputs under `docs/figures/`
33+
- Docs dashboard and hosting:
34+
- `docs/index.html` interactive chart dashboard
35+
- `.github/workflows/pages.yml` for GitHub Pages deployment
36+
- `docs/.nojekyll` for static pages compatibility
3237
- Ownership and governance metadata:
3338
- `.github/CODEOWNERS`
3439
- `docs/model-card.md`
@@ -41,6 +46,7 @@ for versioning even while in research-stage development.
4146
- circadian-first project framing
4247
- reproducible benchmark commands
4348
- badges, mermaid circadian loop diagram, benchmark visuals, and results snapshot tables
49+
- dashboard and interactive chart links
4450
- governance and citation references
4551
- Updated `ARCHITECTURE.md` with clearer module boundaries and circadian-centric design intent.
4652
- Updated `CONTRIBUTING.md` with concrete contribution workflow and quality gates.

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,20 @@ This lets model capacity adapt over time instead of staying fixed.
5959
![Training Speed Chart](docs/figures/benchmark_train_speed.png)
6060
![Inference Latency Chart](docs/figures/benchmark_inference_latency_p95.png)
6161

62+
Interactive dashboard:
63+
64+
- [Benchmark Dashboard (GitHub Pages)](https://optimumaf.github.io/Circadian-Predictive-Coding/)
65+
- [Dashboard Source](docs/index.html)
66+
67+
Interactive Plotly chart files:
68+
69+
- [Accuracy (interactive)](https://optimumaf.github.io/Circadian-Predictive-Coding/figures/interactive_benchmark_accuracy.html)
70+
- [Training speed (interactive)](https://optimumaf.github.io/Circadian-Predictive-Coding/figures/interactive_benchmark_train_speed.html)
71+
- [Inference latency P95 (interactive)](https://optimumaf.github.io/Circadian-Predictive-Coding/figures/interactive_benchmark_inference_latency_p95.html)
72+
- [Interactive chart source files](docs/figures/)
73+
74+
Note: GitHub README pages do not execute custom JavaScript, so Plotly interactivity will not run inline inside README itself.
75+
6276
### Circadian Dynamics (Illustrative)
6377

6478
![Circadian Sleep Dynamics](docs/figures/circadian_sleep_dynamics.gif)
@@ -145,6 +159,11 @@ Regenerate README charts:
145159
python scripts/generate_readme_figures.py --summary-csv benchmark_multiseed_cifar100_summary.csv --output-dir docs/figures
146160
```
147161

162+
Deploy dashboard via GitHub Pages:
163+
164+
- Workflow: `.github/workflows/pages.yml`
165+
- Hosted entrypoint: `docs/index.html`
166+
148167
## Quality Commands
149168

150169
```powershell

docs/.nojekyll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

docs/figures/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ This folder stores visual assets used by `README.md`.
88
- `benchmark_train_speed.png`
99
- `benchmark_inference_latency_p95.png`
1010
- `circadian_sleep_dynamics.gif`
11+
- `interactive_benchmark_accuracy.html`
12+
- `interactive_benchmark_train_speed.html`
13+
- `interactive_benchmark_inference_latency_p95.html`
1114

1215
## Regeneration
1316

@@ -18,3 +21,9 @@ python scripts/generate_readme_figures.py --summary-csv benchmark_multiseed_cifa
1821
```
1922

2023
The GIF is illustrative and intended for communication in the README.
24+
Plotly HTML charts are interactive when opened in a normal browser context
25+
(local file, static host, or GitHub Pages).
26+
27+
The combined dashboard page is at `docs/index.html`.
28+
When Pages is enabled, the live dashboard URL is:
29+
`https://optimumaf.github.io/Circadian-Predictive-Coding/`.
2.64 KB
Loading
3.35 KB
Loading
4.86 KB
Loading
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<title>Accuracy Comparison</title>
7+
<script src="https://cdn.plot.ly/plotly-2.35.2.min.js"></script>
8+
</head>
9+
<body style="font-family: Arial, sans-serif; margin: 0; background: #f8fafc;">
10+
<div id="chart" style="width: 100%; max-width: 1080px; height: 640px; margin: 24px auto;"></div>
11+
<script>
12+
const payload = {"labels": ["Backprop", "Predictive", "Circadian"], "values": [0.6900666666666666, 0.681, 0.6714666666666668], "colors": ["#2e61ad", "#3d9d56", "#bd6624"], "title": "Accuracy Comparison", "y_label": "Mean test accuracy", "objective_note": "Higher is better", "range": [0.0, 1.0]};
13+
const trace = {
14+
x: payload.labels,
15+
y: payload.values,
16+
type: "bar",
17+
marker: { color: payload.colors },
18+
text: payload.values.map(v => String(v)),
19+
textposition: "outside",
20+
cliponaxis: false
21+
};
22+
const layout = {
23+
title: { text: payload.title + "<br><sup>" + payload.objective_note + "</sup>" },
24+
yaxis: { title: payload.y_label, range: payload.range },
25+
xaxis: { title: "Model" },
26+
margin: { l: 80, r: 40, t: 100, b: 80 },
27+
paper_bgcolor: "#f8fafc",
28+
plot_bgcolor: "#ffffff"
29+
};
30+
Plotly.newPlot("chart", [trace], layout, {responsive: true});
31+
</script>
32+
</body>
33+
</html>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<title>Inference Latency P95</title>
7+
<script src="https://cdn.plot.ly/plotly-2.35.2.min.js"></script>
8+
</head>
9+
<body style="font-family: Arial, sans-serif; margin: 0; background: #f8fafc;">
10+
<div id="chart" style="width: 100%; max-width: 1080px; height: 640px; margin: 24px auto;"></div>
11+
<script>
12+
const payload = {"labels": ["Backprop", "Predictive", "Circadian"], "values": [17.338261666694166, 17.741378333375717, 18.710663333350414], "colors": ["#2e61ad", "#3d9d56", "#bd6624"], "title": "Inference Latency P95", "y_label": "Mean p95 inference latency (ms)", "objective_note": "Lower is better", "range": [17.173573466695416, 18.875351533349164]};
13+
const trace = {
14+
x: payload.labels,
15+
y: payload.values,
16+
type: "bar",
17+
marker: { color: payload.colors },
18+
text: payload.values.map(v => String(v)),
19+
textposition: "outside",
20+
cliponaxis: false
21+
};
22+
const layout = {
23+
title: { text: payload.title + "<br><sup>" + payload.objective_note + "</sup>" },
24+
yaxis: { title: payload.y_label, range: payload.range },
25+
xaxis: { title: "Model" },
26+
margin: { l: 80, r: 40, t: 100, b: 80 },
27+
paper_bgcolor: "#f8fafc",
28+
plot_bgcolor: "#ffffff"
29+
};
30+
Plotly.newPlot("chart", [trace], layout, {responsive: true});
31+
</script>
32+
</body>
33+
</html>

0 commit comments

Comments
 (0)