workbench 0.8.219__py3-none-any.whl → 0.8.231__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.
- workbench/__init__.py +1 -0
- workbench/algorithms/dataframe/__init__.py +2 -0
- workbench/algorithms/dataframe/compound_dataset_overlap.py +321 -0
- workbench/algorithms/dataframe/fingerprint_proximity.py +190 -31
- workbench/algorithms/dataframe/projection_2d.py +8 -2
- workbench/algorithms/dataframe/proximity.py +3 -0
- workbench/algorithms/dataframe/smart_aggregator.py +161 -0
- workbench/algorithms/sql/column_stats.py +0 -1
- workbench/algorithms/sql/correlations.py +0 -1
- workbench/algorithms/sql/descriptive_stats.py +0 -1
- workbench/api/feature_set.py +0 -1
- workbench/api/meta.py +0 -1
- workbench/cached/cached_meta.py +0 -1
- workbench/cached/cached_model.py +37 -7
- workbench/core/artifacts/endpoint_core.py +12 -2
- workbench/core/artifacts/feature_set_core.py +238 -225
- workbench/core/cloud_platform/cloud_meta.py +0 -1
- workbench/core/transforms/features_to_model/features_to_model.py +2 -8
- workbench/core/transforms/model_to_endpoint/model_to_endpoint.py +2 -0
- workbench/model_script_utils/model_script_utils.py +30 -0
- workbench/model_script_utils/uq_harness.py +0 -1
- workbench/model_scripts/chemprop/chemprop.template +196 -68
- workbench/model_scripts/chemprop/generated_model_script.py +197 -72
- workbench/model_scripts/chemprop/model_script_utils.py +30 -0
- workbench/model_scripts/custom_models/chem_info/mol_descriptors.py +0 -1
- workbench/model_scripts/custom_models/chem_info/molecular_descriptors.py +0 -1
- workbench/model_scripts/custom_models/chem_info/morgan_fingerprints.py +0 -1
- workbench/model_scripts/pytorch_model/generated_model_script.py +52 -34
- workbench/model_scripts/pytorch_model/model_script_utils.py +30 -0
- workbench/model_scripts/pytorch_model/pytorch.template +47 -29
- workbench/model_scripts/pytorch_model/uq_harness.py +0 -1
- workbench/model_scripts/script_generation.py +0 -1
- workbench/model_scripts/xgb_model/generated_model_script.py +3 -3
- workbench/model_scripts/xgb_model/model_script_utils.py +30 -0
- workbench/model_scripts/xgb_model/uq_harness.py +0 -1
- workbench/scripts/ml_pipeline_sqs.py +71 -2
- workbench/themes/dark/custom.css +85 -8
- workbench/themes/dark/plotly.json +6 -6
- workbench/themes/light/custom.css +172 -64
- workbench/themes/light/plotly.json +9 -9
- workbench/themes/midnight_blue/custom.css +82 -29
- workbench/themes/midnight_blue/plotly.json +1 -1
- workbench/utils/aws_utils.py +0 -1
- workbench/utils/chem_utils/mol_descriptors.py +0 -1
- workbench/utils/chem_utils/projections.py +16 -6
- workbench/utils/chem_utils/vis.py +137 -27
- workbench/utils/clientside_callbacks.py +41 -0
- workbench/utils/markdown_utils.py +57 -0
- workbench/utils/model_utils.py +0 -1
- workbench/utils/pipeline_utils.py +0 -1
- workbench/utils/plot_utils.py +52 -36
- workbench/utils/theme_manager.py +95 -30
- workbench/web_interface/components/experiments/outlier_plot.py +0 -1
- workbench/web_interface/components/model_plot.py +2 -0
- workbench/web_interface/components/plugin_unit_test.py +0 -1
- workbench/web_interface/components/plugins/ag_table.py +2 -4
- workbench/web_interface/components/plugins/confusion_matrix.py +3 -6
- workbench/web_interface/components/plugins/model_details.py +10 -6
- workbench/web_interface/components/plugins/scatter_plot.py +184 -85
- workbench/web_interface/components/settings_menu.py +185 -0
- workbench/web_interface/page_views/main_page.py +0 -1
- {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/METADATA +34 -41
- {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/RECORD +67 -69
- {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/WHEEL +1 -1
- workbench/themes/quartz/base_css.url +0 -1
- workbench/themes/quartz/custom.css +0 -117
- workbench/themes/quartz/plotly.json +0 -642
- workbench/themes/quartz_dark/base_css.url +0 -1
- workbench/themes/quartz_dark/custom.css +0 -131
- workbench/themes/quartz_dark/plotly.json +0 -642
- {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/entry_points.txt +0 -0
- {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/licenses/LICENSE +0 -0
- {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/top_level.txt +0 -0
|
@@ -1,17 +1,79 @@
|
|
|
1
|
+
/* Light Theme Color Palette - Blue-Purple Blend */
|
|
2
|
+
:root {
|
|
3
|
+
/* Primary colors - blue to purple blend, low saturation */
|
|
4
|
+
--wb-lightest: rgb(215, 218, 225); /* Light blue-lavender - backgrounds */
|
|
5
|
+
--wb-light: rgb(210, 213, 220); /* Slightly lighter - alternate rows */
|
|
6
|
+
--wb-medium: rgb(175, 185, 215); /* Medium blue-purple - headers */
|
|
7
|
+
--wb-accent: rgb(120, 130, 180); /* Blue-purple accent - borders */
|
|
8
|
+
--wb-dark: rgb(80, 90, 140); /* Dark blue-purple - strong accents */
|
|
9
|
+
|
|
10
|
+
/* Text colors */
|
|
11
|
+
--wb-text-primary: rgb(45, 45, 55); /* Primary text */
|
|
12
|
+
--wb-text-bold: rgb(80, 80, 180); /* Bold text */
|
|
13
|
+
--wb-text-italic: rgb(120, 80, 180); /* Italic text */
|
|
14
|
+
--wb-text-muted: rgb(95, 100, 120); /* Muted text */
|
|
15
|
+
|
|
16
|
+
/* Semantic colors */
|
|
17
|
+
--wb-success: rgb(40, 110, 50);
|
|
18
|
+
--wb-info: rgb(60, 80, 160);
|
|
19
|
+
--wb-warning: rgb(170, 90, 10);
|
|
20
|
+
--wb-danger: rgb(180, 50, 80);
|
|
21
|
+
--wb-pink: rgb(200, 100, 200);
|
|
22
|
+
|
|
23
|
+
/* Shadows */
|
|
24
|
+
--wb-shadow: rgba(80, 80, 80, 0.15);
|
|
25
|
+
|
|
26
|
+
/* Dropdown/form colors */
|
|
27
|
+
--wb-dropdown-bg: rgba(215, 215, 215);
|
|
28
|
+
--wb-dropdown-focus: rgba(215, 215, 215);
|
|
29
|
+
--wb-dropdown-hover: rgba(215, 215, 215);
|
|
30
|
+
|
|
31
|
+
/* Container colors */
|
|
32
|
+
--wb-container-bg: rgb(215, 218, 225);
|
|
33
|
+
--wb-table-cell-bg: rgb(215, 218, 225);
|
|
34
|
+
|
|
35
|
+
/* Body gradient colors */
|
|
36
|
+
--wb-body-gradient-start: rgb(180, 195, 215);
|
|
37
|
+
--wb-body-gradient-end: rgb(195, 205, 220);
|
|
38
|
+
|
|
39
|
+
/* Table header gradient colors */
|
|
40
|
+
--wb-header-red-start: rgb(200, 120, 120);
|
|
41
|
+
--wb-header-red-end: rgb(160, 90, 90);
|
|
42
|
+
--wb-header-yellow-start: rgb(180, 175, 100);
|
|
43
|
+
--wb-header-yellow-end: rgb(140, 135, 70);
|
|
44
|
+
--wb-header-green-start: rgb(110, 170, 110);
|
|
45
|
+
--wb-header-green-end: rgb(80, 130, 80);
|
|
46
|
+
--wb-header-purple-start: rgb(160, 120, 180);
|
|
47
|
+
--wb-header-purple-end: rgb(120, 85, 140);
|
|
48
|
+
}
|
|
49
|
+
|
|
1
50
|
h1, h2, h3, h4 {
|
|
2
|
-
color:
|
|
51
|
+
color: var(--wb-text-primary);
|
|
3
52
|
}
|
|
4
53
|
|
|
5
54
|
body {
|
|
6
|
-
color:
|
|
7
|
-
|
|
8
|
-
/* background: linear-gradient(90deg, rgba(200,200,220,1) 0%, rgba(150,150,195,1) 100%); */
|
|
9
|
-
background: linear-gradient(90deg, rgba(200,200,220,1) 0%, rgba(170,170,210,1) 100%);
|
|
55
|
+
color: var(--wb-text-primary);
|
|
56
|
+
background: linear-gradient(90deg, var(--wb-body-gradient-start) 0%, var(--wb-body-gradient-end) 100%);
|
|
10
57
|
}
|
|
11
58
|
|
|
12
59
|
/* Custom CSS to style bold text */
|
|
13
60
|
b, strong {
|
|
14
|
-
color:
|
|
61
|
+
color: var(--wb-text-bold);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Custom CSS to style italic text */
|
|
65
|
+
i, em {
|
|
66
|
+
color: var(--wb-text-italic);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* Default link color */
|
|
70
|
+
a {
|
|
71
|
+
color: rgb(40, 80, 200); /* Electric blue for links */
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Hover effect */
|
|
75
|
+
a:hover {
|
|
76
|
+
color: rgb(60, 100, 240); /* Brighter blue on hover */
|
|
15
77
|
}
|
|
16
78
|
|
|
17
79
|
/* Reduce spacing around lists */
|
|
@@ -25,104 +87,125 @@ ul, ol {
|
|
|
25
87
|
|
|
26
88
|
/* AgGrid custom CSS */
|
|
27
89
|
|
|
28
|
-
/*
|
|
29
|
-
|
|
30
|
-
--ag-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
background-color:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
90
|
+
/* AG Grid 33+ uses CSS variables for theming - set them at the theme level */
|
|
91
|
+
[class*="ag-theme-"] {
|
|
92
|
+
--ag-background-color: var(--wb-lightest);
|
|
93
|
+
--ag-odd-row-background-color: var(--wb-lightest);
|
|
94
|
+
--ag-row-background-color: var(--wb-light);
|
|
95
|
+
--ag-selected-row-background-color: var(--wb-medium);
|
|
96
|
+
--ag-row-hover-color: var(--wb-light);
|
|
97
|
+
--ag-header-background-color: var(--wb-medium);
|
|
98
|
+
--ag-border-color: var(--wb-accent);
|
|
99
|
+
--ag-foreground-color: var(--wb-text-primary);
|
|
100
|
+
--ag-header-foreground-color: var(--wb-text-primary);
|
|
101
|
+
|
|
102
|
+
/* Box shadow and rounded corners */
|
|
103
|
+
box-shadow: 2px 2px 6px 5px var(--wb-shadow);
|
|
104
|
+
border-radius: 12px;
|
|
105
|
+
border: 0.5px solid var(--wb-accent);
|
|
106
|
+
margin: 0;
|
|
107
|
+
padding: 0;
|
|
46
108
|
}
|
|
47
109
|
|
|
48
|
-
/*
|
|
110
|
+
/* Remove border from the grid wrapper */
|
|
49
111
|
.ag-root-wrapper {
|
|
50
|
-
border: none !important;
|
|
112
|
+
border: none !important;
|
|
51
113
|
}
|
|
52
114
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
border-radius: 12px; /* Rounded corners */
|
|
58
|
-
border: 0.5px solid rgba(0, 0, 205, 0.5);
|
|
59
|
-
margin: 0;
|
|
60
|
-
padding: 0;
|
|
115
|
+
/* AG Grid container - remove padding but allow shadow overflow */
|
|
116
|
+
div:has(> [class*="ag-theme-"]) {
|
|
117
|
+
padding: 0 !important;
|
|
118
|
+
overflow: visible !important;
|
|
61
119
|
}
|
|
62
120
|
|
|
63
121
|
/* Apply styling to Workbench containers */
|
|
64
122
|
.workbench-container {
|
|
65
|
-
background-color:
|
|
66
|
-
box-shadow: 2px 2px 6px 5px
|
|
67
|
-
border-radius: 12px;
|
|
123
|
+
background-color: var(--wb-container-bg);
|
|
124
|
+
box-shadow: 2px 2px 6px 5px var(--wb-shadow);
|
|
125
|
+
border-radius: 12px;
|
|
68
126
|
}
|
|
69
127
|
|
|
70
128
|
/* Apply styling to Workbench Offsets */
|
|
71
129
|
.workbench-offset {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
border-radius: 12px; /* Rounded corners */
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/* Apply styling to Workbench Highlight */
|
|
78
|
-
.workbench-highlight {
|
|
79
|
-
background-color: rgba(240, 240, 240, 0.5);
|
|
80
|
-
box-shadow: 1px 1px 3px 2px rgba(0, 0, 0, 0.2);
|
|
81
|
-
border-radius: 12px; /* Rounded corners */
|
|
130
|
+
box-shadow: 1px 1px 3px 2px var(--wb-shadow);
|
|
131
|
+
border-radius: 12px;
|
|
82
132
|
}
|
|
83
133
|
|
|
84
134
|
/* Apply styling to custom tooltips */
|
|
85
135
|
.custom-tooltip {
|
|
86
|
-
background-color:
|
|
87
|
-
box-shadow: 2px 2px 6px 5px
|
|
88
|
-
border-radius: 25px;
|
|
89
|
-
overflow: hidden;
|
|
90
|
-
border: 2px solid
|
|
136
|
+
background-color: var(--wb-lightest);
|
|
137
|
+
box-shadow: 2px 2px 6px 5px var(--wb-shadow);
|
|
138
|
+
border-radius: 25px;
|
|
139
|
+
overflow: hidden;
|
|
140
|
+
border: 2px solid var(--wb-accent);
|
|
91
141
|
}
|
|
92
142
|
|
|
93
143
|
/* Some of the HTML/Markdown will use color hints like 'green-text' or 'blue-text' */
|
|
94
144
|
.green-text {
|
|
95
|
-
color:
|
|
145
|
+
color: var(--wb-success);
|
|
96
146
|
}
|
|
97
147
|
|
|
98
148
|
.blue-text {
|
|
99
|
-
color:
|
|
149
|
+
color: var(--wb-info);
|
|
100
150
|
}
|
|
101
151
|
|
|
102
152
|
.pink-text {
|
|
103
|
-
color:
|
|
153
|
+
color: var(--wb-pink);
|
|
104
154
|
}
|
|
105
155
|
|
|
106
156
|
.red-text {
|
|
107
|
-
color:
|
|
157
|
+
color: var(--wb-danger);
|
|
108
158
|
}
|
|
109
159
|
|
|
110
160
|
.orange-text {
|
|
111
|
-
color:
|
|
161
|
+
color: var(--wb-warning);
|
|
112
162
|
}
|
|
113
163
|
|
|
114
164
|
.alert {
|
|
115
|
-
color:
|
|
165
|
+
color: var(--wb-danger);
|
|
116
166
|
}
|
|
117
167
|
|
|
118
168
|
.warning {
|
|
119
|
-
color:
|
|
169
|
+
color: var(--wb-warning);
|
|
120
170
|
}
|
|
121
171
|
|
|
122
172
|
.good {
|
|
123
|
-
color:
|
|
173
|
+
color: var(--wb-success);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Dropdown styling (dcc.Dropdown) - override Bootstrap's variables */
|
|
177
|
+
.dash-dropdown {
|
|
178
|
+
--bs-body-bg: var(--wb-dropdown-bg);
|
|
179
|
+
--bs-body-color: var(--wb-text-primary);
|
|
180
|
+
--bs-border-color: var(--wb-accent);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* Bootstrap form controls (dbc components) */
|
|
184
|
+
.form-select, .form-control {
|
|
185
|
+
background-color: var(--wb-dropdown-bg) !important;
|
|
186
|
+
border: 1px solid var(--wb-accent) !important;
|
|
187
|
+
color: var(--wb-text-primary) !important;
|
|
124
188
|
}
|
|
125
189
|
|
|
190
|
+
.form-select:focus, .form-control:focus {
|
|
191
|
+
background-color: var(--wb-dropdown-focus) !important;
|
|
192
|
+
border-color: var(--wb-dark) !important;
|
|
193
|
+
box-shadow: 0 0 0 0.2rem var(--wb-shadow) !important;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.dropdown-menu {
|
|
197
|
+
background-color: var(--wb-dropdown-bg) !important;
|
|
198
|
+
border: 1px solid var(--wb-accent) !important;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.dropdown-item {
|
|
202
|
+
color: var(--wb-text-primary) !important;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.dropdown-item:hover, .dropdown-item:focus {
|
|
206
|
+
background-color: var(--wb-dropdown-hover) !important;
|
|
207
|
+
color: var(--wb-text-primary) !important;
|
|
208
|
+
}
|
|
126
209
|
|
|
127
210
|
/* Table styling */
|
|
128
211
|
table {
|
|
@@ -131,15 +214,40 @@ table {
|
|
|
131
214
|
|
|
132
215
|
th {
|
|
133
216
|
padding: 10px;
|
|
134
|
-
border: 1px solid
|
|
135
|
-
background-color:
|
|
217
|
+
border: 1px solid var(--wb-accent);
|
|
218
|
+
background-color: var(--wb-medium);
|
|
136
219
|
font-weight: bold;
|
|
137
220
|
text-align: center !important;
|
|
138
221
|
}
|
|
139
222
|
|
|
140
223
|
td {
|
|
141
224
|
padding: 5px;
|
|
142
|
-
border: 0.5px solid
|
|
143
|
-
background-color:
|
|
225
|
+
border: 0.5px solid var(--wb-accent);
|
|
226
|
+
background-color: var(--wb-table-cell-bg);
|
|
144
227
|
text-align: center !important;
|
|
145
228
|
}
|
|
229
|
+
|
|
230
|
+
/* AG Grid table header colors - gradient theme */
|
|
231
|
+
/* Data Sources tables - red gradient */
|
|
232
|
+
#main_data_sources .ag-header,
|
|
233
|
+
#data_sources_table .ag-header {
|
|
234
|
+
background: linear-gradient(180deg, var(--wb-header-red-start) 0%, var(--wb-header-red-end) 100%) !important;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* Feature Sets tables - yellow/olive gradient */
|
|
238
|
+
#main_feature_sets .ag-header,
|
|
239
|
+
#feature_sets_table .ag-header {
|
|
240
|
+
background: linear-gradient(180deg, var(--wb-header-yellow-start) 0%, var(--wb-header-yellow-end) 100%) !important;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* Models tables - green gradient */
|
|
244
|
+
#main_models .ag-header,
|
|
245
|
+
#models_table .ag-header {
|
|
246
|
+
background: linear-gradient(180deg, var(--wb-header-green-start) 0%, var(--wb-header-green-end) 100%) !important;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/* Endpoints tables - purple gradient */
|
|
250
|
+
#main_endpoints .ag-header,
|
|
251
|
+
#endpoints_table .ag-header {
|
|
252
|
+
background: linear-gradient(180deg, var(--wb-header-purple-start) 0%, var(--wb-header-purple-end) 100%) !important;
|
|
253
|
+
}
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
"ticks": ""
|
|
134
134
|
},
|
|
135
135
|
"colorscale": [
|
|
136
|
-
[0.0, "
|
|
136
|
+
[0.0, "rgba(100, 100, 200, 0.8)"],
|
|
137
137
|
[0.4, "rgb(100, 200, 100)"],
|
|
138
138
|
[0.65, "rgb(170, 170, 50)"],
|
|
139
139
|
[0.85, "rgb(200, 100, 100)"],
|
|
@@ -476,14 +476,14 @@
|
|
|
476
476
|
},
|
|
477
477
|
"colorscale": {
|
|
478
478
|
"diverging": [
|
|
479
|
-
[0.0, "
|
|
479
|
+
[0.0, "rgba(100, 100, 255, 0.8)"],
|
|
480
480
|
[0.4, "rgb(100, 240, 100)"],
|
|
481
481
|
[0.65, "rgb(200, 200, 50)"],
|
|
482
482
|
[0.85, "rgb(255, 100, 100)"],
|
|
483
483
|
[1.0, "rgb(255, 100, 100)"]
|
|
484
484
|
],
|
|
485
485
|
"sequential": [
|
|
486
|
-
[0.0, "
|
|
486
|
+
[0.0, "rgba(100, 100, 200, 0.8)"],
|
|
487
487
|
[0.4, "rgb(100, 200, 100)"],
|
|
488
488
|
[0.65, "rgb(170, 170, 50)"],
|
|
489
489
|
[0.85, "rgb(200, 100, 100)"],
|
|
@@ -561,8 +561,8 @@
|
|
|
561
561
|
"mapbox": {
|
|
562
562
|
"style": "light"
|
|
563
563
|
},
|
|
564
|
-
"paper_bgcolor": "rgba(
|
|
565
|
-
"plot_bgcolor": "rgba(
|
|
564
|
+
"paper_bgcolor": "rgba(255, 255, 255, 0.0)",
|
|
565
|
+
"plot_bgcolor": "rgba(255, 255, 255, 0.0)",
|
|
566
566
|
"polar": {
|
|
567
567
|
"angularaxis": {
|
|
568
568
|
"gridcolor": "#EBF0F8",
|
|
@@ -633,25 +633,25 @@
|
|
|
633
633
|
},
|
|
634
634
|
"xaxis": {
|
|
635
635
|
"automargin": true,
|
|
636
|
-
"gridcolor": "
|
|
636
|
+
"gridcolor": "rgba(120, 130, 160, 0.3)",
|
|
637
637
|
"linecolor": "#EBF0F8",
|
|
638
638
|
"ticks": "",
|
|
639
639
|
"title": {
|
|
640
640
|
"standoff": 15
|
|
641
641
|
},
|
|
642
|
-
"zerolinecolor": "
|
|
642
|
+
"zerolinecolor": "rgba(120, 130, 160, 0.4)",
|
|
643
643
|
"zerolinewidth": 2,
|
|
644
644
|
"gridwidth": 0.5
|
|
645
645
|
},
|
|
646
646
|
"yaxis": {
|
|
647
647
|
"automargin": true,
|
|
648
|
-
"gridcolor": "
|
|
648
|
+
"gridcolor": "rgba(120, 130, 160, 0.3)",
|
|
649
649
|
"linecolor": "#EBF0F8",
|
|
650
650
|
"ticks": "",
|
|
651
651
|
"title": {
|
|
652
652
|
"standoff": 15
|
|
653
653
|
},
|
|
654
|
-
"zerolinecolor": "
|
|
654
|
+
"zerolinecolor": "rgba(120, 130, 160, 0.4)",
|
|
655
655
|
"zerolinewidth": 2,
|
|
656
656
|
"gridwidth": 0.5
|
|
657
657
|
},
|
|
@@ -37,48 +37,42 @@ a:hover {
|
|
|
37
37
|
|
|
38
38
|
/* AgGrid custom CSS */
|
|
39
39
|
|
|
40
|
-
/*
|
|
41
|
-
|
|
40
|
+
/* AG Grid 33+ uses CSS variables for theming - set them at the theme level */
|
|
41
|
+
[class*="ag-theme-"] {
|
|
42
|
+
--ag-background-color: rgb(54, 55, 88);
|
|
43
|
+
--ag-odd-row-background-color: rgb(54, 55, 88);
|
|
44
|
+
--ag-row-background-color: rgb(58, 59, 92);
|
|
45
|
+
--ag-selected-row-background-color: rgb(32, 75, 105);
|
|
46
|
+
--ag-row-hover-color: rgb(52, 73, 100);
|
|
42
47
|
--ag-header-background-color: rgb(42, 85, 115);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.ag-cell {
|
|
47
|
-
background-color: rgb(57, 63, 96);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/* Alternate row colors */
|
|
51
|
-
.ag-row:nth-child(even) .ag-cell {
|
|
52
|
-
background-color: rgb(62, 68, 101);
|
|
53
|
-
}
|
|
48
|
+
--ag-border-color: rgba(80, 85, 115, 0.5);
|
|
49
|
+
--ag-foreground-color: rgb(210, 210, 210);
|
|
50
|
+
--ag-header-foreground-color: rgb(220, 220, 220);
|
|
54
51
|
|
|
55
|
-
/*
|
|
56
|
-
|
|
57
|
-
|
|
52
|
+
/* Box shadow and rounded corners */
|
|
53
|
+
box-shadow: 2px 2px 6px 5px rgba(0, 0, 0, 0.25);
|
|
54
|
+
border-radius: 12px;
|
|
55
|
+
border: 0.5px solid rgba(0, 0, 0, 0.5);
|
|
56
|
+
margin: 0;
|
|
57
|
+
padding: 0;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
/* There's a one pixel border around the grid that we want to remove */
|
|
60
|
+
/* Remove border from the grid wrapper */
|
|
63
61
|
.ag-root-wrapper {
|
|
64
|
-
border: none !important;
|
|
62
|
+
border: none !important;
|
|
65
63
|
}
|
|
66
64
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
border-radius: 12px; /* Rounded corners */
|
|
72
|
-
border: 0.5px solid rgba(0, 0, 0, 0.5);
|
|
73
|
-
margin: 0;
|
|
74
|
-
padding: 0;
|
|
65
|
+
/* AG Grid container - remove padding but allow shadow overflow */
|
|
66
|
+
div:has(> [class*="ag-theme-"]) {
|
|
67
|
+
padding: 0 !important;
|
|
68
|
+
overflow: visible !important;
|
|
75
69
|
}
|
|
76
70
|
|
|
77
71
|
/* Apply styling to Workbench containers */
|
|
78
72
|
.workbench-container {
|
|
79
73
|
box-shadow: 2px 2px 6px 5px rgba(0, 0, 0, 0.25);
|
|
80
74
|
border-radius: 12px; /* Rounded corners */
|
|
81
|
-
background-color:
|
|
75
|
+
background-color: rgb(54, 55, 88); /* Dark background */
|
|
82
76
|
}
|
|
83
77
|
|
|
84
78
|
/* Apply styling to Workbench Offsets */
|
|
@@ -133,6 +127,40 @@ a:hover {
|
|
|
133
127
|
color: rgb(100, 255, 100);
|
|
134
128
|
}
|
|
135
129
|
|
|
130
|
+
/* Dropdown styling (dcc.Dropdown) - override Bootstrap's --bs-body-bg variable */
|
|
131
|
+
.dash-dropdown {
|
|
132
|
+
--bs-body-bg: rgb(55, 60, 90);
|
|
133
|
+
--bs-border-color: rgb(80, 85, 115);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
/* Bootstrap form controls (dbc components) */
|
|
138
|
+
.form-select, .form-control {
|
|
139
|
+
background-color: rgb(55, 60, 90) !important;
|
|
140
|
+
border: 1px solid rgb(80, 85, 115) !important;
|
|
141
|
+
color: rgb(210, 210, 210) !important;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.form-select:focus, .form-control:focus {
|
|
145
|
+
background-color: rgb(60, 65, 95) !important;
|
|
146
|
+
border-color: rgb(100, 105, 140) !important;
|
|
147
|
+
box-shadow: 0 0 0 0.2rem rgba(100, 105, 140, 0.25) !important;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.dropdown-menu {
|
|
151
|
+
background-color: rgb(55, 60, 90) !important;
|
|
152
|
+
border: 1px solid rgb(80, 85, 115) !important;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.dropdown-item {
|
|
156
|
+
color: rgb(210, 210, 210) !important;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.dropdown-item:hover, .dropdown-item:focus {
|
|
160
|
+
background-color: rgb(70, 75, 110) !important;
|
|
161
|
+
color: rgb(230, 230, 230) !important;
|
|
162
|
+
}
|
|
163
|
+
|
|
136
164
|
/* Table styling */
|
|
137
165
|
table {
|
|
138
166
|
width: 100%;
|
|
@@ -151,4 +179,29 @@ td {
|
|
|
151
179
|
padding: 5px;
|
|
152
180
|
border: 0.5px solid #444;
|
|
153
181
|
text-align: center !important;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* AG Grid table header colors - gradient theme */
|
|
185
|
+
/* Data Sources tables - red gradient */
|
|
186
|
+
#main_data_sources .ag-header,
|
|
187
|
+
#data_sources_table .ag-header {
|
|
188
|
+
background: linear-gradient(180deg, rgb(130, 55, 55) 0%, rgb(80, 35, 35) 100%) !important;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* Feature Sets tables - yellow/olive gradient */
|
|
192
|
+
#main_feature_sets .ag-header,
|
|
193
|
+
#feature_sets_table .ag-header {
|
|
194
|
+
background: linear-gradient(180deg, rgb(110, 105, 50) 0%, rgb(70, 65, 30) 100%) !important;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/* Models tables - green gradient */
|
|
198
|
+
#main_models .ag-header,
|
|
199
|
+
#models_table .ag-header {
|
|
200
|
+
background: linear-gradient(180deg, rgb(50, 100, 50) 0%, rgb(30, 60, 30) 100%) !important;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* Endpoints tables - purple gradient */
|
|
204
|
+
#main_endpoints .ag-header,
|
|
205
|
+
#endpoints_table .ag-header {
|
|
206
|
+
background: linear-gradient(180deg, rgb(90, 55, 110) 0%, rgb(55, 30, 70) 100%) !important;
|
|
154
207
|
}
|
workbench/utils/aws_utils.py
CHANGED
|
@@ -17,7 +17,6 @@ from botocore.exceptions import ClientError
|
|
|
17
17
|
from sagemaker.session import Session as SageSession
|
|
18
18
|
from collections.abc import Mapping, Iterable
|
|
19
19
|
|
|
20
|
-
|
|
21
20
|
# Workbench Imports
|
|
22
21
|
from workbench.utils.config_manager import ConfigManager
|
|
23
22
|
from workbench.utils.deprecated_utils import deprecated
|
|
@@ -99,7 +99,6 @@ from rdkit.ML.Descriptors import MoleculeDescriptors
|
|
|
99
99
|
from mordred import Calculator as MordredCalculator
|
|
100
100
|
from mordred import AcidBase, Aromatic, Constitutional, Chi, CarbonTypes
|
|
101
101
|
|
|
102
|
-
|
|
103
102
|
logger = logging.getLogger("workbench")
|
|
104
103
|
logger.setLevel(logging.DEBUG)
|
|
105
104
|
|
|
@@ -17,18 +17,28 @@ log = logging.getLogger("workbench")
|
|
|
17
17
|
|
|
18
18
|
def fingerprints_to_matrix(fingerprints, dtype=np.uint8):
|
|
19
19
|
"""
|
|
20
|
-
Convert
|
|
20
|
+
Convert fingerprints to numpy matrix.
|
|
21
|
+
|
|
22
|
+
Supports two formats (auto-detected):
|
|
23
|
+
- Bitstrings: "10110010..." → matrix of 0s and 1s
|
|
24
|
+
- Count vectors: "0,3,0,1,5,..." → matrix of counts (or binary if dtype=np.bool_)
|
|
21
25
|
|
|
22
26
|
Args:
|
|
23
|
-
fingerprints: pandas Series or list of
|
|
24
|
-
dtype: numpy data type (uint8 is default
|
|
27
|
+
fingerprints: pandas Series or list of fingerprints
|
|
28
|
+
dtype: numpy data type (uint8 is default; np.bool_ for Jaccard computations)
|
|
25
29
|
|
|
26
30
|
Returns:
|
|
27
31
|
dense numpy array of shape (n_molecules, n_bits)
|
|
28
32
|
"""
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
# Auto-detect format based on first fingerprint
|
|
34
|
+
sample = str(fingerprints.iloc[0] if hasattr(fingerprints, "iloc") else fingerprints[0])
|
|
35
|
+
if "," in sample:
|
|
36
|
+
# Count vector format: comma-separated integers
|
|
37
|
+
matrix = np.array([list(map(int, fp.split(","))) for fp in fingerprints], dtype=dtype)
|
|
38
|
+
else:
|
|
39
|
+
# Bitstring format: each character is a bit
|
|
40
|
+
matrix = np.array([list(fp) for fp in fingerprints], dtype=dtype)
|
|
41
|
+
return matrix
|
|
32
42
|
|
|
33
43
|
|
|
34
44
|
def project_fingerprints(df: pd.DataFrame, projection: str = "UMAP") -> pd.DataFrame:
|