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.
Files changed (73) hide show
  1. workbench/__init__.py +1 -0
  2. workbench/algorithms/dataframe/__init__.py +2 -0
  3. workbench/algorithms/dataframe/compound_dataset_overlap.py +321 -0
  4. workbench/algorithms/dataframe/fingerprint_proximity.py +190 -31
  5. workbench/algorithms/dataframe/projection_2d.py +8 -2
  6. workbench/algorithms/dataframe/proximity.py +3 -0
  7. workbench/algorithms/dataframe/smart_aggregator.py +161 -0
  8. workbench/algorithms/sql/column_stats.py +0 -1
  9. workbench/algorithms/sql/correlations.py +0 -1
  10. workbench/algorithms/sql/descriptive_stats.py +0 -1
  11. workbench/api/feature_set.py +0 -1
  12. workbench/api/meta.py +0 -1
  13. workbench/cached/cached_meta.py +0 -1
  14. workbench/cached/cached_model.py +37 -7
  15. workbench/core/artifacts/endpoint_core.py +12 -2
  16. workbench/core/artifacts/feature_set_core.py +238 -225
  17. workbench/core/cloud_platform/cloud_meta.py +0 -1
  18. workbench/core/transforms/features_to_model/features_to_model.py +2 -8
  19. workbench/core/transforms/model_to_endpoint/model_to_endpoint.py +2 -0
  20. workbench/model_script_utils/model_script_utils.py +30 -0
  21. workbench/model_script_utils/uq_harness.py +0 -1
  22. workbench/model_scripts/chemprop/chemprop.template +196 -68
  23. workbench/model_scripts/chemprop/generated_model_script.py +197 -72
  24. workbench/model_scripts/chemprop/model_script_utils.py +30 -0
  25. workbench/model_scripts/custom_models/chem_info/mol_descriptors.py +0 -1
  26. workbench/model_scripts/custom_models/chem_info/molecular_descriptors.py +0 -1
  27. workbench/model_scripts/custom_models/chem_info/morgan_fingerprints.py +0 -1
  28. workbench/model_scripts/pytorch_model/generated_model_script.py +52 -34
  29. workbench/model_scripts/pytorch_model/model_script_utils.py +30 -0
  30. workbench/model_scripts/pytorch_model/pytorch.template +47 -29
  31. workbench/model_scripts/pytorch_model/uq_harness.py +0 -1
  32. workbench/model_scripts/script_generation.py +0 -1
  33. workbench/model_scripts/xgb_model/generated_model_script.py +3 -3
  34. workbench/model_scripts/xgb_model/model_script_utils.py +30 -0
  35. workbench/model_scripts/xgb_model/uq_harness.py +0 -1
  36. workbench/scripts/ml_pipeline_sqs.py +71 -2
  37. workbench/themes/dark/custom.css +85 -8
  38. workbench/themes/dark/plotly.json +6 -6
  39. workbench/themes/light/custom.css +172 -64
  40. workbench/themes/light/plotly.json +9 -9
  41. workbench/themes/midnight_blue/custom.css +82 -29
  42. workbench/themes/midnight_blue/plotly.json +1 -1
  43. workbench/utils/aws_utils.py +0 -1
  44. workbench/utils/chem_utils/mol_descriptors.py +0 -1
  45. workbench/utils/chem_utils/projections.py +16 -6
  46. workbench/utils/chem_utils/vis.py +137 -27
  47. workbench/utils/clientside_callbacks.py +41 -0
  48. workbench/utils/markdown_utils.py +57 -0
  49. workbench/utils/model_utils.py +0 -1
  50. workbench/utils/pipeline_utils.py +0 -1
  51. workbench/utils/plot_utils.py +52 -36
  52. workbench/utils/theme_manager.py +95 -30
  53. workbench/web_interface/components/experiments/outlier_plot.py +0 -1
  54. workbench/web_interface/components/model_plot.py +2 -0
  55. workbench/web_interface/components/plugin_unit_test.py +0 -1
  56. workbench/web_interface/components/plugins/ag_table.py +2 -4
  57. workbench/web_interface/components/plugins/confusion_matrix.py +3 -6
  58. workbench/web_interface/components/plugins/model_details.py +10 -6
  59. workbench/web_interface/components/plugins/scatter_plot.py +184 -85
  60. workbench/web_interface/components/settings_menu.py +185 -0
  61. workbench/web_interface/page_views/main_page.py +0 -1
  62. {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/METADATA +34 -41
  63. {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/RECORD +67 -69
  64. {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/WHEEL +1 -1
  65. workbench/themes/quartz/base_css.url +0 -1
  66. workbench/themes/quartz/custom.css +0 -117
  67. workbench/themes/quartz/plotly.json +0 -642
  68. workbench/themes/quartz_dark/base_css.url +0 -1
  69. workbench/themes/quartz_dark/custom.css +0 -131
  70. workbench/themes/quartz_dark/plotly.json +0 -642
  71. {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/entry_points.txt +0 -0
  72. {workbench-0.8.219.dist-info → workbench-0.8.231.dist-info}/licenses/LICENSE +0 -0
  73. {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: rgb(80, 80, 80); /* We want the headers dark gray */
51
+ color: var(--wb-text-primary);
3
52
  }
4
53
 
5
54
  body {
6
- color: rgb(80, 80, 80); /* Dark gray text */
7
- /* background: linear-gradient(90deg, rgba(240,240,240,1) 0%, rgba(240,240,240,1) 50%, rgba(150,150,195,1) 100%);*/
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: rgb(40, 40, 40);
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
- /* Adjust header background color */
29
- .ag-header {
30
- --ag-header-background-color: rgba(150, 150, 195);
31
- }
32
-
33
- /* Adjust cell background */
34
- .ag-cell {
35
- background-color: rgb(240, 240, 240);
36
- }
37
-
38
- /* Alternate row colors */
39
- .ag-row:nth-child(even) .ag-cell {
40
- background-color: rgb(230, 230, 230);
41
- }
42
-
43
- /* Selection color for the entire row */
44
- .ag-row.ag-row-selected .ag-cell {
45
- background-color: rgba(170, 170, 205, 1.0);
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
- /* There's a one pixel border around the grid that we want to remove */
110
+ /* Remove border from the grid wrapper */
49
111
  .ag-root-wrapper {
50
- border: none !important; /* Force removal with !important */
112
+ border: none !important;
51
113
  }
52
114
 
53
-
54
- /* Box shadow and rounded corners for all AgGrid themes */
55
- [class*="ag-theme-"] {
56
- box-shadow: 2px 2px 6px 5px rgba(0, 0, 0, 0.2); /* Drop shadow */
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: rgba(240, 240, 240, 0.5);
66
- box-shadow: 2px 2px 6px 5px rgba(0, 0, 0, 0.2);
67
- border-radius: 12px; /* Rounded corners */
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
- background-color: rgba(240, 240, 240, 0.25);
73
- box-shadow: 1px 1px 3px 2px rgba(0, 0, 0, 0.2);
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: rgba(240, 240, 240, 1.0);
87
- box-shadow: 2px 2px 6px 5px rgba(0, 0, 0, 0.25);
88
- border-radius: 25px; /* Rounded corners */
89
- overflow: hidden; /* Ensure contents fit inside the rounded corners */
90
- border: 2px solid rgba(128, 128, 128, 1); /* 1-pixel grey */
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: rgb(40, 100, 40);
145
+ color: var(--wb-success);
96
146
  }
97
147
 
98
148
  .blue-text {
99
- color: rgb(70, 70, 160);
149
+ color: var(--wb-info);
100
150
  }
101
151
 
102
152
  .pink-text {
103
- color: rgb(200, 100, 200);
153
+ color: var(--wb-pink);
104
154
  }
105
155
 
106
156
  .red-text {
107
- color: rgb(200, 60, 100);
157
+ color: var(--wb-danger);
108
158
  }
109
159
 
110
160
  .orange-text {
111
- color: rgb(160, 80, 0);
161
+ color: var(--wb-warning);
112
162
  }
113
163
 
114
164
  .alert {
115
- color: rgb(200, 60, 100);
165
+ color: var(--wb-danger);
116
166
  }
117
167
 
118
168
  .warning {
119
- color: rgb(160, 80, 0);
169
+ color: var(--wb-warning);
120
170
  }
121
171
 
122
172
  .good {
123
- color: rgb(40, 100, 40);
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 rgb(120, 120, 120);
135
- background-color: rgba(150, 150, 195);
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 rgb(120, 120, 120);
143
- background-color: rgba(240, 240, 240, 0.5);
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, "rgb(100, 100, 200)"],
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, "rgb(100, 100, 255)"],
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, "rgb(100, 100, 200)"],
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(0, 0, 0, 0.0)",
565
- "plot_bgcolor": "rgba(0, 0, 0, 0.0)",
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": "#ffffff",
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": "#edeeee",
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": "#ffffff",
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": "#edeeee",
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
- /* Adjust header background color */
41
- .ag-header {
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
- /* Adjust cell background */
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
- /* Selection color for the entire row */
56
- .ag-row.ag-row-selected .ag-cell {
57
- background-color: rgb(32, 75, 105);
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; /* Force removal with !important */
62
+ border: none !important;
65
63
  }
66
64
 
67
-
68
- /* Box shadow and rounded corners for all AgGrid themes */
69
- [class*="ag-theme-"] {
70
- box-shadow: 2px 2px 6px 5px rgba(0, 0, 0, 0.25);
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: rgba(45, 41, 76, 0.5); /* Dark background */
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
  }
@@ -528,7 +528,7 @@
528
528
  "style": "dark"
529
529
  },
530
530
  "paper_bgcolor": "rgba(0, 0, 0, 0.0)",
531
- "plot_bgcolor": "rgba(0, 0, 0, 0.0)",
531
+ "plot_bgcolor": "rgb(54, 55, 88)",
532
532
  "polar": {
533
533
  "angularaxis": {
534
534
  "gridcolor": "#506784",
@@ -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 bitstring fingerprints to numpy matrix.
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 bitstring fingerprints
24
- dtype: numpy data type (uint8 is default: np.bool_ is good for Jaccard computations
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
- # Dense matrix representation (we might support sparse in the future)
31
- return np.array([list(fp) for fp in fingerprints], dtype=dtype)
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: