expops 0.1.3__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 (86) hide show
  1. expops-0.1.3.dist-info/METADATA +826 -0
  2. expops-0.1.3.dist-info/RECORD +86 -0
  3. expops-0.1.3.dist-info/WHEEL +5 -0
  4. expops-0.1.3.dist-info/entry_points.txt +3 -0
  5. expops-0.1.3.dist-info/licenses/LICENSE +674 -0
  6. expops-0.1.3.dist-info/top_level.txt +1 -0
  7. mlops/__init__.py +0 -0
  8. mlops/__main__.py +11 -0
  9. mlops/_version.py +34 -0
  10. mlops/adapters/__init__.py +12 -0
  11. mlops/adapters/base.py +86 -0
  12. mlops/adapters/config_schema.py +89 -0
  13. mlops/adapters/custom/__init__.py +3 -0
  14. mlops/adapters/custom/custom_adapter.py +447 -0
  15. mlops/adapters/plugin_manager.py +113 -0
  16. mlops/adapters/sklearn/__init__.py +3 -0
  17. mlops/adapters/sklearn/adapter.py +94 -0
  18. mlops/cluster/__init__.py +3 -0
  19. mlops/cluster/controller.py +496 -0
  20. mlops/cluster/process_runner.py +91 -0
  21. mlops/cluster/providers.py +258 -0
  22. mlops/core/__init__.py +95 -0
  23. mlops/core/custom_model_base.py +38 -0
  24. mlops/core/dask_networkx_executor.py +1265 -0
  25. mlops/core/executor_worker.py +1239 -0
  26. mlops/core/experiment_tracker.py +81 -0
  27. mlops/core/graph_types.py +64 -0
  28. mlops/core/networkx_parser.py +135 -0
  29. mlops/core/payload_spill.py +278 -0
  30. mlops/core/pipeline_utils.py +162 -0
  31. mlops/core/process_hashing.py +216 -0
  32. mlops/core/step_state_manager.py +1298 -0
  33. mlops/core/step_system.py +956 -0
  34. mlops/core/workspace.py +99 -0
  35. mlops/environment/__init__.py +10 -0
  36. mlops/environment/base.py +43 -0
  37. mlops/environment/conda_manager.py +307 -0
  38. mlops/environment/factory.py +70 -0
  39. mlops/environment/pyenv_manager.py +146 -0
  40. mlops/environment/setup_env.py +31 -0
  41. mlops/environment/system_manager.py +66 -0
  42. mlops/environment/utils.py +105 -0
  43. mlops/environment/venv_manager.py +134 -0
  44. mlops/main.py +527 -0
  45. mlops/managers/project_manager.py +400 -0
  46. mlops/managers/reproducibility_manager.py +575 -0
  47. mlops/platform.py +996 -0
  48. mlops/reporting/__init__.py +16 -0
  49. mlops/reporting/context.py +187 -0
  50. mlops/reporting/entrypoint.py +292 -0
  51. mlops/reporting/kv_utils.py +77 -0
  52. mlops/reporting/registry.py +50 -0
  53. mlops/runtime/__init__.py +9 -0
  54. mlops/runtime/context.py +34 -0
  55. mlops/runtime/env_export.py +113 -0
  56. mlops/storage/__init__.py +12 -0
  57. mlops/storage/adapters/__init__.py +9 -0
  58. mlops/storage/adapters/gcp_kv_store.py +778 -0
  59. mlops/storage/adapters/gcs_object_store.py +96 -0
  60. mlops/storage/adapters/memory_store.py +240 -0
  61. mlops/storage/adapters/redis_store.py +438 -0
  62. mlops/storage/factory.py +199 -0
  63. mlops/storage/interfaces/__init__.py +6 -0
  64. mlops/storage/interfaces/kv_store.py +118 -0
  65. mlops/storage/path_utils.py +38 -0
  66. mlops/templates/premier-league/charts/plot_metrics.js +70 -0
  67. mlops/templates/premier-league/charts/plot_metrics.py +145 -0
  68. mlops/templates/premier-league/charts/requirements.txt +6 -0
  69. mlops/templates/premier-league/configs/cluster_config.yaml +13 -0
  70. mlops/templates/premier-league/configs/project_config.yaml +207 -0
  71. mlops/templates/premier-league/data/England CSV.csv +12154 -0
  72. mlops/templates/premier-league/models/premier_league_model.py +638 -0
  73. mlops/templates/premier-league/requirements.txt +8 -0
  74. mlops/templates/sklearn-basic/README.md +22 -0
  75. mlops/templates/sklearn-basic/charts/plot_metrics.py +85 -0
  76. mlops/templates/sklearn-basic/charts/requirements.txt +3 -0
  77. mlops/templates/sklearn-basic/configs/project_config.yaml +64 -0
  78. mlops/templates/sklearn-basic/data/train.csv +14 -0
  79. mlops/templates/sklearn-basic/models/model.py +62 -0
  80. mlops/templates/sklearn-basic/requirements.txt +10 -0
  81. mlops/web/__init__.py +3 -0
  82. mlops/web/server.py +585 -0
  83. mlops/web/ui/index.html +52 -0
  84. mlops/web/ui/mlops-charts.js +357 -0
  85. mlops/web/ui/script.js +1244 -0
  86. mlops/web/ui/styles.css +248 -0
