workbench 0.8.192__py3-none-any.whl → 0.8.197__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/algorithms/dataframe/__init__.py +1 -2
- workbench/algorithms/dataframe/fingerprint_proximity.py +2 -2
- workbench/algorithms/dataframe/proximity.py +212 -234
- workbench/algorithms/graph/light/proximity_graph.py +8 -7
- workbench/api/endpoint.py +2 -3
- workbench/api/model.py +2 -5
- workbench/core/artifacts/endpoint_core.py +25 -16
- workbench/core/artifacts/feature_set_core.py +126 -4
- workbench/core/artifacts/model_core.py +37 -55
- workbench/core/transforms/features_to_model/features_to_model.py +3 -3
- workbench/core/views/training_view.py +75 -0
- workbench/core/views/view.py +1 -1
- workbench/model_scripts/custom_models/proximity/proximity.py +212 -234
- workbench/model_scripts/custom_models/uq_models/proximity.py +212 -234
- workbench/model_scripts/pytorch_model/generated_model_script.py +567 -0
- workbench/model_scripts/uq_models/generated_model_script.py +589 -0
- workbench/model_scripts/uq_models/mapie.template +103 -6
- workbench/model_scripts/xgb_model/generated_model_script.py +468 -0
- workbench/repl/workbench_shell.py +3 -3
- workbench/utils/model_utils.py +25 -10
- workbench/utils/xgboost_model_utils.py +117 -47
- workbench/web_interface/components/model_plot.py +7 -1
- workbench/web_interface/components/plugin_unit_test.py +5 -2
- workbench/web_interface/components/plugins/model_details.py +9 -7
- {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/METADATA +23 -2
- {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/RECORD +30 -27
- {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/licenses/LICENSE +1 -1
- {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/WHEEL +0 -0
- {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/entry_points.txt +0 -0
- {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/top_level.txt +0 -0
workbench/utils/model_utils.py
CHANGED
|
@@ -113,9 +113,16 @@ def proximity_model_local(model: "Model"):
|
|
|
113
113
|
fs = FeatureSet(model.get_input())
|
|
114
114
|
id_column = fs.id_column
|
|
115
115
|
|
|
116
|
-
# Create the Proximity Model from
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
# Create the Proximity Model from both the full FeatureSet and the Model training data
|
|
117
|
+
full_df = fs.pull_dataframe()
|
|
118
|
+
model_df = model.training_view().pull_dataframe()
|
|
119
|
+
|
|
120
|
+
# Mark rows that are in the model
|
|
121
|
+
model_ids = set(model_df[id_column])
|
|
122
|
+
full_df["in_model"] = full_df[id_column].isin(model_ids)
|
|
123
|
+
|
|
124
|
+
# Create and return the Proximity Model
|
|
125
|
+
return Proximity(full_df, id_column, features, target, track_columns=features)
|
|
119
126
|
|
|
120
127
|
|
|
121
128
|
def proximity_model(model: "Model", prox_model_name: str, track_columns: list = None) -> "Model":
|
|
@@ -165,9 +172,6 @@ def uq_model(model: "Model", uq_model_name: str, train_all_data: bool = False) -
|
|
|
165
172
|
"""
|
|
166
173
|
from workbench.api import Model, ModelType, FeatureSet # noqa: F401 (avoid circular import)
|
|
167
174
|
|
|
168
|
-
# Get the custom script path for the UQ model
|
|
169
|
-
script_path = get_custom_script_path("uq_models", "mapie.template")
|
|
170
|
-
|
|
171
175
|
# Get Feature and Target Columns from the existing given Model
|
|
172
176
|
features = model.features()
|
|
173
177
|
target = model.target()
|
|
@@ -182,12 +186,25 @@ def uq_model(model: "Model", uq_model_name: str, train_all_data: bool = False) -
|
|
|
182
186
|
description=f"UQ Model for {model.name}",
|
|
183
187
|
tags=["uq", model.name],
|
|
184
188
|
train_all_data=train_all_data,
|
|
185
|
-
custom_script=script_path,
|
|
186
189
|
custom_args={"id_column": fs.id_column, "track_columns": [target]},
|
|
187
190
|
)
|
|
188
191
|
return uq_model
|
|
189
192
|
|
|
190
193
|
|
|
194
|
+
def safe_extract_tarfile(tar_path: str, extract_path: str) -> None:
|
|
195
|
+
"""
|
|
196
|
+
Extract a tarball safely, using data filter if available.
|
|
197
|
+
|
|
198
|
+
The filter parameter was backported to Python 3.8+, 3.9+, 3.10.13+, 3.11+
|
|
199
|
+
as a security patch, but may not be present in older patch versions.
|
|
200
|
+
"""
|
|
201
|
+
with tarfile.open(tar_path, "r:gz") as tar:
|
|
202
|
+
if hasattr(tarfile, "data_filter"):
|
|
203
|
+
tar.extractall(path=extract_path, filter="data")
|
|
204
|
+
else:
|
|
205
|
+
tar.extractall(path=extract_path)
|
|
206
|
+
|
|
207
|
+
|
|
191
208
|
def load_category_mappings_from_s3(model_artifact_uri: str) -> Optional[dict]:
|
|
192
209
|
"""
|
|
193
210
|
Download and extract category mappings from a model artifact in S3.
|
|
@@ -206,9 +223,7 @@ def load_category_mappings_from_s3(model_artifact_uri: str) -> Optional[dict]:
|
|
|
206
223
|
wr.s3.download(path=model_artifact_uri, local_file=local_tar_path)
|
|
207
224
|
|
|
208
225
|
# Extract tarball
|
|
209
|
-
|
|
210
|
-
# Note: For 3.12+, can use filter="data" argument
|
|
211
|
-
tar.extractall(path=tmpdir)
|
|
226
|
+
safe_extract_tarfile(local_tar_path, tmpdir)
|
|
212
227
|
|
|
213
228
|
# Look for category mappings in base directory only
|
|
214
229
|
mappings_path = os.path.join(tmpdir, "category_mappings.json")
|
|
@@ -3,17 +3,15 @@
|
|
|
3
3
|
import logging
|
|
4
4
|
import os
|
|
5
5
|
import tempfile
|
|
6
|
-
import tarfile
|
|
7
6
|
import joblib
|
|
8
7
|
import pickle
|
|
9
8
|
import glob
|
|
10
9
|
import awswrangler as wr
|
|
11
|
-
from typing import Optional, List, Tuple
|
|
10
|
+
from typing import Optional, List, Tuple, Any
|
|
12
11
|
import hashlib
|
|
13
12
|
import pandas as pd
|
|
14
13
|
import numpy as np
|
|
15
14
|
import xgboost as xgb
|
|
16
|
-
from typing import Dict, Any
|
|
17
15
|
from sklearn.model_selection import KFold, StratifiedKFold
|
|
18
16
|
from sklearn.metrics import (
|
|
19
17
|
precision_recall_fscore_support,
|
|
@@ -21,13 +19,14 @@ from sklearn.metrics import (
|
|
|
21
19
|
mean_absolute_error,
|
|
22
20
|
r2_score,
|
|
23
21
|
median_absolute_error,
|
|
22
|
+
roc_auc_score,
|
|
24
23
|
)
|
|
25
24
|
from scipy.stats import spearmanr
|
|
26
25
|
from sklearn.preprocessing import LabelEncoder
|
|
27
26
|
|
|
28
27
|
# Workbench Imports
|
|
29
|
-
from workbench.utils.model_utils import load_category_mappings_from_s3
|
|
30
|
-
from workbench.utils.pandas_utils import convert_categorical_types
|
|
28
|
+
from workbench.utils.model_utils import load_category_mappings_from_s3, safe_extract_tarfile
|
|
29
|
+
from workbench.utils.pandas_utils import convert_categorical_types, expand_proba_column
|
|
31
30
|
|
|
32
31
|
# Set up the log
|
|
33
32
|
log = logging.getLogger("workbench")
|
|
@@ -50,9 +49,7 @@ def xgboost_model_from_s3(model_artifact_uri: str):
|
|
|
50
49
|
wr.s3.download(path=model_artifact_uri, local_file=local_tar_path)
|
|
51
50
|
|
|
52
51
|
# Extract tarball
|
|
53
|
-
|
|
54
|
-
# Note: For 3.12+, can use filter="data" argument
|
|
55
|
-
tar.extractall(path=tmpdir)
|
|
52
|
+
safe_extract_tarfile(local_tar_path, tmpdir)
|
|
56
53
|
|
|
57
54
|
# Define model file patterns to search for (in order of preference)
|
|
58
55
|
patterns = [
|
|
@@ -261,7 +258,7 @@ def leaf_stats(df: pd.DataFrame, target_col: str) -> pd.DataFrame:
|
|
|
261
258
|
return result_df
|
|
262
259
|
|
|
263
260
|
|
|
264
|
-
def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[
|
|
261
|
+
def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[pd.DataFrame, pd.DataFrame]:
|
|
265
262
|
"""
|
|
266
263
|
Performs K-fold cross-validation with detailed metrics.
|
|
267
264
|
Args:
|
|
@@ -269,10 +266,8 @@ def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[Dict[st
|
|
|
269
266
|
nfolds: Number of folds for cross-validation (default is 5)
|
|
270
267
|
Returns:
|
|
271
268
|
Tuple of:
|
|
272
|
-
-
|
|
273
|
-
|
|
274
|
-
- summary_metrics: Summary metrics across folds
|
|
275
|
-
- DataFrame with columns: id, target, prediction (out-of-fold predictions for all samples)
|
|
269
|
+
- DataFrame with per-class metrics (and 'all' row for overall metrics)
|
|
270
|
+
- DataFrame with columns: id, target, prediction, and *_proba columns (for classifiers)
|
|
276
271
|
"""
|
|
277
272
|
from workbench.api import FeatureSet
|
|
278
273
|
|
|
@@ -281,12 +276,22 @@ def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[Dict[st
|
|
|
281
276
|
loaded_model = xgboost_model_from_s3(model_artifact_uri)
|
|
282
277
|
if loaded_model is None:
|
|
283
278
|
log.error("No XGBoost model found in the artifact.")
|
|
284
|
-
return
|
|
279
|
+
return pd.DataFrame(), pd.DataFrame()
|
|
285
280
|
|
|
286
281
|
# Check if we got a full sklearn model or need to create one
|
|
287
282
|
if isinstance(loaded_model, (xgb.XGBClassifier, xgb.XGBRegressor)):
|
|
288
|
-
|
|
289
|
-
|
|
283
|
+
is_classifier = isinstance(loaded_model, xgb.XGBClassifier)
|
|
284
|
+
|
|
285
|
+
# Get the model's hyperparameters and ensure enable_categorical=True
|
|
286
|
+
params = loaded_model.get_params()
|
|
287
|
+
params["enable_categorical"] = True
|
|
288
|
+
|
|
289
|
+
# Create new model with same params but enable_categorical=True
|
|
290
|
+
if is_classifier:
|
|
291
|
+
xgb_model = xgb.XGBClassifier(**params)
|
|
292
|
+
else:
|
|
293
|
+
xgb_model = xgb.XGBRegressor(**params)
|
|
294
|
+
|
|
290
295
|
elif isinstance(loaded_model, xgb.Booster):
|
|
291
296
|
# Legacy: got a booster, need to wrap it
|
|
292
297
|
log.warning("Deprecated: Loaded model is a Booster, wrapping in sklearn model.")
|
|
@@ -297,7 +302,7 @@ def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[Dict[st
|
|
|
297
302
|
xgb_model._Booster = loaded_model
|
|
298
303
|
else:
|
|
299
304
|
log.error(f"Unexpected model type: {type(loaded_model)}")
|
|
300
|
-
return
|
|
305
|
+
return pd.DataFrame(), pd.DataFrame()
|
|
301
306
|
|
|
302
307
|
# Prepare data
|
|
303
308
|
fs = FeatureSet(workbench_model.get_input())
|
|
@@ -308,10 +313,12 @@ def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[Dict[st
|
|
|
308
313
|
target_col = workbench_model.target()
|
|
309
314
|
feature_cols = workbench_model.features()
|
|
310
315
|
|
|
311
|
-
# Convert string
|
|
316
|
+
# Convert string[python] to object, then to category for XGBoost compatibility
|
|
317
|
+
# This avoids XGBoost's issue with pandas 2.x string[python] dtype in categorical categories
|
|
312
318
|
for col in feature_cols:
|
|
313
|
-
if df[col]
|
|
314
|
-
|
|
319
|
+
if pd.api.types.is_string_dtype(df[col]):
|
|
320
|
+
# Double conversion: string[python] -> object -> category
|
|
321
|
+
df[col] = df[col].astype("object").astype("category")
|
|
315
322
|
|
|
316
323
|
X = df[feature_cols]
|
|
317
324
|
y = df[target_col]
|
|
@@ -326,12 +333,12 @@ def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[Dict[st
|
|
|
326
333
|
y_for_cv = y
|
|
327
334
|
|
|
328
335
|
# Prepare KFold
|
|
336
|
+
# Note: random_state=42 seems to not actually give us reproducible results
|
|
329
337
|
kfold = (StratifiedKFold if is_classifier else KFold)(n_splits=nfolds, shuffle=True, random_state=42)
|
|
330
338
|
|
|
331
339
|
# Initialize results collection
|
|
332
340
|
fold_metrics = []
|
|
333
|
-
predictions_df = pd.DataFrame({id_col: ids, target_col: y})
|
|
334
|
-
# Note: 'prediction' column will be created automatically with correct dtype
|
|
341
|
+
predictions_df = pd.DataFrame({id_col: ids, target_col: y})
|
|
335
342
|
|
|
336
343
|
# Perform cross-validation
|
|
337
344
|
for fold_idx, (train_idx, val_idx) in enumerate(kfold.split(X, y_for_cv), 1):
|
|
@@ -346,6 +353,8 @@ def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[Dict[st
|
|
|
346
353
|
val_indices = X_val.index
|
|
347
354
|
if is_classifier:
|
|
348
355
|
predictions_df.loc[val_indices, "prediction"] = label_encoder.inverse_transform(preds.astype(int))
|
|
356
|
+
y_proba = xgb_model.predict_proba(X_val)
|
|
357
|
+
predictions_df.loc[val_indices, "pred_proba"] = pd.Series(y_proba.tolist(), index=val_indices)
|
|
349
358
|
else:
|
|
350
359
|
predictions_df.loc[val_indices, "prediction"] = preds
|
|
351
360
|
|
|
@@ -353,10 +362,34 @@ def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[Dict[st
|
|
|
353
362
|
if is_classifier:
|
|
354
363
|
y_val_orig = label_encoder.inverse_transform(y_val)
|
|
355
364
|
preds_orig = label_encoder.inverse_transform(preds.astype(int))
|
|
365
|
+
|
|
366
|
+
# Overall weighted metrics
|
|
356
367
|
prec, rec, f1, _ = precision_recall_fscore_support(
|
|
357
368
|
y_val_orig, preds_orig, average="weighted", zero_division=0
|
|
358
369
|
)
|
|
359
|
-
|
|
370
|
+
|
|
371
|
+
# Per-class F1
|
|
372
|
+
prec_per_class, rec_per_class, f1_per_class, _ = precision_recall_fscore_support(
|
|
373
|
+
y_val_orig, preds_orig, average=None, zero_division=0, labels=label_encoder.classes_
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
# ROC-AUC (overall and per-class)
|
|
377
|
+
roc_auc_overall = roc_auc_score(y_val, y_proba, multi_class="ovr", average="macro")
|
|
378
|
+
roc_auc_per_class = roc_auc_score(y_val, y_proba, multi_class="ovr", average=None)
|
|
379
|
+
|
|
380
|
+
fold_metrics.append(
|
|
381
|
+
{
|
|
382
|
+
"fold": fold_idx,
|
|
383
|
+
"precision": prec,
|
|
384
|
+
"recall": rec,
|
|
385
|
+
"f1": f1,
|
|
386
|
+
"roc_auc": roc_auc_overall,
|
|
387
|
+
"precision_per_class": prec_per_class,
|
|
388
|
+
"recall_per_class": rec_per_class,
|
|
389
|
+
"f1_per_class": f1_per_class,
|
|
390
|
+
"roc_auc_per_class": roc_auc_per_class,
|
|
391
|
+
}
|
|
392
|
+
)
|
|
360
393
|
else:
|
|
361
394
|
spearman_corr, _ = spearmanr(y_val, preds)
|
|
362
395
|
fold_metrics.append(
|
|
@@ -370,32 +403,67 @@ def cross_fold_inference(workbench_model: Any, nfolds: int = 5) -> Tuple[Dict[st
|
|
|
370
403
|
}
|
|
371
404
|
)
|
|
372
405
|
|
|
373
|
-
# Calculate summary metrics
|
|
406
|
+
# Calculate summary metrics
|
|
374
407
|
fold_df = pd.DataFrame(fold_metrics)
|
|
375
|
-
metric_names = ["precision", "recall", "fscore"] if is_classifier else ["rmse", "mae", "medae", "r2", "spearmanr"]
|
|
376
|
-
summary_metrics = {metric: f"{fold_df[metric].mean():.3f} ±{fold_df[metric].std():.3f}" for metric in metric_names}
|
|
377
408
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
409
|
+
if is_classifier:
|
|
410
|
+
# Expand the *_proba columns into separate columns for easier handling
|
|
411
|
+
predictions_df = expand_proba_column(predictions_df, label_encoder.classes_)
|
|
412
|
+
|
|
413
|
+
# Build per-class metrics DataFrame
|
|
414
|
+
metric_rows = []
|
|
415
|
+
|
|
416
|
+
# Per-class rows
|
|
417
|
+
for idx, class_name in enumerate(label_encoder.classes_):
|
|
418
|
+
prec_scores = np.array([fold["precision_per_class"][idx] for fold in fold_metrics])
|
|
419
|
+
rec_scores = np.array([fold["recall_per_class"][idx] for fold in fold_metrics])
|
|
420
|
+
f1_scores = np.array([fold["f1_per_class"][idx] for fold in fold_metrics])
|
|
421
|
+
roc_auc_scores = np.array([fold["roc_auc_per_class"][idx] for fold in fold_metrics])
|
|
422
|
+
|
|
423
|
+
y_orig = label_encoder.inverse_transform(y_for_cv)
|
|
424
|
+
support = int((y_orig == class_name).sum())
|
|
425
|
+
|
|
426
|
+
metric_rows.append(
|
|
427
|
+
{
|
|
428
|
+
"class": class_name,
|
|
429
|
+
"precision": prec_scores.mean(),
|
|
430
|
+
"recall": rec_scores.mean(),
|
|
431
|
+
"f1": f1_scores.mean(),
|
|
432
|
+
"roc_auc": roc_auc_scores.mean(),
|
|
433
|
+
"support": support,
|
|
434
|
+
}
|
|
393
435
|
)
|
|
394
436
|
|
|
395
|
-
|
|
396
|
-
|
|
437
|
+
# Overall 'all' row
|
|
438
|
+
metric_rows.append(
|
|
439
|
+
{
|
|
440
|
+
"class": "all",
|
|
441
|
+
"precision": fold_df["precision"].mean(),
|
|
442
|
+
"recall": fold_df["recall"].mean(),
|
|
443
|
+
"f1": fold_df["f1"].mean(),
|
|
444
|
+
"roc_auc": fold_df["roc_auc"].mean(),
|
|
445
|
+
"support": len(y_for_cv),
|
|
446
|
+
}
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
metrics_df = pd.DataFrame(metric_rows)
|
|
450
|
+
|
|
451
|
+
else:
|
|
452
|
+
# Regression metrics
|
|
453
|
+
metrics_df = pd.DataFrame(
|
|
454
|
+
[
|
|
455
|
+
{
|
|
456
|
+
"rmse": fold_df["rmse"].mean(),
|
|
457
|
+
"mae": fold_df["mae"].mean(),
|
|
458
|
+
"medae": fold_df["medae"].mean(),
|
|
459
|
+
"r2": fold_df["r2"].mean(),
|
|
460
|
+
"spearmanr": fold_df["spearmanr"].mean(),
|
|
461
|
+
"support": len(y_for_cv),
|
|
462
|
+
}
|
|
463
|
+
]
|
|
464
|
+
)
|
|
397
465
|
|
|
398
|
-
return
|
|
466
|
+
return metrics_df, predictions_df
|
|
399
467
|
|
|
400
468
|
|
|
401
469
|
def leave_one_out_inference(workbench_model: Any) -> pd.DataFrame:
|
|
@@ -440,10 +508,12 @@ def leave_one_out_inference(workbench_model: Any) -> pd.DataFrame:
|
|
|
440
508
|
target_col = workbench_model.target()
|
|
441
509
|
feature_cols = workbench_model.features()
|
|
442
510
|
|
|
443
|
-
# Convert string
|
|
511
|
+
# Convert string[python] to object, then to category for XGBoost compatibility
|
|
512
|
+
# This avoids XGBoost's issue with pandas 2.x string[python] dtype in categorical categories
|
|
444
513
|
for col in feature_cols:
|
|
445
|
-
if df[col]
|
|
446
|
-
|
|
514
|
+
if pd.api.types.is_string_dtype(df[col]):
|
|
515
|
+
# Double conversion: string[python] -> object -> category
|
|
516
|
+
df[col] = df[col].astype("object").astype("category")
|
|
447
517
|
|
|
448
518
|
# Determine which samples to run LOO on
|
|
449
519
|
if len(df) > 1000:
|
|
@@ -39,7 +39,13 @@ class ModelPlot(ComponentInterface):
|
|
|
39
39
|
# Calculate the distance from the diagonal for each point
|
|
40
40
|
target = model.target()
|
|
41
41
|
df["error"] = abs(df["prediction"] - df[target])
|
|
42
|
-
return ScatterPlot().update_properties(
|
|
42
|
+
return ScatterPlot().update_properties(
|
|
43
|
+
df,
|
|
44
|
+
color="error",
|
|
45
|
+
regression_line=True,
|
|
46
|
+
x=target,
|
|
47
|
+
y="prediction",
|
|
48
|
+
)[0]
|
|
43
49
|
else:
|
|
44
50
|
return self.display_text(f"Model Type: {model.model_type}\n\n Awesome Plot Coming Soon!")
|
|
45
51
|
|
|
@@ -156,10 +156,13 @@ class PluginUnitTest:
|
|
|
156
156
|
"""Run the Dash server for the plugin, handling common errors gracefully."""
|
|
157
157
|
while self.is_port_in_use(self.port):
|
|
158
158
|
log.info(f"Port {self.port} is in use. Trying the next one...")
|
|
159
|
-
self.port += 1
|
|
159
|
+
self.port += 1
|
|
160
160
|
|
|
161
161
|
log.info(f"Starting Dash server on port {self.port}...")
|
|
162
|
-
|
|
162
|
+
try:
|
|
163
|
+
self.app.run(debug=True, use_reloader=False, port=self.port)
|
|
164
|
+
except KeyboardInterrupt:
|
|
165
|
+
log.info("Shutting down Dash server...")
|
|
163
166
|
|
|
164
167
|
@staticmethod
|
|
165
168
|
def is_port_in_use(port):
|
|
@@ -45,8 +45,6 @@ class ModelDetails(PluginInterface):
|
|
|
45
45
|
html.H5(children="Inference Metrics", style={"marginTop": "20px"}),
|
|
46
46
|
dcc.Dropdown(id=f"{self.component_id}-dropdown", className="dropdown"),
|
|
47
47
|
dcc.Markdown(id=f"{self.component_id}-metrics"),
|
|
48
|
-
html.H5(children="Cross Fold Metrics", style={"marginTop": "20px"}),
|
|
49
|
-
dcc.Markdown(id=f"{self.component_id}-cross-metrics", dangerously_allow_html=True),
|
|
50
48
|
],
|
|
51
49
|
)
|
|
52
50
|
|
|
@@ -57,7 +55,6 @@ class ModelDetails(PluginInterface):
|
|
|
57
55
|
(f"{self.component_id}-dropdown", "options"),
|
|
58
56
|
(f"{self.component_id}-dropdown", "value"),
|
|
59
57
|
(f"{self.component_id}-metrics", "children"),
|
|
60
|
-
(f"{self.component_id}-cross-metrics", "children"),
|
|
61
58
|
]
|
|
62
59
|
self.signals = [(f"{self.component_id}-dropdown", "value")]
|
|
63
60
|
|
|
@@ -84,10 +81,9 @@ class ModelDetails(PluginInterface):
|
|
|
84
81
|
# Populate the inference runs dropdown
|
|
85
82
|
inference_runs, default_run = self.get_inference_runs()
|
|
86
83
|
metrics = self.inference_metrics(default_run)
|
|
87
|
-
cross_metrics = self.cross_metrics()
|
|
88
84
|
|
|
89
85
|
# Return the updated property values for the plugin
|
|
90
|
-
return [header, details, inference_runs, default_run, metrics
|
|
86
|
+
return [header, details, inference_runs, default_run, metrics]
|
|
91
87
|
|
|
92
88
|
def register_internal_callbacks(self):
|
|
93
89
|
@callback(
|
|
@@ -225,6 +221,7 @@ class ModelDetails(PluginInterface):
|
|
|
225
221
|
|
|
226
222
|
def cross_metrics(self) -> str:
|
|
227
223
|
# Get cross fold metrics if they exist
|
|
224
|
+
# Note: Currently not used since we show cross fold metrics in the dropdown
|
|
228
225
|
model_name = self.current_model.name
|
|
229
226
|
cross_fold_data = self.params.get(f"/workbench/models/{model_name}/inference/cross_fold", warn=False)
|
|
230
227
|
if not cross_fold_data:
|
|
@@ -249,8 +246,13 @@ class ModelDetails(PluginInterface):
|
|
|
249
246
|
if not inference_runs:
|
|
250
247
|
return [], None
|
|
251
248
|
|
|
252
|
-
#
|
|
253
|
-
|
|
249
|
+
# Default inference run (full_cross_fold if it exists, then auto_inference, then first)
|
|
250
|
+
if "full_cross_fold" in inference_runs:
|
|
251
|
+
default_inference_run = "full_cross_fold"
|
|
252
|
+
elif "auto_inference" in inference_runs:
|
|
253
|
+
default_inference_run = "auto_inference"
|
|
254
|
+
else:
|
|
255
|
+
default_inference_run = inference_runs[0]
|
|
254
256
|
|
|
255
257
|
# Return the options for the dropdown and the selected value
|
|
256
258
|
return inference_runs, default_inference_run
|
|
@@ -1,9 +1,30 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: workbench
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.197
|
|
4
4
|
Summary: Workbench: A Dashboard and Python API for creating and deploying AWS SageMaker Model Pipelines
|
|
5
5
|
Author-email: SuperCowPowers LLC <support@supercowpowers.com>
|
|
6
|
-
License
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2021-2026 SuperCowPowers LLC
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
7
28
|
Project-URL: Homepage, https://github.com/SuperCowPowers/workbench
|
|
8
29
|
Keywords: SageMaker,Machine Learning,AWS,Python,Utilities
|
|
9
30
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
workbench/__init__.py,sha256=Kbp7lpicM-LH4ODhViZyas4uuvlDUzZQW8Dioks19Dc,1241
|
|
2
2
|
workbench/algorithms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
workbench/algorithms/dataframe/Readme.md,sha256=ZoCEi2BRJ4ZH0wlkFELTV_njIvYt7Wnhanuv4eoFluw,378
|
|
4
|
-
workbench/algorithms/dataframe/__init__.py,sha256=
|
|
4
|
+
workbench/algorithms/dataframe/__init__.py,sha256=AXpwD4WYOk7odNS9vaKSO0DM-bMRuC93faq0JAltQ54,419
|
|
5
5
|
workbench/algorithms/dataframe/data_source_eda.py,sha256=WgVL6tzBCw1tznQr8RQ6daQnTxQ0-DQUiMwbjztVMSU,1606
|
|
6
6
|
workbench/algorithms/dataframe/feature_space_proximity.py,sha256=6RxzvbpLdDkHMm1D49Nv59SFcyYUj8bisd6_5EpBEGI,3515
|
|
7
|
-
workbench/algorithms/dataframe/fingerprint_proximity.py,sha256=
|
|
7
|
+
workbench/algorithms/dataframe/fingerprint_proximity.py,sha256=nGxfmYQ3bfMtvs90s4p7gaY9DN4gijdDU7R6B2lRHgo,5825
|
|
8
8
|
workbench/algorithms/dataframe/projection_2d.py,sha256=zK4hc0OQrySmfcfFg8y0GxEL34uDNqvZL4OgttB9vRs,7834
|
|
9
|
-
workbench/algorithms/dataframe/proximity.py,sha256=
|
|
9
|
+
workbench/algorithms/dataframe/proximity.py,sha256=AkzcXvSEtbJdJwHYWoitaGOrTMUJZbrPzTvY8q-Fr8s,15383
|
|
10
10
|
workbench/algorithms/dataframe/storage/aggregation.py,sha256=VuTb7A6Vh6IS5djZeItvOLnnEOlf7tzMQ8OaYIuftvU,2852
|
|
11
11
|
workbench/algorithms/dataframe/storage/feature_resolution.py,sha256=w_iLf8EFTg7Jc5laH-bsq8MEtZVqcg05W-GihCqR-r4,9450
|
|
12
12
|
workbench/algorithms/dataframe/storage/feature_spider.py,sha256=uIZ4JHIKuhpy08wBFReSrohb5DGxx8vGroHUbjPm1jE,14353
|
|
@@ -17,7 +17,7 @@ workbench/algorithms/graph/__init__.py,sha256=Hi2vBi-qw2OPLZnCu5qVTDdorRMOd3wNIt
|
|
|
17
17
|
workbench/algorithms/graph/heavy/Readme.md,sha256=QzefnMevGXHBtaP3umzMNn2KEdNQMvJkJNbhkrUw7QE,96
|
|
18
18
|
workbench/algorithms/graph/light/Readme.md,sha256=8kP_hRrRC6JtKtl5qyTwrV6gdO5rz6uq54c8WW1fTLg,122
|
|
19
19
|
workbench/algorithms/graph/light/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
-
workbench/algorithms/graph/light/proximity_graph.py,sha256=
|
|
20
|
+
workbench/algorithms/graph/light/proximity_graph.py,sha256=CdHQ7-Tt_Ab7KrKTsnXR-p8OoX52RiiM6zD0OS4dGK0,9631
|
|
21
21
|
workbench/algorithms/spark/Readme.md,sha256=18bPoFISlT3Ls5t1cBGb5N5Z6lOWyJupQkQxab1wcO4,615
|
|
22
22
|
workbench/algorithms/sql/Readme.md,sha256=fzm4jQ-unJWT-fp5JhIjpApYSAqHUGSiuHE0eNfbF4A,685
|
|
23
23
|
workbench/algorithms/sql/__init__.py,sha256=TbOZQwCfx6Tjc3pCCLCiM31wpCX26j5MBNQ6yG11EwY,462
|
|
@@ -31,11 +31,11 @@ workbench/api/__init__.py,sha256=kvrP70ypDOMdPGj_Eeftdh8J0lu_1qQVne6GXMkD4_E,102
|
|
|
31
31
|
workbench/api/compound.py,sha256=kf5EaM5qjWwsZutcxqj9IC_MPnDV1uVHDMns9OA_GOo,2545
|
|
32
32
|
workbench/api/data_source.py,sha256=Ngz36YZWxFfpJbmURhM1LQPYjh5kdpZNGo6_fCRePbA,8321
|
|
33
33
|
workbench/api/df_store.py,sha256=Wybb3zO-jPpAi2Ns8Ks1-lagvXAaBlRpBZHhnnl3Lms,6131
|
|
34
|
-
workbench/api/endpoint.py,sha256=
|
|
34
|
+
workbench/api/endpoint.py,sha256=spLse2UoAsZdu_ZxmAvMJX_aX-zutAsQ5_SPm9Xt-nA,3839
|
|
35
35
|
workbench/api/feature_set.py,sha256=Yxei3tvWR4gSLcdJnNndux07dNeKNu1HKgsChJtHxEM,6633
|
|
36
36
|
workbench/api/graph_store.py,sha256=LremJyPrQFgsHb7hxsctuCsoxx3p7TKtaY5qALHe6pc,4372
|
|
37
37
|
workbench/api/meta.py,sha256=1_9989cPvf3hd3tA-83hLijOGNnhwXAF8aZF45adeDQ,8596
|
|
38
|
-
workbench/api/model.py,sha256=
|
|
38
|
+
workbench/api/model.py,sha256=apDRhbnbQvSu-krQJm0zQWvbKNs7DUcslMwLKq4edHk,4442
|
|
39
39
|
workbench/api/monitor.py,sha256=Cez89Uac7Tzt47FxkjoX-YDGccEhvBcxw3sZFtw4ud8,4506
|
|
40
40
|
workbench/api/parameter_store.py,sha256=7BObkuATuP6C5AG_46kCWsmuCwuh1vgMJDBSN0gTkwM,4294
|
|
41
41
|
workbench/api/pipeline.py,sha256=MSYGrDSXrRB_oQELtAlOwBfxSBTw3REAkHy5XBHau0Y,6261
|
|
@@ -54,9 +54,9 @@ workbench/core/artifacts/cached_artifact_mixin.py,sha256=ngqFLZ4cQx_TFouXZgXZQsv
|
|
|
54
54
|
workbench/core/artifacts/data_capture_core.py,sha256=q8f79rRTYiZ7T4IQRWXl8ZvPpcvZyNxYERwvo8o0OQc,14858
|
|
55
55
|
workbench/core/artifacts/data_source_abstract.py,sha256=5IRCzFVK-17cd4NXPMRfx99vQAmQ0WHE5jcm5RfsVTg,10619
|
|
56
56
|
workbench/core/artifacts/data_source_factory.py,sha256=YL_tA5fsgubbB3dPF6T4tO0rGgz-6oo3ge4i_YXVC-M,2380
|
|
57
|
-
workbench/core/artifacts/endpoint_core.py,sha256=
|
|
58
|
-
workbench/core/artifacts/feature_set_core.py,sha256
|
|
59
|
-
workbench/core/artifacts/model_core.py,sha256=
|
|
57
|
+
workbench/core/artifacts/endpoint_core.py,sha256=3e7GOWviFvVKU32bKzHGaDAk-wWxuglnZ0nPEXB0LXE,52200
|
|
58
|
+
workbench/core/artifacts/feature_set_core.py,sha256=-4_FR4lLGHoeOkPRsAliEubVqZgai2RJJr1qJMo9Wao,36645
|
|
59
|
+
workbench/core/artifacts/model_core.py,sha256=9UBuIm0xjFZlIlJ5YX945y5tGaAYz0YzlT5LWk_oG98,51156
|
|
60
60
|
workbench/core/artifacts/monitor_core.py,sha256=M307yz7tEzOEHgv-LmtVy9jKjSbM98fHW3ckmNYrwlU,27897
|
|
61
61
|
workbench/core/cloud_platform/cloud_meta.py,sha256=-g4-LTC3D0PXb3VfaXdLR1ERijKuHdffeMK_zhD-koQ,8809
|
|
62
62
|
workbench/core/cloud_platform/aws/README.md,sha256=QT5IQXoUHbIA0qQ2wO6_2P2lYjYQFVYuezc22mWY4i8,97
|
|
@@ -102,7 +102,7 @@ workbench/core/transforms/features_to_features/__init__.py,sha256=47DEQpj8HBSa-_
|
|
|
102
102
|
workbench/core/transforms/features_to_features/heavy/emr/Readme.md,sha256=YtQgCEQeKe0CQXQkhzMTYq9xOtCsCYb5P5LW2BmRKWQ,68
|
|
103
103
|
workbench/core/transforms/features_to_features/heavy/glue/Readme.md,sha256=TuyCatWfoDr99zUwvOcxf-TqMkQzaMqXlj5nmFcRzfo,48
|
|
104
104
|
workbench/core/transforms/features_to_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
105
|
-
workbench/core/transforms/features_to_model/features_to_model.py,sha256=
|
|
105
|
+
workbench/core/transforms/features_to_model/features_to_model.py,sha256=cExOKz6lrpSMQk2TgUDhiF9jxzAiOtrKSmasKlWVCO4,20110
|
|
106
106
|
workbench/core/transforms/model_to_endpoint/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
107
107
|
workbench/core/transforms/model_to_endpoint/model_to_endpoint.py,sha256=TIYXvuK0s383PwJ4iS6fCRhuif6oIxsoWb4CpMGJjY4,6358
|
|
108
108
|
workbench/core/transforms/pandas_transforms/__init__.py,sha256=xL4MT8-fZ1SFqDbTLc8XyxjupHtB1YR6Ej0AC2nwd7I,894
|
|
@@ -118,8 +118,8 @@ workbench/core/views/create_view.py,sha256=2Ykzb2NvJGoD4PP4k2Bka46GDog9iGG5SWnAc
|
|
|
118
118
|
workbench/core/views/display_view.py,sha256=9K4O77ZnKOh93aMRhxcQJQ1lqScLhuJnU_tHtYZ_U4E,2598
|
|
119
119
|
workbench/core/views/inference_view.py,sha256=9s70M0dFdGq0tWvzMZfgUK7EPKtuvcQhux0uyRZuuLM,3293
|
|
120
120
|
workbench/core/views/pandas_to_view.py,sha256=20uCsnG2iMh-U1VxqVUUtnrWAY98SeuHjmfJK_wcq1I,6422
|
|
121
|
-
workbench/core/views/training_view.py,sha256=
|
|
122
|
-
workbench/core/views/view.py,sha256=
|
|
121
|
+
workbench/core/views/training_view.py,sha256=7HwhbQhDBhT3Zo_gssS-b4eueJ0h9nqqT8YGFSuaEcU,9016
|
|
122
|
+
workbench/core/views/view.py,sha256=8pZSVDhOFMnAh49ccvnvjQs0dWpiA5IeHaYrztRcqkM,13532
|
|
123
123
|
workbench/core/views/view_utils.py,sha256=CwOlpqXpumCr6REi-ey7Qjz5_tpg-s4oWHmlOVu8POQ,12270
|
|
124
124
|
workbench/core/views/storage/mdq_view.py,sha256=qf_ep1KwaXOIfO930laEwNIiCYP7VNOqjE3VdHfopRE,5195
|
|
125
125
|
workbench/model_scripts/script_generation.py,sha256=dLxVRrvrrI_HQatJRAXta6UEbFFbkgITNvDJllQZyCM,7905
|
|
@@ -133,7 +133,7 @@ workbench/model_scripts/custom_models/meta_endpoints/example.py,sha256=hzOAuLhIG
|
|
|
133
133
|
workbench/model_scripts/custom_models/network_security/Readme.md,sha256=Z2gtiu0hLHvEJ1x-_oFq3qJZcsK81sceBAGAGltpqQ8,222
|
|
134
134
|
workbench/model_scripts/custom_models/proximity/Readme.md,sha256=RlMFAJZgAT2mCgDk-UwR_R0Y_NbCqeI5-8DUsxsbpWQ,289
|
|
135
135
|
workbench/model_scripts/custom_models/proximity/feature_space_proximity.template,sha256=eOllmqB20BWtTiV53dgpIqXKtgSbPFDW_zf8PvM3oF0,4813
|
|
136
|
-
workbench/model_scripts/custom_models/proximity/proximity.py,sha256=
|
|
136
|
+
workbench/model_scripts/custom_models/proximity/proximity.py,sha256=AkzcXvSEtbJdJwHYWoitaGOrTMUJZbrPzTvY8q-Fr8s,15383
|
|
137
137
|
workbench/model_scripts/custom_models/proximity/requirements.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
138
|
workbench/model_scripts/custom_models/uq_models/Readme.md,sha256=UVpL-lvtTrLqwBeQFinLhd_uNrEw4JUlggIdUSDrd-w,188
|
|
139
139
|
workbench/model_scripts/custom_models/uq_models/bayesian_ridge.template,sha256=ca3CaAk6HVuNv1HnPgABTzRY3oDrRxomjgD4V1ZDwoc,6448
|
|
@@ -141,22 +141,25 @@ workbench/model_scripts/custom_models/uq_models/ensemble_xgb.template,sha256=xlK
|
|
|
141
141
|
workbench/model_scripts/custom_models/uq_models/gaussian_process.template,sha256=3nMlCi8nEbc4N-MQTzjfIcljfDQkUmWeLBfmd18m5fg,6632
|
|
142
142
|
workbench/model_scripts/custom_models/uq_models/meta_uq.template,sha256=XTfhODRaHlI1jZGo9pSe-TqNsk2_nuSw0xMO2fKzDv8,14011
|
|
143
143
|
workbench/model_scripts/custom_models/uq_models/ngboost.template,sha256=v1rviYTJGJnQRGgAyveXhOQlS-WFCTlc2vdnWq6HIXk,8241
|
|
144
|
-
workbench/model_scripts/custom_models/uq_models/proximity.py,sha256=
|
|
144
|
+
workbench/model_scripts/custom_models/uq_models/proximity.py,sha256=AkzcXvSEtbJdJwHYWoitaGOrTMUJZbrPzTvY8q-Fr8s,15383
|
|
145
145
|
workbench/model_scripts/custom_models/uq_models/requirements.txt,sha256=fw7T7t_YJAXK3T6Ysbesxh_Agx_tv0oYx72cEBTqRDY,98
|
|
146
146
|
workbench/model_scripts/custom_script_example/custom_model_script.py,sha256=T8aydawgRVAdSlDimoWpXxG2YuWWQkbcjBVjAeSG2_0,6408
|
|
147
147
|
workbench/model_scripts/custom_script_example/requirements.txt,sha256=jWlGc7HH7vqyukTm38LN4EyDi8jDUPEay4n45z-30uc,104
|
|
148
148
|
workbench/model_scripts/ensemble_xgb/ensemble_xgb.template,sha256=pWmuo-EVz0owvkRI-h9mUTYt1-ouyD-_yyQu6SQbYZ4,10350
|
|
149
149
|
workbench/model_scripts/ensemble_xgb/requirements.txt,sha256=jWlGc7HH7vqyukTm38LN4EyDi8jDUPEay4n45z-30uc,104
|
|
150
|
+
workbench/model_scripts/pytorch_model/generated_model_script.py,sha256=PG9MbcJrWcOxS9kl4tAZqfCjDKxvZpG4LGbHyPBRsmo,26231
|
|
150
151
|
workbench/model_scripts/pytorch_model/pytorch.template,sha256=_gRp6DH294FLxF21UpSTq7s9RFfrLjViKvjXQ4yDfBQ,21999
|
|
151
152
|
workbench/model_scripts/pytorch_model/requirements.txt,sha256=ICS5nW0wix44EJO2tJszJSaUrSvhSfdedn6FcRInGx4,181
|
|
152
153
|
workbench/model_scripts/scikit_learn/requirements.txt,sha256=aVvwiJ3LgBUhM_PyFlb2gHXu_kpGPho3ANBzlOkfcvs,107
|
|
153
154
|
workbench/model_scripts/scikit_learn/scikit_learn.template,sha256=QQvqx-eX9ZTbYmyupq6R6vIQwosmsmY_MRBPaHyfjdk,12586
|
|
154
|
-
workbench/model_scripts/uq_models/
|
|
155
|
+
workbench/model_scripts/uq_models/generated_model_script.py,sha256=TGel0KUZyUmJvBhEXh7unpqq4I8KV-NDeVU8gLvGlvQ,27194
|
|
156
|
+
workbench/model_scripts/uq_models/mapie.template,sha256=lq_kG9aRE_7_Or_jVfM4M5zkn9A1fEatneKI7_2zLQs,22784
|
|
155
157
|
workbench/model_scripts/uq_models/requirements.txt,sha256=fw7T7t_YJAXK3T6Ysbesxh_Agx_tv0oYx72cEBTqRDY,98
|
|
158
|
+
workbench/model_scripts/xgb_model/generated_model_script.py,sha256=jp4OCWdH_j5dc2ZxUMdlxSumZohbV02w9HWrCRt-8kc,18083
|
|
156
159
|
workbench/model_scripts/xgb_model/requirements.txt,sha256=jWlGc7HH7vqyukTm38LN4EyDi8jDUPEay4n45z-30uc,104
|
|
157
160
|
workbench/model_scripts/xgb_model/xgb_model.template,sha256=0uXknIEqgUaIFUfu2gfkxa3WHUr8HBBqBepGUTDvrhQ,17917
|
|
158
161
|
workbench/repl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
159
|
-
workbench/repl/workbench_shell.py,sha256=
|
|
162
|
+
workbench/repl/workbench_shell.py,sha256=cbFaKaRyAJd79i8m6-3OIVK0f-W_wARwJbjxhqC11_s,22135
|
|
160
163
|
workbench/resources/open_source_api.key,sha256=3S0OTblsmC0msUPdE_dbBmI83xJNmYscuwLJ57JmuOc,433
|
|
161
164
|
workbench/resources/signature_verify_pub.pem,sha256=V3-u-3_z2PH-805ybkKvzDOBwAbvHxcKn0jLBImEtzM,272
|
|
162
165
|
workbench/scripts/check_double_bond_stereo.py,sha256=p5hnL54Weq77ES0HCELq9JeoM-PyUGkvVSeWYF2dKyo,7776
|
|
@@ -213,7 +216,7 @@ workbench/utils/lambda_utils.py,sha256=7GhGRPyXn9o-toWb9HBGSnI8-DhK9YRkwhCSk_mNK
|
|
|
213
216
|
workbench/utils/license_manager.py,sha256=lNE9zZIglmX3zqqCKBdN1xqTgHCEZgJDxavF6pdG7fc,6825
|
|
214
217
|
workbench/utils/log_utils.py,sha256=7n1NJXO_jUX82e6LWAQug6oPo3wiPDBYsqk9gsYab_A,3167
|
|
215
218
|
workbench/utils/markdown_utils.py,sha256=4lEqzgG4EVmLcvvKKNUwNxVCySLQKJTJmWDiaDroI1w,8306
|
|
216
|
-
workbench/utils/model_utils.py,sha256=
|
|
219
|
+
workbench/utils/model_utils.py,sha256=3hh4ZiZ58RZ8ahAGxz2BcvPMj3mxYIDCOw-ZiBIPlCI,14029
|
|
217
220
|
workbench/utils/monitor_utils.py,sha256=kVaJ7BgUXs3VPMFYfLC03wkIV4Dq-pEhoXS0wkJFxCc,7858
|
|
218
221
|
workbench/utils/pandas_utils.py,sha256=uTUx-d1KYfjbS9PMQp2_9FogCV7xVZR6XLzU5YAGmfs,39371
|
|
219
222
|
workbench/utils/performance_utils.py,sha256=WDNvz-bOdC99cDuXl0urAV4DJ7alk_V3yzKPwvqgST4,1329
|
|
@@ -235,7 +238,7 @@ workbench/utils/workbench_cache.py,sha256=IQchxB81iR4eVggHBxUJdXxUCRkqWz1jKe5gxN
|
|
|
235
238
|
workbench/utils/workbench_event_bridge.py,sha256=z1GmXOB-Qs7VOgC6Hjnp2DI9nSEWepaSXejACxTIR7o,4150
|
|
236
239
|
workbench/utils/workbench_logging.py,sha256=WCuMWhQwibrvcGAyj96h2wowh6dH7zNlDJ7sWUzdCeI,10263
|
|
237
240
|
workbench/utils/workbench_sqs.py,sha256=RwM80z7YWwdtMaCKh7KWF8v38f7eBRU7kyC7ZhTRuI0,2072
|
|
238
|
-
workbench/utils/xgboost_model_utils.py,sha256=
|
|
241
|
+
workbench/utils/xgboost_model_utils.py,sha256=WXSDMt4Ae6ClihYanywzduMJ8FdaT_bWKS_1ut-Z28Q,24853
|
|
239
242
|
workbench/utils/chem_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
240
243
|
workbench/utils/chem_utils/fingerprints.py,sha256=Qvs8jaUwguWUq3Q3j695MY0t0Wk3BvroW-oWBwalMUo,5255
|
|
241
244
|
workbench/utils/chem_utils/misc.py,sha256=Nevf8_opu-uIPrv_1_0ubuFVVo2_fGUkMoLAHB3XAeo,7372
|
|
@@ -251,9 +254,9 @@ workbench/web_interface/components/component_interface.py,sha256=QCPWqiZLkVsAEzQ
|
|
|
251
254
|
workbench/web_interface/components/correlation_matrix.py,sha256=Lv4vRta5-TdxBsu0G8Ea7hyyR3XyPes-k5AfL6qZWEc,6376
|
|
252
255
|
workbench/web_interface/components/data_details_markdown.py,sha256=axDs6eXniglBmvFwIKjpJ5oyT-3D4FO9IcfA_cl-EJ8,9706
|
|
253
256
|
workbench/web_interface/components/endpoint_metric_plots.py,sha256=H0cXuj9UQrrh_2JvRHtq7O8pMXFXKs7o9XpzySENylw,3441
|
|
254
|
-
workbench/web_interface/components/model_plot.py,sha256=
|
|
257
|
+
workbench/web_interface/components/model_plot.py,sha256=Rojx_ZED4P9gvgeEsUm6xnwMNPoeOyn0evw45BWTITc,2536
|
|
255
258
|
workbench/web_interface/components/plugin_interface.py,sha256=jGRq4igUTVXUT4sDqqsKKI2yjilV0ORNBQq6CjEWE84,9563
|
|
256
|
-
workbench/web_interface/components/plugin_unit_test.py,sha256=
|
|
259
|
+
workbench/web_interface/components/plugin_unit_test.py,sha256=Lx3HhIMHzrwDUYs2bADSFYzQq3sFHS9RyA415hyUOdc,7747
|
|
257
260
|
workbench/web_interface/components/regression_plot.py,sha256=k18Bd0fcH7ig6kL5GqC_dINci3_YLle_fSEM32zXtzY,3342
|
|
258
261
|
workbench/web_interface/components/violin_plots.py,sha256=3_T85hIs_R_WZpfFkSrqY2eYXmYzWsywDqsLhB7W1RQ,5320
|
|
259
262
|
workbench/web_interface/components/experiments/dashboard_metric_plots.py,sha256=DPIw13tO9XOGxA6IeRPLgl-C3XUJ2N287JkSEg73Rjg,2984
|
|
@@ -266,7 +269,7 @@ workbench/web_interface/components/plugins/endpoint_details.py,sha256=0A7g_Lx5-3
|
|
|
266
269
|
workbench/web_interface/components/plugins/generated_compounds.py,sha256=A6JGlkl7buZUugPK21YgufVFDRoGlHJowaqf8PAmz_s,8056
|
|
267
270
|
workbench/web_interface/components/plugins/graph_plot.py,sha256=JFzuSH_CkEmlaLAgFpzmiEpS3sXov0ycnCfP0VLsK2g,14502
|
|
268
271
|
workbench/web_interface/components/plugins/license_details.py,sha256=UyMSBGxEgdp3m9szDkDUAl_Ua8C5a4RNMdYpYCx354M,5497
|
|
269
|
-
workbench/web_interface/components/plugins/model_details.py,sha256=
|
|
272
|
+
workbench/web_interface/components/plugins/model_details.py,sha256=FiEFw3KJkbJ5igUotYbHLSeI0BEi7-umoLdvRapR2BI,10243
|
|
270
273
|
workbench/web_interface/components/plugins/molecule_panel.py,sha256=xGCEI5af8F5lNId5eKUpetdQs_ahnIPdW6U7wKvbz2o,3515
|
|
271
274
|
workbench/web_interface/components/plugins/molecule_viewer.py,sha256=xavixcu4RNzh6Nj_-3-XlK09DgpNx5jGmo3wEPNftiE,4529
|
|
272
275
|
workbench/web_interface/components/plugins/pipeline_details.py,sha256=caiFIakHk-1dGGNW7wlio2X7iAm2_tCNbSjDzoRWGEk,5534
|
|
@@ -280,9 +283,9 @@ workbench/web_interface/page_views/main_page.py,sha256=X4-KyGTKLAdxR-Zk2niuLJB2Y
|
|
|
280
283
|
workbench/web_interface/page_views/models_page_view.py,sha256=M0bdC7bAzLyIaE2jviY12FF4abdMFZmg6sFuOY_LaGI,2650
|
|
281
284
|
workbench/web_interface/page_views/page_view.py,sha256=Gh6YnpOGlUejx-bHZAf5pzqoQ1H1R0OSwOpGhOBO06w,455
|
|
282
285
|
workbench/web_interface/page_views/pipelines_page_view.py,sha256=v2pxrIbsHBcYiblfius3JK766NZ7ciD2yPx0t3E5IJo,2656
|
|
283
|
-
workbench-0.8.
|
|
284
|
-
workbench-0.8.
|
|
285
|
-
workbench-0.8.
|
|
286
|
-
workbench-0.8.
|
|
287
|
-
workbench-0.8.
|
|
288
|
-
workbench-0.8.
|
|
286
|
+
workbench-0.8.197.dist-info/licenses/LICENSE,sha256=RTBoTMeEwTgEhS-n8vgQ-VUo5qig0PWVd8xFPKU6Lck,1080
|
|
287
|
+
workbench-0.8.197.dist-info/METADATA,sha256=SBIr8UPVmyTRIItzlTYkNqGDk1zxXLLEb4XpbyO7bn0,10495
|
|
288
|
+
workbench-0.8.197.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
289
|
+
workbench-0.8.197.dist-info/entry_points.txt,sha256=o7ohD4D2oygnHp7i9-C0LfcHDuPW5Tv0JXGAg97DpGk,413
|
|
290
|
+
workbench-0.8.197.dist-info/top_level.txt,sha256=Dhy72zTxaA_o_yRkPZx5zw-fwumnjGaeGf0hBN3jc_w,10
|
|
291
|
+
workbench-0.8.197.dist-info/RECORD,,
|