deepboard 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. deepboard/__init__.py +1 -0
  2. deepboard/__version__.py +4 -0
  3. deepboard/gui/THEME.yml +28 -0
  4. deepboard/gui/__init__.py +0 -0
  5. deepboard/gui/assets/artefacts.css +108 -0
  6. deepboard/gui/assets/base.css +208 -0
  7. deepboard/gui/assets/base.js +77 -0
  8. deepboard/gui/assets/charts.css +188 -0
  9. deepboard/gui/assets/compare.css +90 -0
  10. deepboard/gui/assets/datagrid.css +120 -0
  11. deepboard/gui/assets/fileview.css +13 -0
  12. deepboard/gui/assets/right_panel.css +227 -0
  13. deepboard/gui/assets/theme.css +85 -0
  14. deepboard/gui/components/__init__.py +8 -0
  15. deepboard/gui/components/artefact_group.py +12 -0
  16. deepboard/gui/components/chart_type.py +22 -0
  17. deepboard/gui/components/legend.py +34 -0
  18. deepboard/gui/components/log_selector.py +22 -0
  19. deepboard/gui/components/modal.py +20 -0
  20. deepboard/gui/components/smoother.py +21 -0
  21. deepboard/gui/components/split_selector.py +21 -0
  22. deepboard/gui/components/stat_line.py +8 -0
  23. deepboard/gui/entry.py +21 -0
  24. deepboard/gui/main.py +93 -0
  25. deepboard/gui/pages/__init__.py +1 -0
  26. deepboard/gui/pages/compare_page/__init__.py +6 -0
  27. deepboard/gui/pages/compare_page/compare_page.py +22 -0
  28. deepboard/gui/pages/compare_page/components/__init__.py +4 -0
  29. deepboard/gui/pages/compare_page/components/card_list.py +19 -0
  30. deepboard/gui/pages/compare_page/components/chart.py +54 -0
  31. deepboard/gui/pages/compare_page/components/compare_setup.py +30 -0
  32. deepboard/gui/pages/compare_page/components/split_card.py +51 -0
  33. deepboard/gui/pages/compare_page/components/utils.py +20 -0
  34. deepboard/gui/pages/compare_page/routes.py +58 -0
  35. deepboard/gui/pages/main_page/__init__.py +4 -0
  36. deepboard/gui/pages/main_page/datagrid/__init__.py +5 -0
  37. deepboard/gui/pages/main_page/datagrid/compare_button.py +21 -0
  38. deepboard/gui/pages/main_page/datagrid/datagrid.py +67 -0
  39. deepboard/gui/pages/main_page/datagrid/handlers.py +54 -0
  40. deepboard/gui/pages/main_page/datagrid/header.py +43 -0
  41. deepboard/gui/pages/main_page/datagrid/routes.py +112 -0
  42. deepboard/gui/pages/main_page/datagrid/row.py +20 -0
  43. deepboard/gui/pages/main_page/datagrid/sortable_column_js.py +45 -0
  44. deepboard/gui/pages/main_page/datagrid/utils.py +9 -0
  45. deepboard/gui/pages/main_page/handlers.py +16 -0
  46. deepboard/gui/pages/main_page/main_page.py +21 -0
  47. deepboard/gui/pages/main_page/right_panel/__init__.py +12 -0
  48. deepboard/gui/pages/main_page/right_panel/config.py +57 -0
  49. deepboard/gui/pages/main_page/right_panel/fragments.py +133 -0
  50. deepboard/gui/pages/main_page/right_panel/hparams.py +25 -0
  51. deepboard/gui/pages/main_page/right_panel/images.py +358 -0
  52. deepboard/gui/pages/main_page/right_panel/run_info.py +86 -0
  53. deepboard/gui/pages/main_page/right_panel/scalars.py +251 -0
  54. deepboard/gui/pages/main_page/right_panel/template.py +151 -0
  55. deepboard/gui/pages/main_page/routes.py +25 -0
  56. deepboard/gui/pages/not_found.py +3 -0
  57. deepboard/gui/requirements.txt +5 -0
  58. deepboard/gui/utils.py +267 -0
  59. deepboard/resultTable/__init__.py +2 -0
  60. deepboard/resultTable/cursor.py +20 -0
  61. deepboard/resultTable/logwritter.py +667 -0
  62. deepboard/resultTable/resultTable.py +529 -0
  63. deepboard/resultTable/scalar.py +29 -0
  64. deepboard/resultTable/table_schema.py +135 -0
  65. deepboard/resultTable/utils.py +50 -0
  66. deepboard-0.2.0.dist-info/METADATA +164 -0
  67. deepboard-0.2.0.dist-info/RECORD +69 -0
  68. deepboard-0.2.0.dist-info/WHEEL +4 -0
  69. deepboard-0.2.0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,120 @@
