deepboard 0.0.1__tar.gz → 0.2.0__tar.gz
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.
- deepboard-0.2.0/.gitignore +171 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/PKG-INFO +31 -29
- {deepboard-0.0.1 → deepboard-0.2.0}/README.md +11 -0
- deepboard-0.2.0/deepboard/__version__.py +4 -0
- deepboard-0.2.0/deepboard/gui/assets/artefacts.css +108 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/assets/base.css +40 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/assets/datagrid.css +3 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/assets/right_panel.css +10 -5
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/assets/theme.css +11 -2
- deepboard-0.2.0/deepboard/gui/components/__init__.py +8 -0
- deepboard-0.2.0/deepboard/gui/components/artefact_group.py +12 -0
- deepboard-0.2.0/deepboard/gui/components/log_selector.py +22 -0
- deepboard-0.2.0/deepboard/gui/components/modal.py +20 -0
- deepboard-0.2.0/deepboard/gui/components/split_selector.py +21 -0
- deepboard-0.2.0/deepboard/gui/components/stat_line.py +8 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/entry.py +7 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/main.py +13 -4
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/components/chart.py +5 -5
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/components/compare_setup.py +2 -1
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/components/split_card.py +2 -1
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/routes.py +11 -3
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/datagrid.py +11 -3
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/row.py +2 -2
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/handlers.py +6 -4
- deepboard-0.2.0/deepboard/gui/pages/main_page/main_page.py +21 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/right_panel/__init__.py +4 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/right_panel/config.py +19 -0
- deepboard-0.2.0/deepboard/gui/pages/main_page/right_panel/fragments.py +133 -0
- deepboard-0.2.0/deepboard/gui/pages/main_page/right_panel/images.py +358 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/right_panel/run_info.py +7 -9
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/right_panel/scalars.py +32 -9
- deepboard-0.2.0/deepboard/gui/pages/main_page/right_panel/template.py +151 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/routes.py +10 -1
- deepboard-0.0.1/deepboard.egg-info/requires.txt → deepboard-0.2.0/deepboard/gui/requirements.txt +2 -1
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/utils.py +29 -3
- deepboard-0.2.0/deepboard/resultTable/logwritter.py +667 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/resultTable/resultTable.py +122 -72
- deepboard-0.2.0/deepboard/resultTable/table_schema.py +135 -0
- deepboard-0.2.0/pyproject.toml +55 -0
- deepboard-0.0.1/MANIFEST.in +0 -1
- deepboard-0.0.1/deepboard/__version__.py +0 -1
- deepboard-0.0.1/deepboard/gui/components/__init__.py +0 -3
- deepboard-0.0.1/deepboard/gui/pages/main_page/main_page.py +0 -17
- deepboard-0.0.1/deepboard/gui/pages/main_page/right_panel/template.py +0 -86
- deepboard-0.0.1/deepboard/resultTable/logwritter.py +0 -321
- deepboard-0.0.1/deepboard/resultTable/results/configs/1.yml +0 -6
- deepboard-0.0.1/deepboard/resultTable/results/configs/2.yml +0 -6
- deepboard-0.0.1/deepboard/resultTable/results/configs/3.yml +0 -6
- deepboard-0.0.1/deepboard/resultTable/results/configs/4.yml +0 -6
- deepboard-0.0.1/deepboard/resultTable/results/configs/5.yml +0 -6
- deepboard-0.0.1/deepboard/resultTable/results/configs/6.yml +0 -6
- deepboard-0.0.1/deepboard/resultTable/results/myconfig.yml +0 -6
- deepboard-0.0.1/deepboard/resultTable/table_schema.py +0 -183
- deepboard-0.0.1/deepboard.egg-info/PKG-INFO +0 -162
- deepboard-0.0.1/deepboard.egg-info/SOURCES.txt +0 -72
- deepboard-0.0.1/deepboard.egg-info/dependency_links.txt +0 -1
- deepboard-0.0.1/deepboard.egg-info/entry_points.txt +0 -2
- deepboard-0.0.1/deepboard.egg-info/top_level.txt +0 -1
- deepboard-0.0.1/setup.cfg +0 -4
- deepboard-0.0.1/setup.py +0 -54
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/__init__.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/THEME.yml +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/__init__.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/assets/base.js +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/assets/charts.css +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/assets/compare.css +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/assets/fileview.css +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/components/chart_type.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/components/legend.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/components/smoother.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/__init__.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/__init__.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/compare_page.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/components/__init__.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/components/card_list.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/compare_page/components/utils.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/__init__.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/__init__.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/compare_button.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/handlers.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/header.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/routes.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/sortable_column_js.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/datagrid/utils.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/main_page/right_panel/hparams.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/gui/pages/not_found.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/resultTable/__init__.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/resultTable/cursor.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/resultTable/scalar.py +0 -0
- {deepboard-0.0.1 → deepboard-0.2.0}/deepboard/resultTable/utils.py +0 -0
@@ -0,0 +1,171 @@
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
2
|
+
__pycache__/
|
3
|
+
*.py[cod]
|
4
|
+
*$py.class
|
5
|
+
|
6
|
+
# C extensions
|
7
|
+
*.so
|
8
|
+
|
9
|
+
# Distribution / packaging
|
10
|
+
.Python
|
11
|
+
build/
|
12
|
+
develop-eggs/
|
13
|
+
dist/
|
14
|
+
downloads/
|
15
|
+
eggs/
|
16
|
+
.eggs/
|
17
|
+
lib/
|
18
|
+
lib64/
|
19
|
+
parts/
|
20
|
+
sdist/
|
21
|
+
var/
|
22
|
+
wheels/
|
23
|
+
share/python-wheels/
|
24
|
+
*.egg-info/
|
25
|
+
.installed.cfg
|
26
|
+
*.egg
|
27
|
+
MANIFEST
|
28
|
+
|
29
|
+
# PyInstaller
|
30
|
+
# Usually these files are written by a python script from a template
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
32
|
+
*.manifest
|
33
|
+
*.spec
|
34
|
+
|
35
|
+
# Installer logs
|
36
|
+
pip-log.txt
|
37
|
+
pip-delete-this-directory.txt
|
38
|
+
|
39
|
+
# Unit test / coverage reports
|
40
|
+
htmlcov/
|
41
|
+
.tox/
|
42
|
+
.nox/
|
43
|
+
.coverage
|
44
|
+
.coverage.*
|
45
|
+
.cache
|
46
|
+
nosetests.xml
|
47
|
+
coverage.xml
|
48
|
+
*.cover
|
49
|
+
*.py,cover
|
50
|
+
.hypothesis/
|
51
|
+
.pytest_cache/
|
52
|
+
cover/
|
53
|
+
|
54
|
+
# Translations
|
55
|
+
*.mo
|
56
|
+
*.pot
|
57
|
+
|
58
|
+
# Django stuff:
|
59
|
+
*.log
|
60
|
+
local_settings.py
|
61
|
+
db.sqlite3
|
62
|
+
db.sqlite3-journal
|
63
|
+
|
64
|
+
# Flask stuff:
|
65
|
+
instance/
|
66
|
+
.webassets-cache
|
67
|
+
|
68
|
+
# Scrapy stuff:
|
69
|
+
.scrapy
|
70
|
+
|
71
|
+
# Sphinx documentation
|
72
|
+
docs/_build/
|
73
|
+
|
74
|
+
# PyBuilder
|
75
|
+
.pybuilder/
|
76
|
+
target/
|
77
|
+
|
78
|
+
# Jupyter Notebook
|
79
|
+
.ipynb_checkpoints
|
80
|
+
|
81
|
+
# IPython
|
82
|
+
profile_default/
|
83
|
+
ipython_config.py
|
84
|
+
|
85
|
+
# pyenv
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
88
|
+
# .python-version
|
89
|
+
|
90
|
+
# pipenv
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
94
|
+
# install all needed dependencies.
|
95
|
+
#Pipfile.lock
|
96
|
+
|
97
|
+
# poetry
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
100
|
+
# commonly ignored for libraries.
|
101
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
102
|
+
#poetry.lock
|
103
|
+
|
104
|
+
# pdm
|
105
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
106
|
+
#pdm.lock
|
107
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
108
|
+
# in version control.
|
109
|
+
# https://pdm.fming.dev/#use-with-ide
|
110
|
+
.pdm.toml
|
111
|
+
|
112
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
113
|
+
__pypackages__/
|
114
|
+
|
115
|
+
# Celery stuff
|
116
|
+
celerybeat-schedule
|
117
|
+
celerybeat.pid
|
118
|
+
|
119
|
+
# SageMath parsed files
|
120
|
+
*.sage.py
|
121
|
+
|
122
|
+
# Environments
|
123
|
+
.env
|
124
|
+
.venv
|
125
|
+
env/
|
126
|
+
venv/
|
127
|
+
ENV/
|
128
|
+
env.bak/
|
129
|
+
venv.bak/
|
130
|
+
|
131
|
+
# Spyder project settings
|
132
|
+
.spyderproject
|
133
|
+
.spyproject
|
134
|
+
|
135
|
+
# Rope project settings
|
136
|
+
.ropeproject
|
137
|
+
|
138
|
+
# mkdocs documentation
|
139
|
+
/site
|
140
|
+
|
141
|
+
# mypy
|
142
|
+
.mypy_cache/
|
143
|
+
.dmypy.json
|
144
|
+
dmypy.json
|
145
|
+
|
146
|
+
# Pyre type checker
|
147
|
+
.pyre/
|
148
|
+
|
149
|
+
# pytype static type analyzer
|
150
|
+
.pytype/
|
151
|
+
|
152
|
+
# Cython debug symbols
|
153
|
+
cython_debug/
|
154
|
+
|
155
|
+
# MacOS
|
156
|
+
.DS_Store
|
157
|
+
|
158
|
+
# PyCharm
|
159
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
160
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
161
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
162
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
163
|
+
.idea/
|
164
|
+
|
165
|
+
tmp.py
|
166
|
+
|
167
|
+
results/
|
168
|
+
|
169
|
+
.sesskey
|
170
|
+
|
171
|
+
tmp*
|
@@ -1,36 +1,27 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: deepboard
|
3
|
-
Version: 0.0
|
4
|
-
Summary:
|
5
|
-
|
6
|
-
Author: Anthony Lavertu
|
7
|
-
Author-email: alavertu2@gmail.com
|
3
|
+
Version: 0.2.0
|
4
|
+
Summary: Organize your research project like a pro with Deepboard
|
5
|
+
Project-URL: Homepage, https://github.com/anthol42/deepboard
|
8
6
|
Project-URL: Issues, https://github.com/anthol42/deepboard/issues
|
9
|
-
|
10
|
-
|
11
|
-
Classifier: Operating System :: POSIX :: Linux
|
12
|
-
Classifier: Operating System :: MacOS
|
7
|
+
Author-email: Anthony Lavertu <alavertu2@gmail.com>
|
8
|
+
Keywords: board,deep,deepboard,jax,pytorch,tensorboard,tensorflow,torch
|
13
9
|
Classifier: Development Status :: 4 - Beta
|
14
|
-
Classifier: Intended Audience :: Science/Research
|
15
10
|
Classifier: Intended Audience :: Education
|
11
|
+
Classifier: Intended Audience :: Science/Research
|
12
|
+
Classifier: Operating System :: MacOS
|
13
|
+
Classifier: Operating System :: POSIX :: Linux
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
16
15
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
17
|
-
Requires-Python: >=3.
|
18
|
-
|
19
|
-
Requires-Dist: python-fasthtml
|
20
|
-
Requires-Dist: fh-plotly
|
21
|
-
Requires-Dist: MarkupSafe
|
16
|
+
Requires-Python: >=3.10
|
17
|
+
Requires-Dist: matplotlib
|
22
18
|
Requires-Dist: pandas
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
Dynamic: keywords
|
30
|
-
Dynamic: project-url
|
31
|
-
Dynamic: requires-dist
|
32
|
-
Dynamic: requires-python
|
33
|
-
Dynamic: summary
|
19
|
+
Requires-Dist: pillow
|
20
|
+
Provides-Extra: full
|
21
|
+
Requires-Dist: fh-plotly; extra == 'full'
|
22
|
+
Requires-Dist: markupsafe; extra == 'full'
|
23
|
+
Requires-Dist: python-fasthtml; extra == 'full'
|
24
|
+
Description-Content-Type: text/markdown
|
34
25
|
|
35
26
|
# Deepboard
|
36
27
|
This package include two modules that are work together:
|
@@ -41,8 +32,13 @@ implement a webUI to visualize the training details and training
|
|
41
32
|
curves of any runs. In addition, it lets you commpare training curves
|
42
33
|
between runs. You can even download the charts that you have generated:)
|
43
34
|
## 🔥 Screenshots 🔥
|
44
|
-