@@ -0,0 +1,248 @@
1
+ :root {
2
+ --color-bg: #0b1220;
3
+ --color-bg-elev: #0a0f1a;
4
+ --color-sidebar-bg: #0f172a;
5
+ --color-text: #e5e7eb;
6
+ --color-text-muted: #94a3b8;
7
+ --color-text-subtle: #a3a3a3;
8
+ --color-border: #1f2937;
9
+ --color-border-2: #334155;
10
+ --color-border-hover: #475569;
11
+ --color-input-bg: #0b1220;
12
+ --color-input-text: #e2e8f0;
13
+ --color-accent: #60a5fa;
14
+ --color-link-line: #334155;
15
+ --tooltip-bg: rgba(17,24,39,0.92);
16
+ --tooltip-border: #374151;
17
+ --modal-close-bg: #111827;
18
+ --shadow-strong: rgba(0, 0, 0, 0.5);
19
+ --chart-message-bg: rgba(113, 63, 18, 0.3);
20
+ --chart-message-border: #92400e;
21
+ --chart-error-bg: rgba(127, 29, 29, 0.3);
22
+ --chart-error-border: #991b1b;
23
+ --color-hover-bg: #0d1628;
24
+ }
25
+
26
+ [data-theme="light"] {
27
+ --color-bg: #f8fafc;
28
+ --color-bg-elev: #ffffff;
29
+ --color-sidebar-bg: #f1f5f9;
30
+ --color-text: #0f172a;
31
+ --color-text-muted: #64748b;
32
+ --color-text-subtle: #6b7280;
33
+ --color-border: #e2e8f0;
34
+ --color-border-2: #cbd5e1;
35
+ --color-border-hover: #94a3b8;
36
+ --color-input-bg: #ffffff;
37
+ --color-input-text: #0f172a;
38
+ --color-accent: #3b82f6;
39
+ --color-link-line: #cbd5e1;
40
+ --tooltip-bg: rgba(255,255,255,0.96);
41
+ --tooltip-border: #cbd5e1;
42
+ --modal-close-bg: #e5e7eb;
43
+ --shadow-strong: rgba(0, 0, 0, 0.1);
44
+ --chart-message-bg: rgba(250, 204, 21, 0.15);
45
+ --chart-message-border: #f59e0b;
46
+ --chart-error-bg: rgba(239, 68, 68, 0.15);
47
+ --chart-error-border: #ef4444;
48
+ --color-hover-bg: #f3f4f6;
49
+ }
50
+
51
+ html, body {
52
+ margin: 0;
53
+ padding: 0;
54
+ height: 100%;
55
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;
56
+ background: var(--color-bg);
57
+ color: var(--color-text);
58
+ }
59
+
60
+ #app {
61
+ display: grid;
62
+ grid-template-columns: 280px 1fr;
63
+ height: 100vh;
64
+ }
65
+
66
+ #sidebar {
67
+ background: var(--color-sidebar-bg);
68
+ color: var(--color-text);
69
+ padding: 16px;
70
+ display: flex;
71
+ flex-direction: column;
72
+ gap: 16px;
73
+ }
74
+
75
+ #sidebar .section { display: flex; flex-direction: column; gap: 6px; }
76
+ label { font-size: 12px; color: var(--color-text-muted); }
77
+ select { padding: 8px; border-radius: 6px; border: 1px solid var(--color-border-2); background: var(--color-input-bg); color: var(--color-input-text); }
78
+
79
+ /* Run list */
80
+ .run-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 6px; max-height: 30vh; overflow: auto; }
81
+ .run-list-item { padding: 8px; border-radius: 6px; border: 1px solid var(--color-border-2); background: var(--color-input-bg); color: var(--color-input-text); cursor: pointer; font-size: 14px; }
82
+ .run-list-item:hover { border-color: var(--color-border-hover); background: var(--color-hover-bg); }
83
+ .run-list-item.selected { border-color: var(--color-accent); box-shadow: 0 0 0 1px rgba(96,165,250,0.3) inset; }
84
+
85
+ .hint { font-size: 12px; color: var(--color-text-subtle); }
86
+
87
+ #main {
88
+ position: relative;
89
+ padding: 16px;
90
+ background: var(--color-bg);
91
+ color: var(--color-text);
92
+ }
93
+
94
+ #graphTitle { margin: 0 0 12px 0; font-weight: 600; }
95
+
96
+ #graph { width: 100%; height: calc(100vh - 70px); border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-bg-elev); }
97
+
98
+ /* Charts panel removed in this revision */
99
+
100
+ .node circle {
101
+ stroke: var(--color-border);
102
+ stroke-width: 1.5px;
103
+ pointer-events: all;
104
+ }
105
+
106
+ .node text {
107
+ fill: var(--color-text);
108
+ font-size: 10px;
109
+ pointer-events: none;
110
+ }
111
+ .node-cached-index {
112
+ font-size: 9px;
113
+ fill: #93c5fd;
114
+ pointer-events: none;
115
+ }
116
+
117
+ .node rect {
118
+ stroke: var(--color-border);
119
+ stroke-width: 1.5px;
120
+ pointer-events: all;
121
+ }
122
+
123
+ .node.clickable { cursor: pointer; }
124
+
125
+ .link {
126
+ stroke: var(--color-link-line);
127
+ stroke-opacity: 0.7;
128
+ stroke-width: 1px;
129
+ }
130
+
131
+ .status-running circle, .status-running rect { fill: #f59e0b; }
132
+ .status-completed circle, .status-completed rect { fill: #10b981; }
133
+ .status-cached circle, .status-cached rect { fill: #93c5fd; }
134
+ .status-failed circle, .status-failed rect { fill: #ef4444; }
135
+ .status-pending circle, .status-pending rect { fill: #6b7280; }
136
+
137
+ /* Loading spinner for running nodes */
138
+ .node.status-running .spinner {
139
+ stroke: #fde68a;
140
+ stroke-width: 2px;
141
+ stroke-linecap: round;
142
+ animation: spin 1s linear infinite;
143
+ }
144
+
145
+ @keyframes spin {
146
+ 0% { stroke-dasharray: 5 113; stroke-dashoffset: 0; }
147
+ 50% { stroke-dasharray: 60 58; stroke-dashoffset: 0; }
148
+ 100% { stroke-dasharray: 5 113; stroke-dashoffset: -118; }
149
+ }
150
+
151
+ /* Tooltip */
152
+ .tooltip {
153
+ position: absolute;
154
+ pointer-events: none;
155
+ background: var(--tooltip-bg);
156
+ color: var(--color-text);
157
+ border: 1px solid var(--tooltip-border);
158
+ padding: 8px 10px;
159
+ border-radius: 6px;
160
+ font-size: 12px;
161
+ white-space: nowrap;
162
+ z-index: 10;
163
+ }
164
+
165
+ /* Modal */
166
+ .modal { position: fixed; inset: 0; background: rgba(0,0,0,0.6); display: flex; align-items: center; justify-content: center; z-index: 50; }
167
+ .modal.hidden { display: none; }
168
+ .modal-content { position: relative; width: min(95vw, 1200px); height: min(90vh, 800px); background: var(--color-bg-elev); border: 1px solid var(--color-border); border-radius: 10px; padding: 16px; display: flex; flex-direction: column; }
169
+ .modal-close { position: absolute; top: 8px; right: 8px; background: var(--modal-close-bg); color: var(--color-text); border: 1px solid var(--color-border-2); border-radius: 6px; width: 32px; height: 32px; font-size: 18px; cursor: pointer; }
170
+ .modal-body { flex: 1; display: flex; align-items: center; justify-content: center; }
171
+ #chartModalImage { max-width: 100%; max-height: 100%; height: auto; border: 1px solid var(--color-border); border-radius: 8px; }
172
+
173
+ /* Dynamic charts section */
174
+ #dynamicChartsContainer {
175
+ margin-top: 2rem;
176
+ padding: 1rem;
177
+ border-top: 2px solid var(--color-border);
178
+ }
179
+
180
+ #dynamicChartsContainer h3 {
181
+ margin: 0 0 1rem 0;
182
+ font-size: 1.2rem;
183
+ color: var(--color-text);
184
+ }
185
+
186
+ #dynamicChartsGrid {
187
+ display: grid;
188
+ grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
189
+ gap: 2rem;
190
+ }
191
+
192
+ .dynamic-chart-item {
193
+ background: var(--color-bg-elev);
194
+ border: 1px solid var(--color-border);
195
+ border-radius: 8px;
196
+ padding: 1rem;
197
+ box-shadow: 0 2px 8px var(--shadow-strong);
198
+ }
199
+
200
+ .dynamic-chart-item h4 {
201
+ margin: 0 0 1rem 0;
202
+ font-size: 1rem;
203
+ color: var(--color-accent);
204
+ text-transform: capitalize;
205
+ }
206
+
207
+ .chart-canvas-container {
208
+ min-height: 300px;
209
+ position: relative;
210
+ }
211
+
212
+ .chart-canvas-container canvas {
213
+ max-width: 100%;
214
+ height: auto !important;
215
+ }
216
+
217
+ .chart-error {
218
+ color: #fca5a5;
219
+ padding: 1rem;
220
+ background: var(--chart-error-bg);
221
+ border: 1px solid var(--chart-error-border);
222
+ border-radius: 4px;
223
+ font-size: 0.9rem;
224
+ }
225
+
226
+ .chart-message {
227
+ color: #fcd34d;
228
+ padding: 1rem;
229
+ background: var(--chart-message-bg);
230
+ border: 1px solid var(--chart-message-border);
231
+ border-radius: 4px;
232
+ font-size: 0.9rem;
233
+ text-align: center;
234
+ }
235
+
236
+ /* Theme toggle button */
237
+ .theme-toggle {
238
+ padding: 6px 10px;
239
+ border-radius: 9999px;
240
+ border: 1px solid var(--color-border-2);
241
+ background: var(--color-input-bg);
242
+ color: var(--color-text);
243
+ cursor: pointer;
244
+ width: fit-content;
245
+ }
246
+ .theme-toggle:hover { border-color: var(--color-border-hover); }
247
+
248
+