1
+ @import url('theme.css');
2
+ .data-grid {
3
+ width: 100%;
4
+ border-collapse: collapse;
5
+ border-radius: 8px;
6
+ }
7
+
8
+ .data-grid td {
9
+ padding: 1em;
10
+ text-align: left;
11
+ }
12
+
13
+ .data-grid tr:nth-child(even) {
14
+ background-color: var(--dg-even-row-bg);
15
+ }
16
+
17
+ .data-grid td {
18
+ border-bottom: 1px solid var(--dg-border-color);
19
+ white-space: nowrap;
20
+ }
21
+
22
+ /* Sticky header */
23
+ .data-grid thead th {
24
+ position: sticky;
25
+ top: 0;
26
+ z-index: 2;
27
+ background-color: var(--dg-header-bg);
28
+ color: var(--dg-header-color);
29
+ border-bottom: 1px solid var(--dg-border-color);
30
+ white-space: nowrap;
31
+ }
32
+ .data-grid thead th div {
33
+ background-color: inherit;
34
+ padding: 1em; /* or whatever spacing you want */
35
+ }
36
+
37
+ /* Sticky first column */
38
+ .data-grid tbody td:first-child,
39
+ .data-grid thead th:first-child {
40
+ position: sticky;
41
+ left: 0;
42
+ z-index: 1;
43
+ background-color: var(--dg-header-bg);
44
+ }
45
+
46
+ /* Make sure the header cell in the top-left corner stays above others */
47
+ .data-grid thead th:first-child {
48
+ z-index: 3;
49
+ }
50
+
51
+ .scroll-container {
52
+ max-height: 60vh; /* adjust as needed */
53
+ max-width: 50vw;
54
+ overflow: auto;
55
+ position: relative;
56
+ box-shadow: var(--dg-shadow);
57
+ border-radius: var(--dg-border-radius);
58
+ }
59
+
60
+ .fullscreen{
61
+ max-width: 95vw;
62
+ }
63
+ .sortable {
64
+ background-color: inherit;
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: left;
68
+ padding: 1rem;
69
+ cursor: pointer;
70
+ }
71
+
72
+ .rename-input {
73
+ color: var(--dg-header-color);
74
+ font-family: system-ui, sans-serif;
75
+ padding: 0.5rem;
76
+ font-size: 1rem;
77
+ background-color: var(--dg-header-active);
78
+ border: none; /* No border */
79
+ border-radius: 0.5rem; /* Smooth rounded corners */
80
+ outline: none; /* Removes the default focus outline */
81
+ }
82
+
83
+ .sortable:hover {
84
+ background-color: var(--dg-header-active);
85
+ }
86
+
87
+ .sort-icon {
88
+ visibility: hidden;
89
+ font-size: 1.2rem;
90
+ color: var(--dg-header-secondary-color);
91
+ padding-left: 0.5rem;
92
+ }
93
+
94
+ .sortable:hover .sort-icon {
95
+ visibility: visible;
96
+ }
97
+
98
+ .table-container {
99
+ height: 100vh;
100
+ width: 100%;
101
+ display: flex;
102
+ flex-direction: column;
103
+ justify-content: center;
104
+ align-items: center;
105
+ }
106
+
107
+ .table-row{
108
+ cursor: pointer;
109
+ }
110
+
111
+ .table-row-hidden{
112
+ color: var(--dg-disabled-color);
113
+ }
114
+ .data-grid tbody tr:hover{
115
+ background-color: var(--dg-row-hover);
116
+ }
117
+
118
+ .table-row-selected {
119
+ background-color: var(--dg-row-selected) !important;
120
+ }
@@ -0,0 +1,13 @@
1
+ .config-part {
2
+ font-size: 1em;
3
+ font-family: monospace;
4
+ color: var(--fv-color);
5
+ margin: 0;
6
+ white-space: pre-wrap;
7
+ }
8
+ .file-view {
9
+ background-color: var(--fv-bg);
10
+ padding: 1em;
11
+ border-radius: 0.25em;
12
+ overflow: auto;
13
+ }
@@ -0,0 +1,227 @@
1
+
2
+ .right-panel {
3
+ position: relative;
4
+ width: 100%;
5
+ display: flex;
6
+ justify-content: center;
7
+ align-items: center;
8
+ }
9
+
10
+ .right-panel-closed{
11
+ width: 0;
12
+ visibility: hidden;
13
+ }
14
+ .right-panel-placeholder {
15
+ color: var(--secondary-text-color);
16
+ font-size: 1.1rem;
17
+ }
18
+
19
+ .close-button {
20
+ position: absolute;
21
+ top: 1rem;
22
+ left: 1rem;
23
+ background: none;
24
+ border: none;
25
+ color: var(--secondary-text-color);
26
+ font-size: 2rem;
27
+ cursor: pointer;
28
+ transition: color 0.2s ease;
29
+ }
30
+
31
+ .close-button:hover {
32
+ color: var(--text_color);
33
+ }
34
+
35
+ .open-right-panel{
36
+ display: flex;
37
+ height: 100%;
38
+ width: 100%;
39
+ max-width: 49vw;
40
+ justify-content: right;
41
+ padding-top: 2rem;
42
+ }
43
+
44
+ h1 {
45
+ padding: 0;
46
+ margin: 0;
47
+ }
48
+
49
+ /* styles.css */
50
+
51
+ .tab-menu {
52
+ display: flex;
53
+ margin-bottom: 0;
54
+ margin-top: 1rem;
55
+ max-width: 98%;
56
+ overflow-x: auto;
57
+ }
58
+
59
+ .tab {
60
+ padding: 0.75rem 1.5rem;
61
+ cursor: pointer;
62
+ background-color: var(--sp-tab-bg); /* Slightly darker than unselected tab */
63
+ color: var(--sp-color);
64
+ border-top-left-radius: 10px;
65
+ border-top-right-radius: 10px;
66
+ transition: background-color 0.2s ease;
67
+ }
68
+
69
+ .tab:hover {
70
+ background-color: var(--sp-tab-bg-hover);
71
+ }
72
+
73
+ .tab.active {
74
+ background-color: var(--sp-bg-color);
75
+ }
76
+
77
+ .tab-content {
78
+ background-color: var(--sp-bg-color);
79
+ padding: 2rem;
80
+ border-top: none;
81
+ border-radius: 0 10px 10px 10px;
82
+ color: var(--sp-color);
83
+ height: 100%;
84
+ overflow-y: auto;
85
+ overflow-x: hidden;
86
+ }
87
+
88
+ .right-panel-content{
89
+ width: 90%;
90
+ height: 80vh;
91
+ }
92
+
93
+ .info-table {
94
+ border-collapse: collapse;
95
+ width: 100%;
96
+ }
97
+
98
+ .info-table tr {
99
+ border-top: 1px solid var(--sp-color);
100
+ }
101
+
102
+ .info-table td {
103
+ padding: 1em;
104
+ }
105
+
106
+ /* Remove the first border */
107
+ .info-table tr:first-child {
108
+ border-top: none;
109
+ }
110
+
111
+ .info-table tr:hover {
112
+ background-color: var(--sp-bg-hover);
113
+ }
114
+
115
+ .info-label {
116
+ font-weight: bold;
117
+ color: var(--sp-accent-color);
118
+ padding: 0;
119
+ margin: 0;
120
+ }
121
+
122
+ .info-value {
123
+ color: var(--sp-color);
124
+ font-weight: normal;
125
+ text-align: right;
126
+ font-size: 1.1rem;
127
+ padding: 0;
128
+ margin: 0;
129
+ }
130
+
131
+ /* HParams table*/
132
+ .hparams-table {
133
+ width: 100%;
134
+ border-collapse: collapse;
135
+ background-color: var(--sp-table-bg);
136
+ color: var(--sp-table-color);
137
+ border-radius: 8px;
138
+ overflow-x: hidden;
139
+ overflow-y: auto;
140
+ font-size: 0.95rem;
141
+ box-shadow: var(--sp-table-shadow);
142
+ }
143
+
144
+ .hparams-table th,
145
+ .hparams-table td {
146
+ padding: 0.6em 1em;
147
+ text-align: left;
148
+ /*border-bottom: 1px solid #2e2e2e;*/
149
+ }
150
+
151
+ .hparams-table th {
152
+ background-color: var(--sp-table-header-bg);
153
+ color: var(--sp-table-header-color);
154
+ font-weight: 600;
155
+ }
156
+
157
+ .hparams-table tr:last-child td {
158
+ border-bottom: none;
159
+ }
160
+
161
+ .hparams-table tr:hover td {
162
+ background-color: var(--sp-table-hover-bg);
163
+ transition: background-color 0.2s ease-in-out;
164
+ }
165
+
166
+ /* Optional: make long values break nicely */
167
+ .hparams-table td {
168
+ word-break: break-word;
169
+ }
170
+
171
+ /*Status menu in setup*/
172
+ .run-status-select {
173
+ appearance: none;
174
+ background-color: var(--sp-bg-color);
175
+ color: var(--sp-color);
176
+ border: 1px solid var(--sp-color);
177
+ border-radius: 8px;
178
+ padding: 0.5em 24px;
179
+ padding-left: 12px;
180
+ font-size: 1rem;
181
+ outline: none;
182
+ transition: border 0.1s ease, box-shadow 0.1s ease;
183
+ cursor: pointer;
184
+
185
+ background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='10' viewBox='0 0 14 10'%3E%3Cpath fill='%23ccc' d='M7 10L0 0h14z'/%3E%3C/svg%3E");
186
+ background-repeat: no-repeat;
187
+ background-position: right 8px center;
188
+ background-size: 10px;
189
+ }
190
+
191
+
192
+ /* Dynamic styles based on selected status */
193
+ .run-status-select.running {
194
+ color: var(--success-color);
195
+ border-color: var(--success-color);
196
+ background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='10' viewBox='0 0 14 10'%3E%3Cpath fill='%234caf50' d='M7 10L0 0h14z'/%3E%3C/svg%3E");
197
+ }
198
+
199
+ .run-status-select.finished {
200
+ color: var(--neutral-color);
201
+ border-color: var(--neutral-color);
202
+ background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='10' viewBox='0 0 14 10'%3E%3Cpath fill='%239e9e9e' d='M7 10L0 0h14z'/%3E%3C/svg%3E");
203
+ }
204
+
205
+ .run-status-select.failed {
206
+ color: var(--failure-color);
207
+ border-color: var(--failure-color);
208
+ background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='10' viewBox='0 0 14 10'%3E%3Cpath fill='%23f44336' d='M7 10L0 0h14z'/%3E%3C/svg%3E");
209
+ }
210
+
211
+ .run-status-select.running:hover {
212
+ box-shadow: 0 0 6px var(--success-shadow-color);
213
+ border-color: var(--success-color);
214
+ transition: border 0.2s ease, box-shadow 0.2s ease;
215
+ }
216
+
217
+ .run-status-select.finished:hover {
218
+ box-shadow: 0 0 6px var(--neutral-shadow-color);
219
+ border-color: var(--neutral-color);
220
+ transition: border 0.2s ease, box-shadow 0.2s ease;
221
+ }
222
+
223
+ .run-status-select.failed:hover {
224
+ box-shadow: 0 0 6px var(--failure-shadow-color);
225
+ border-color: var(--failure-color);
226
+ transition: border 0.2s ease, box-shadow 0.2s ease;
227
+ }
@@ -0,0 +1,85 @@
1
+ :root {
2
+ /*General*/
3
+ --background-color: #121212;
4
+ --text_color: #e0e0e0;
5
+ --secondary-text-color: #ccc;
6
+ --primary-color: #50A76F;
7
+ --primary-color-hover: #6FBF91;
8
+ --button-shadow-color: rgba(255, 255, 255, 0.15);
9
+
10
+ --success-color: #4caf50;
11
+ --success-shadow-color: #4caf50aa;
12
+ --failure-color: #f44336;
13
+ --failure-shadow-color: #f44336aa;
14
+ --neutral-color: #9e9e9e;
15
+ --neutral-shadow-color: #9e9e9eaa;
16
+
17
+ /*Right-click menu*/
18
+ --menu-bg: #222;
19
+ --menu-bg-hover: #333;
20
+ --menu-border: 1px solid #555;
21
+ --menu-shadow: 0 0 8px rgba(0, 0, 0, 0.5);
22
+
23
+ /*Datagrid*/
24
+ --dg-even-row-bg: #1a1a1a;
25
+ --dg-border-color: #333;
26
+ --dg-header-color: var(--secondary-text-color);
27
+ --dg-header-secondary-color: #888;
28
+ --dg-header-bg: #2a2a2a;
29
+ --dg-shadow: 0 -1px 7px 0.5px rgba(255, 255, 255, 0.2);
30
+ --dg-border-radius: 8px;
31
+ --dg-header-active: #4d4d4d;
32
+ --dg-disabled-color: #555;
33
+ --dg-row-hover: #242424;
34
+ --dg-row-selected: #2a2a2a;
35
+
36
+ /*Side panel - right*/
37
+ --sp-color: var(--secondary-text-color);
38
+ --sp-accent-color: #fff;
39
+ --sp-bg-color: #2a2a2a;
40
+ --sp-bg-hover: #2F2F2F;
41
+ --sp-tab-bg: #1a1a1a;
42
+ --sp-tab-bg-hover: #4d4d4d;
43
+
44
+ --sp-table-bg: #1e1e1e;
45
+ --sp-table-color: var(--secondary-text-color);
46
+ --sp-table-hover-bg: #2c2c2c;
47
+ --sp-table-header-color: #eee;
48
+ --sp-table-header-bg: #2a2a2a;
49
+ --sp-table-shadow: 0 0 6px 2px rgba(255, 255, 255, 0.05);
50
+
51
+
52
+
53
+ /*File viewer*/
54
+ --fv-color: #bbb;
55
+ --fv-bg: #1e1e1e;
56
+
57
+ /*Charts*/
58
+ --chart-legend-bg: #4d4d4d;
59
+ --chart-legend-bg-hover: #333;
60
+ --chart-legend-color: var(--secondary-text-color);
61
+
62
+ --chart-section-title: #fff;
63
+ --chart-section-title-line: 2px solid var(--secondary-text-color);
64
+ --chart-metric-color: #fff;
65
+ --chart-setup-title: #fff;
66
+ --chart-disabled-color: #555;
67
+ --chart-typebox-shadow: 0 0 6px rgba(30, 144, 255, 0.5);
68
+
69
+ /*Artefacts (i.e. images, plots, text, etx)*/
70
+ --artefacts-card-bg: #1a1a1a;
71
+ --artefacts-card-shadow: 0 0 6px 2px rgba(255, 255, 255, 0.05);
72
+ --artefacts-card-radius: 8px;
73
+ --artefacts-header-line: 2px solid #333;
74
+ --artefacts-image_size: 10em;
75
+ --artefacts-text-color: var(--secondary-text-color);
76
+ --artefacts-text-font: monospace;
77
+
78
+ /*Compare page*/
79
+ --cmp-card-bg: #2a2a2a;
80
+ --cmp-card-shadow: 0 1px 7px 0.5px rgba(255, 255, 255, 0.2);
81
+ --cmp-card-color: var(--secondary-text-color);
82
+ --cmp-chart-title: var(--secondary-text-color);
83
+ --cmp-accordion-color: var(--secondary-text-color);
84
+ --cmp-accordion-color-hover: #4d4d4d;
85
+ }
@@ -0,0 +1,8 @@
1
+ from .chart_type import ChartType
2
+ from .legend import Legend
3
+ from .smoother import Smoother
4
+ from .log_selector import LogSelector
5
+ from .modal import Modal
6
+ from .split_selector import SplitSelector
7
+ from .stat_line import StatLine
8
+ from .artefact_group import ArtefactGroup
@@ -0,0 +1,12 @@
1
+ from fasthtml.common import *
2
+
3
+ def ArtefactGroup(*artefacts):
4
+ """
5
+ Create a group of images in a flex container that adapts to the number of images.
6
+ :param images: List of PIL Image objects.
7
+ :return: Div containing the images.
8
+ """
9
+ return Div(
10
+ *artefacts,
11
+ cls="artefact-group-container",
12
+ )
@@ -0,0 +1,22 @@
1
+ from fasthtml.common import *
2
+
3
+ def ChartType(session, path: str, selected_rows_key: str, session_path: str):
4
+ if selected_rows_key in session and "selected-rows" in session[selected_rows_key] and len(session[selected_rows_key]["selected-rows"]) > 0:
5
+ runIDs = session[selected_rows_key]["selected-rows"]
6
+ runIDs = ','.join([str(i) for i in runIDs])
7
+ else:
8
+ print("Warning: no selected lines")
9
+ runIDs = ""
10
+ print(session)
11
+
12
+ if "chart_type" not in session[session_path]:
13
+ session[session_path]["chart_type"] = "step"
14
+ type = session[session_path]["chart_type"]
15
+ return Div(
16
+ H2("Step/Duration", cls="setup-title"),
17
+ Input(type="checkbox", name="Step chart", id=f"chart-type-step-{runIDs}", value="step", cls="chart-type-checkbox",
18
+ checked=type == "step", hx_get=f"{path}/change_chart?runIDs={runIDs}&step={type == 'step'}",
19
+ hx_swap="outerHTML", hx_target="#chart-type-selector"),
20
+ style="display: flex; flex-direction: row; align-items: center; justify-content: space-between; width: 100%;",
21
+ id="chart-type-selector"
22
+ )
@@ -0,0 +1,34 @@
1
+ from fasthtml.common import *
2
+
3
+ def LegendLine(session, runIDs: str, label: str, color: str, hidden: bool, path):
4
+ from __main__ import CONFIG
5
+ if hidden:
6
+ return Li(
7
+ Span(cls="legend-icon", style=f"background-color: {CONFIG.HIDDEN_COLOR};"),
8
+ A(label, cls="legend-label", style=f"color: {CONFIG.HIDDEN_COLOR};"),
9
+ hx_get=f"{path}/show_line?runIDs={runIDs}&label={label}",
10
+ cls="legend-line"
11
+ )
12
+ else:
13
+ return Li(
14
+ Span(cls="legend-icon", style=f"background-color: {color};"),
15
+ A(label, cls="legend-label"),
16
+ hx_get=f"{path}/hide_line?runIDs={runIDs}&label={label}",
17
+ cls="legend-line"
18
+ )
19
+ def Legend(session, labels: list[tuple], path: str, selected_rows_key: str):
20
+ if selected_rows_key in session and "selected-rows" in session[selected_rows_key] and len(session[selected_rows_key]["selected-rows"]) > 0:
21
+ runIDs = session[selected_rows_key]["selected-rows"]
22
+ runIDs = ','.join([str(i) for i in runIDs])
23
+ else:
24
+ print("Warning: no selected lines")
25
+ runIDs = ""
26
+ return Div(
27
+ H2("Legend", cls="chart-legend-title"),
28
+ Ul(
29
+ *[LegendLine(session, runIDs, label, color, hidden, path=path) for label, color, hidden in labels],
30
+ cls="chart-legend",
31
+ id=f"chart-legend-{runIDs}"
32
+ ),
33
+ cls="chart-toolbox",
34
+ )
@@ -0,0 +1,22 @@
1
+ from fasthtml.common import *
2
+
3
+ def LogSelector(session, path: str, selected_rows_key: str, session_path: str):
4
+ if selected_rows_key in session and "selected-rows" in session[selected_rows_key] and len(session[selected_rows_key]["selected-rows"]) > 0:
5
+ runIDs = session[selected_rows_key]["selected-rows"]
6
+ runIDs = ','.join([str(i) for i in runIDs])
7
+ else:
8
+ print("Warning: no selected lines")
9
+ runIDs = ""
10
+ print(session)
11
+
12
+ if "chart_scale" not in session[session_path]:
13
+ session[session_path]["chart_scale"] = "default"
14
+ type = session[session_path]["chart_scale"]
15
+ return Div(
16
+ H2("Log Scale", cls="setup-title"),
17
+ Input(type="checkbox", name="log scale", id=f"chart-scale-{runIDs}", value="scale", cls="chart-type-checkbox",
18
+ checked=type == "log", hx_get=f"{path}/change_scale?runIDs={runIDs}&log={type == 'log'}",
19
+ hx_swap="outerHTML", hx_target="#chart-scale-selector"),
20
+ style="display: flex; flex-direction: row; align-items: center; justify-content: space-between; width: 100%;",
21
+ id="chart-scale-selector"
22
+ )
@@ -0,0 +1,20 @@
1
+ from fasthtml.common import *
2
+
3
+
4
+ def Modal(*content, active: bool = False):
5
+ return Div(
6
+ Button(
7
+ I(cls="fas fa-times"),
8
+ hx_get="/close_modal",
9
+ hx_target="#modal",
10
+ hx_swap="outerHTML",
11
+ cls="close-button",
12
+ ) if active else None,
13
+ Div(
14
+ *content,
15
+ cls="modal",
16
+ onclick="event.stopPropagation();",
17
+ ),
18
+ cls="modal-overlay" if active else "modal-overlay hidden",
19
+ id="modal"
20
+ )
@@ -0,0 +1,21 @@
1
+ from fasthtml.common import *
2
+
3
+ def Smoother(session, path: str, selected_rows_key: str, session_path: str):
4
+ if selected_rows_key in session and "selected-rows" in session[selected_rows_key] and len(session[selected_rows_key]["selected-rows"]) > 0:
5
+ runIDs = session[selected_rows_key]["selected-rows"]
6
+ else:
7
+ print("Warning: no selected lines")
8
+ runIDs = []
9
+ if "smoother_value" not in session[session_path]:
10
+ session[session_path]["smoother_value"] = 1
11
+ value = session[session_path]["smoother_value"]
12
+ return Div(
13
+ H2("Smoother", cls="setup-title"),
14
+ Div(
15
+ P(f"{value - 1}%"),
16
+ Input(type="range", min=1, max=101, value=value, id=f"chart-smoother", name="smoother",
17
+ hx_get=f"{path}/change_smoother?runIDs={','.join(str(i) for i in runIDs)}", hx_trigger="change"),
18
+ cls="chart-smoother-container",
19
+ ),
20
+ cls="chart-toolbox",
21
+ )
@@ -0,0 +1,21 @@
1
+ from fasthtml.common import *
2
+ from typing import Literal
3
+
4
+ def SplitSelector(runID, available_splits: List[str], selected: str, step: int, epoch: int, run_rep: int,
5
+ type: str, path: str, swap: bool = False):
6
+
7
+ swap_oob = dict(swap_oob="true") if swap else {}
8
+ return Select(
9
+ *[
10
+ Option(split.capitalize() if split else "", value=split, selected=selected == split, cls="artefact-split-option")
11
+ for split in available_splits
12
+ ],
13
+ name="split_select",
14
+ hx_get=f"{path}?runID={runID}&step={step}&epoch={epoch}&run_rep={run_rep}&type={type}",
15
+ hx_target=f"#artefact-card-{step}-{epoch}-{run_rep}",
16
+ hx_trigger="change",
17
+ hx_swap="outerHTML",
18
+ hx_params="*",
19
+ **swap_oob,
20
+ cls="artefact-split-select",
21
+ )
@@ -0,0 +1,8 @@
1
+ from fasthtml.common import *
2
+
3
+ def StatLine(label: str, value: str):
4
+ return Span(
5
+ H3(f"{label}: ", style="font-size: 1em; margin: 0.1em; margin-right: 0.5em; font-weight: bold;"),
6
+ H3(value, style="font-size: 1em; margin: 0.1em; font-weight: normal;"),
7
+ cls="expand"
8
+ )
deepboard/gui/entry.py ADDED
@@ -0,0 +1,21 @@
1
+ import runpy
2
+ import os
3
+ import sys
4
+
5
+
6
+ def main():
7
+ try:
8
+ import fasthtml # or whatever dependency is required
9
+ except ImportError:
10
+ raise ImportError(
11
+ "The GUI feature requires additional dependencies. Please install with:\n"
12
+ " pip install deepboard[full]"
13
+ )
14
+ if os.path.dirname(__file__) not in sys.path:
15
+ sys.path.insert(0, os.path.dirname(__file__))
16
+ script_path = os.path.join(os.path.dirname(__file__), "main.py")
17
+ runpy.run_path(script_path, run_name="__main__")
18
+
19
+
20
+ if __name__ == "__main__":
21
+ main()