|
36
|
+
|
37
|
+
|
38
|
+

|
39
|
+
|
40
|
+
|
41
|
+

|
46
42
|
## 🌟 Project Philosophy
|
47
43
|
Before diving in, it’s important to understand the philosophy behind this project. In deep learning, it’s easy to get
|
48
44
|
swept up in the excitement — experimenting with countless configurations in search of the perfect setup. 🔬✨
|
@@ -98,10 +94,16 @@ If you're feeling a bit overwhelmed or would like a project example, the
|
|
98
94
|
default template implements this philosophy, including the resultTable, making it a great starting point! 🚀
|
99
95
|
|
100
96
|
## 🛠️ Installation
|
97
|
+
To install only the `resultTable` module, which allows you to log your results inside a single file, you can run:
|
101
98
|
```shell
|
102
99
|
pip install deepboard
|
103
100
|
```
|
104
101
|
|
102
|
+
To also install the `GUI` module, which allows you to visualize your results in a web UI, you can run:
|
103
|
+
```shell
|
104
|
+
pip install deepboard[full]
|
105
|
+
```
|
106
|
+
|
105
107
|
## 🚀 How to Use
|
106
108
|
For your project, you will only need the `resultTable` module, as the `deepboard` module is primarily for the UI.
|
107
109
|
|
@@ -159,4 +161,4 @@ resultSocket.write_result(accuracy=accuracies.mean(), crossEntropy=losses.mean()
|
|
159
161
|
To launch deepboard Web UI, simply run the command `deepboard` in your terminal with the path to your resultTable db:
|
160
162
|
```shell
|
161
163
|
deepboard /path/to/resultTable.db
|
162
|
-
```
|
164
|
+
```
|
@@ -8,7 +8,12 @@ curves of any runs. In addition, it lets you commpare training curves
|
|
8
8
|
between runs. You can even download the charts that you have generated:)
|
9
9
|
## 🔥 Screenshots 🔥
|
10
10
|

|
11
|
+
|
12
|
+
|
11
13
|

|
14
|
+
|
15
|
+
|
16
|
+

|
12
17
|
## 🌟 Project Philosophy
|
13
18
|
Before diving in, it’s important to understand the philosophy behind this project. In deep learning, it’s easy to get
|
14
19
|
swept up in the excitement — experimenting with countless configurations in search of the perfect setup. 🔬✨
|
@@ -64,10 +69,16 @@ If you're feeling a bit overwhelmed or would like a project example, the
|
|
64
69
|
default template implements this philosophy, including the resultTable, making it a great starting point! 🚀
|
65
70
|
|
66
71
|
## 🛠️ Installation
|
72
|
+
To install only the `resultTable` module, which allows you to log your results inside a single file, you can run:
|
67
73
|
```shell
|
68
74
|
pip install deepboard
|
69
75
|
```
|
70
76
|
|
77
|
+
To also install the `GUI` module, which allows you to visualize your results in a web UI, you can run:
|
78
|
+
```shell
|
79
|
+
pip install deepboard[full]
|
80
|
+
```
|
81
|
+
|
71
82
|
## 🚀 How to Use
|
72
83
|
For your project, you will only need the `resultTable` module, as the `deepboard` module is primarily for the UI.
|
73
84
|
|
@@ -0,0 +1,108 @@
|
|
1
|
+
/*
|
2
|
+
This css file contains classes for all artefacts tabs:
|
3
|
+
- Images
|
4
|
+
- Figures
|
5
|
+
- Text
|
6
|
+
- Html fragments
|
7
|
+
*/
|
8
|
+
|
9
|
+
.artefact-split-select{
|
10
|
+
appearance: none;
|
11
|
+
background-color: inherit;
|
12
|
+
color: var(--sp-color);
|
13
|
+
border: none;
|
14
|
+
/*border-bottom: var(--artefacts-split-option-border);*/
|
15
|
+
padding-left: 36px;
|
16
|
+
padding-right: 24px;
|
17
|
+
margin-bottom: 0;
|
18
|
+
font-size: 1.75em;
|
19
|
+
font-weight: bold;
|
20
|
+
outline: none;
|
21
|
+
transition: border 0.1s ease, box-shadow 0.1s ease;
|
22
|
+
cursor: pointer;
|
23
|
+
|
24
|
+
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");
|
25
|
+
background-repeat: no-repeat;
|
26
|
+
background-position: left 10px center;
|
27
|
+
background-size: 12px;
|
28
|
+
}
|
29
|
+
.artefact-split-option{
|
30
|
+
/* Empty for now */
|
31
|
+
}
|
32
|
+
|
33
|
+
.artefact-stats-column{
|
34
|
+
/* Nothing here yet */
|
35
|
+
}
|
36
|
+
|
37
|
+
.artefact-card-header{
|
38
|
+
display: flex;
|
39
|
+
flex-direction: row;
|
40
|
+
width: 100%;
|
41
|
+
justify-content: space-between;
|
42
|
+
padding-bottom: 1em;
|
43
|
+
border-bottom: var(--artefacts-header-line)
|
44
|
+
}
|
45
|
+
|
46
|
+
.artefact-card{
|
47
|
+
background-color: var(--artefacts-card-bg);
|
48
|
+
box-shadow: var(--artefacts-card-shadow);
|
49
|
+
padding: 1em;
|
50
|
+
border-radius: var(--artefacts-card-radius);
|
51
|
+
display: flex;
|
52
|
+
flex-direction: column;
|
53
|
+
/*Margin top: 1em and bottom: 1em. 0 otherwise*/
|
54
|
+
margin-bottom: 2em;
|
55
|
+
}
|
56
|
+
|
57
|
+
.artefact-group-container{
|
58
|
+
margin-top: 1em;
|
59
|
+
display: flex;
|
60
|
+
flex-direction: row;
|
61
|
+
flex-wrap: wrap;
|
62
|
+
gap: 1em;
|
63
|
+
justify-content: space-evenly;
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
.image{
|
68
|
+
width: var(--artefacts-image_size);
|
69
|
+
height: var(--artefacts-image_size);
|
70
|
+
display: inline-block;
|
71
|
+
overflow: hidden;
|
72
|
+
}
|
73
|
+
|
74
|
+
.interactive-image-container{
|
75
|
+
width: 92vw;
|
76
|
+
height: 100vh;
|
77
|
+
overflow: hidden;
|
78
|
+
margin: 20px auto;
|
79
|
+
background: inherit;
|
80
|
+
}
|
81
|
+
.interactive-image{
|
82
|
+
width: 100%;
|
83
|
+
height: 100%;
|
84
|
+
/*transition: transform 0.1s ease;*/
|
85
|
+
transform-origin: center center;
|
86
|
+
}
|
87
|
+
|
88
|
+
.interactive-image img {
|
89
|
+
object-fit: contain;
|
90
|
+
display: block;
|
91
|
+
}
|
92
|
+
|
93
|
+
.fragment-text-container {
|
94
|
+
background-color: var(--fv-bg);
|
95
|
+
padding: 1em;
|
96
|
+
border-radius: 0.25em;
|
97
|
+
overflow: auto;
|
98
|
+
width: 100%;
|
99
|
+
}
|
100
|
+
|
101
|
+
.fragment-text{
|
102
|
+
margin: 0;
|
103
|
+
padding: 0.5em;
|
104
|
+
font-size: 0.8rem;
|
105
|
+
color: var(--artefacts-text-color);
|
106
|
+
font-family: var(--artefacts-text-font), monospace;
|
107
|
+
white-space: pre-wrap;
|
108
|
+
}
|
@@ -82,9 +82,11 @@ body {
|
|
82
82
|
|
83
83
|
|
84
84
|
.copy-container {
|
85
|
+
width: 100%;
|
85
86
|
position: relative;
|
86
87
|
display: inline-flex;
|
87
88
|
align-items: center;
|
89
|
+
justify-content: space-between;
|
88
90
|
gap: 8px;
|
89
91
|
cursor: pointer;
|
90
92
|
padding: 0;
|
@@ -165,4 +167,42 @@ body {
|
|
165
167
|
display: flex;
|
166
168
|
justify-content: center; /* Horizontal centering */
|
167
169
|
align-items: center; /* Vertical centering */
|
170
|
+
}
|
171
|
+
|
172
|
+
.expand {
|
173
|
+
display: flex;
|
174
|
+
width: 100%;
|
175
|
+
justify-content: space-between;
|
176
|
+
}
|
177
|
+
|
178
|
+
img {
|
179
|
+
object-fit: contain;
|
180
|
+
width: 100%;
|
181
|
+
height: 100%;
|
182
|
+
/* Scale without interpolation */
|
183
|
+
image-rendering: pixelated; /* Modern browsers */
|
184
|
+
image-rendering: -moz-crisp-edges; /* Firefox fallback */
|
185
|
+
image-rendering: crisp-edges; /* Webkit fallback */
|
186
|
+
}
|
187
|
+
|
188
|
+
.modal-overlay{
|
189
|
+
position: fixed;
|
190
|
+
top: 0;
|
191
|
+
left: 0;
|
192
|
+
width: 100vw;
|
193
|
+
height: 100vh;
|
194
|
+
background-color: rgba(0, 0, 0, 0.75);
|
195
|
+
z-index: 999; /* Ensure it covers other content */
|
196
|
+
}
|
197
|
+
.modal-overlay.hidden{
|
198
|
+
display: none;
|
199
|
+
}
|
200
|
+
.modal{
|
201
|
+
width: 100%;
|
202
|
+
height: 100%;
|
203
|
+
display: flex;
|
204
|
+
flex-direction: column;
|
205
|
+
justify-content: center;
|
206
|
+
/* Center content vertically */
|
207
|
+
align-items: center;
|
168
208
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
.right-panel {
|
3
3
|
position: relative;
|
4
4
|
width: 100%;
|
5
5
|
display: flex;
|
@@ -7,6 +7,10 @@
|
|
7
7
|
align-items: center;
|
8
8
|
}
|
9
9
|
|
10
|
+
.right-panel-closed{
|
11
|
+
width: 0;
|
12
|
+
visibility: hidden;
|
13
|
+
}
|
10
14
|
.right-panel-placeholder {
|
11
15
|
color: var(--secondary-text-color);
|
12
16
|
font-size: 1.1rem;
|
@@ -32,8 +36,8 @@
|
|
32
36
|
display: flex;
|
33
37
|
height: 100%;
|
34
38
|
width: 100%;
|
35
|
-
|
36
|
-
|
39
|
+
max-width: 49vw;
|
40
|
+
justify-content: right;
|
37
41
|
padding-top: 2rem;
|
38
42
|
}
|
39
43
|
|
@@ -48,6 +52,8 @@ margin: 0;
|
|
48
52
|
display: flex;
|
49
53
|
margin-bottom: 0;
|
50
54
|
margin-top: 1rem;
|
55
|
+
max-width: 98%;
|
56
|
+
overflow-x: auto;
|
51
57
|
}
|
52
58
|
|
53
59
|
.tab {
|
@@ -57,7 +63,6 @@ margin: 0;
|
|
57
63
|
color: var(--sp-color);
|
58
64
|
border-top-left-radius: 10px;
|
59
65
|
border-top-right-radius: 10px;
|
60
|
-
margin-right: 4px;
|
61
66
|
transition: background-color 0.2s ease;
|
62
67
|
}
|
63
68
|
|
@@ -75,9 +80,9 @@ margin: 0;
|
|
75
80
|
border-top: none;
|
76
81
|
border-radius: 0 10px 10px 10px;
|
77
82
|
color: var(--sp-color);
|
78
|
-
width: 100%;
|
79
83
|
height: 100%;
|
80
84
|
overflow-y: auto;
|
85
|
+
overflow-x: hidden;
|
81
86
|
}
|
82
87
|
|
83
88
|
.right-panel-content{
|
@@ -3,8 +3,8 @@
|
|
3
3
|
--background-color: #121212;
|
4
4
|
--text_color: #e0e0e0;
|
5
5
|
--secondary-text-color: #ccc;
|
6
|
-
--primary-color: #
|
7
|
-
--primary-color-hover: #
|
6
|
+
--primary-color: #50A76F;
|
7
|
+
--primary-color-hover: #6FBF91;
|
8
8
|
--button-shadow-color: rgba(255, 255, 255, 0.15);
|
9
9
|
|
10
10
|
--success-color: #4caf50;
|
@@ -66,6 +66,15 @@
|
|
66
66
|
--chart-disabled-color: #555;
|
67
67
|
--chart-typebox-shadow: 0 0 6px rgba(30, 144, 255, 0.5);
|
68
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
|
+
|
69
78
|
/*Compare page*/
|
70
79
|
--cmp-card-bg: #2a2a2a;
|
71
80
|
--cmp-card-shadow: 0 1px 7px 0.5px rgba(255, 255, 255, 0.2);
|
@@ -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 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
|
+
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
|
+
)
|
@@ -4,6 +4,13 @@ import sys
|
|
4
4
|
|
5
5
|
|
6
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
|
+
)
|
7
14
|
if os.path.dirname(__file__) not in sys.path:
|
8
15
|
sys.path.insert(0, os.path.dirname(__file__))
|
9
16
|
script_path = os.path.join(os.path.dirname(__file__), "main.py")
|