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.
Files changed (30) hide show
  1. workbench/algorithms/dataframe/__init__.py +1 -2
  2. workbench/algorithms/dataframe/fingerprint_proximity.py +2 -2
  3. workbench/algorithms/dataframe/proximity.py +212 -234
  4. workbench/algorithms/graph/light/proximity_graph.py +8 -7
  5. workbench/api/endpoint.py +2 -3
  6. workbench/api/model.py +2 -5
  7. workbench/core/artifacts/endpoint_core.py +25 -16
  8. workbench/core/artifacts/feature_set_core.py +126 -4
  9. workbench/core/artifacts/model_core.py +37 -55
  10. workbench/core/transforms/features_to_model/features_to_model.py +3 -3
  11. workbench/core/views/training_view.py +75 -0
  12. workbench/core/views/view.py +1 -1
  13. workbench/model_scripts/custom_models/proximity/proximity.py +212 -234
  14. workbench/model_scripts/custom_models/uq_models/proximity.py +212 -234
  15. workbench/model_scripts/pytorch_model/generated_model_script.py +567 -0
  16. workbench/model_scripts/uq_models/generated_model_script.py +589 -0
  17. workbench/model_scripts/uq_models/mapie.template +103 -6
  18. workbench/model_scripts/xgb_model/generated_model_script.py +468 -0
  19. workbench/repl/workbench_shell.py +3 -3
  20. workbench/utils/model_utils.py +25 -10
  21. workbench/utils/xgboost_model_utils.py +117 -47
  22. workbench/web_interface/components/model_plot.py +7 -1
  23. workbench/web_interface/components/plugin_unit_test.py +5 -2
  24. workbench/web_interface/components/plugins/model_details.py +9 -7
  25. {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/METADATA +23 -2
  26. {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/RECORD +30 -27
  27. {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/licenses/LICENSE +1 -1
  28. {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/WHEEL +0 -0
  29. {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/entry_points.txt +0 -0
  30. {workbench-0.8.192.dist-info → workbench-0.8.197.dist-info}/top_level.txt +0 -0
@@ -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 our Training Data
117
- df = model.training_view().pull_dataframe()
118
- return Proximity(df, id_column, features, target, track_columns=features)
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
- with tarfile.open(local_tar_path, "r:gz") as tar:
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
- with tarfile.open(local_tar_path, "r:gz") as tar:
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[Dict[str, Any], pd.DataFrame]:
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
- - Dictionary containing:
273
- - folds: Dictionary of formatted strings for each fold
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 {}, pd.DataFrame()
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
- xgb_model = loaded_model
289
- is_classifier = isinstance(xgb_model, xgb.XGBClassifier)
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 {}, pd.DataFrame()
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 features to categorical
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].dtype in ["object", "string"]:
314
- df[col] = df[col].astype("category")
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}) # Keep original values
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
- fold_metrics.append({"fold": fold_idx, "precision": prec, "recall": rec, "fscore": f1})
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 (mean ± std)
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
- # Format fold results for display
379
- formatted_folds = {}
380
- for _, row in fold_df.iterrows():
381
- fold_key = f"Fold {int(row['fold'])}"
382
- if is_classifier:
383
- formatted_folds[fold_key] = (
384
- f"precision: {row['precision']:.3f} " f"recall: {row['recall']:.3f} " f"fscore: {row['fscore']:.3f}"
385
- )
386
- else:
387
- formatted_folds[fold_key] = (
388
- f"rmse: {row['rmse']:.3f} "
389
- f"mae: {row['mae']:.3f} "
390
- f"medae: {row['medae']:.3f} "
391
- f"r2: {row['r2']:.3f} "
392
- f"spearmanr: {row['spearmanr']:.3f}"
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
- # Build return dictionary
396
- metrics_dict = {"summary_metrics": summary_metrics, "folds": formatted_folds}
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 metrics_dict, predictions_df
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 features to categorical
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].dtype in ["object", "string"]:
446
- df[col] = df[col].astype("category")
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(df, color="error", regression_line=True)[0]
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 # Increment the port number until an available one is found
159
+ self.port += 1
160
160
 
161
161
  log.info(f"Starting Dash server on port {self.port}...")
162
- self.app.run(debug=True, use_reloader=False, port=self.port)
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, cross_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
- # Set "auto_inference" as the default, if that doesn't exist, set the first
253
- default_inference_run = "auto_inference" if "auto_inference" in inference_runs else inference_runs[0]
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.192
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-Expression: MIT
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=n5dRcEXK6URKXeWoCf8XhMWxDalUdEWAK6YYBQfe8NY,455
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=zqvk2WfY_nRFGC5bYcBbooGfSZsAhZBS8HNQ0GSMpwg,5838
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=P8f3GHRhuc4QHj5KkKW0JMrHhIo2QdBiFG-JituTV1U,14633
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=cwPqyswX4l4my8yGyC3LDZ0Jc5ZkVFx3N6W8xFxfzEY,9651
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=RDQs78OFRSp9GYGHHph0gLtAfF4p3We96bzdJ4-9bzw,3926
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=coIl2QwbfyeVBM_Y2SaU587ioBh2TTDC9r9bOuYme9U,4605
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=VH-q-R4pfKyjCOXl2Gq1pxMNf4Ir0YdMw9YIHqd7CVU,51974
58
- workbench/core/artifacts/feature_set_core.py,sha256=6qOJoJ9_qwtyz4neFY6vMn73Ujjeut7E0dy_e8nYfSE,31462
59
- workbench/core/artifacts/model_core.py,sha256=vVERAD7cmYW8Y9tG8FmT7GMCWiudj8rJ4wfmucWrHUI,52287
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=qdE7sKMWPERpmDBsBOAAkZ94FzNZftDmUMNu0Mjq6ns,20115
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=Wk5fWvnoapngGCHEkqYzRvSNw2f-ZRvhsrzRMYGZfuE,6274
122
- workbench/core/views/view.py,sha256=QdUSGcrNzpzcwkSkutyptqrlXJZZReWzd2Uc6xQRd8A,13524
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=P8f3GHRhuc4QHj5KkKW0JMrHhIo2QdBiFG-JituTV1U,14633
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=P8f3GHRhuc4QHj5KkKW0JMrHhIo2QdBiFG-JituTV1U,14633
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/mapie.template,sha256=2HIwB_658IsZiLIV1RViIZBIGgXxDsJPZinDUu8SchU,18961
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=Gw7-tWCc6k7nwWrEimg-YuQOnWCsOzc2QMiX3Rt-Wpk,22131
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=THs0GXkZdJLkk-sMxEo_wu7-ouGrJZdlN99yDUzO5xk,13515
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=K0lbeb6LpS5oyN8cmK5Mfzz89n9q3p6ikvN39U9rvQw,22090
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=fgmOOxdrRkXN2-uNhY3K-pOsY34I-wcfy2MAnhr9ehY,2415
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=UBZtGztLk2oJMDXfExfxkhHdmXr6ayv4NS0RpwGc8ro,7704
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=BBvT3zdGHpRWz4V9SpNO0AFMPaExWMbNAE1_onfCGRI,10294
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.192.dist-info/licenses/LICENSE,sha256=z4QMMPlLJkZjU8VOKqJkZiQZCEZ--saIU2Z8-p3aVc0,1080
284
- workbench-0.8.192.dist-info/METADATA,sha256=dlskxjoY82E7I0Z-JwO802MdU6hTmk5eWD5hwn1ahq8,9261
285
- workbench-0.8.192.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
286
- workbench-0.8.192.dist-info/entry_points.txt,sha256=o7ohD4D2oygnHp7i9-C0LfcHDuPW5Tv0JXGAg97DpGk,413
287
- workbench-0.8.192.dist-info/top_level.txt,sha256=Dhy72zTxaA_o_yRkPZx5zw-fwumnjGaeGf0hBN3jc_w,10
288
- workbench-0.8.192.dist-info/RECORD,,
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,,