workbench 0.8.330__tar.gz → 0.8.332__tar.gz

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 (909) hide show
  1. {workbench-0.8.330 → workbench-0.8.332}/PKG-INFO +2 -2
  2. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/build_logp_logd_overlap.py +29 -19
  3. workbench-0.8.332/data/public_data/overlap_summary.py +128 -0
  4. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/3d_descriptors.md +47 -8
  5. workbench-0.8.332/docs/blogs/chemprop_multi_task.md +129 -0
  6. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/index.md +2 -0
  7. workbench-0.8.332/docs/images/chemprop_mt_expansion.svg +111 -0
  8. workbench-0.8.332/docs/images/chemprop_mt_transfer.svg +105 -0
  9. workbench-0.8.332/docs/images/chemprop_overview.svg +112 -0
  10. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/model_scripts/molecular_utils/mol_descriptors_3d.py +30 -15
  11. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/smiles_to_3d_full_v1.py +4 -14
  12. {workbench-0.8.330 → workbench-0.8.332}/mkdocs.yml +1 -0
  13. {workbench-0.8.330 → workbench-0.8.332}/pyproject.toml +1 -1
  14. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/base/inference/requirements.txt +1 -1
  15. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/base/training/requirements.txt +1 -1
  16. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/ml_pipelines/Dockerfile +1 -1
  17. {workbench-0.8.330 → workbench-0.8.332}/scripts/admet/partition_aqsol_alignment.py +4 -4
  18. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/inference_cache_concurrency_check.py +2 -2
  19. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/__init__.py +2 -2
  20. workbench-0.8.332/src/workbench/algorithms/dataframe/multi_task_alignment.py +443 -0
  21. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/endpoint.py +73 -1
  22. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/inference_cache.py +8 -73
  23. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/meta_endpoint.py +89 -65
  24. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/model.py +5 -0
  25. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/async_endpoint_core.py +93 -17
  26. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/endpoint_core.py +0 -2
  27. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/model_to_endpoint/model_to_endpoint.py +8 -17
  28. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/chemprop/chemprop.template +98 -8
  29. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/meta_endpoint/meta_endpoint.template +6 -6
  30. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/meta_endpoint/meta_endpoint_dag.py +63 -41
  31. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/mol_descriptors_3d.py +30 -15
  32. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/endpoint_autoscaling.py +5 -1
  33. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/inference_cache_utils.py +15 -16
  34. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/meta_endpoint_dag.py +63 -41
  35. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/multi_task.py +3 -360
  36. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/synthetic_data_generator.py +3 -2
  37. workbench-0.8.332/src/workbench/web_interface/components/plugins/multi_task_alignment_map.py +519 -0
  38. {workbench-0.8.330 → workbench-0.8.332}/src/workbench.egg-info/PKG-INFO +2 -2
  39. {workbench-0.8.330 → workbench-0.8.332}/src/workbench.egg-info/SOURCES.txt +6 -3
  40. {workbench-0.8.330 → workbench-0.8.332}/src/workbench.egg-info/requires.txt +1 -1
  41. workbench-0.8.330/data/public_data/overlap_summary.py +0 -152
  42. workbench-0.8.330/src/workbench/algorithms/dataframe/dataset_comparison.py +0 -401
  43. workbench-0.8.330/src/workbench/web_interface/components/plugins/concordance_explorer.py +0 -194
  44. workbench-0.8.330/src/workbench/web_interface/components/plugins/concordance_map.py +0 -392
  45. {workbench-0.8.330 → workbench-0.8.332}/.flake8 +0 -0
  46. {workbench-0.8.330 → workbench-0.8.332}/.gitattributes +0 -0
  47. {workbench-0.8.330 → workbench-0.8.332}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  48. {workbench-0.8.330 → workbench-0.8.332}/.github/dependabot.yml +0 -0
  49. {workbench-0.8.330 → workbench-0.8.332}/.github/workflows/deploy-docs.yml +0 -0
  50. {workbench-0.8.330 → workbench-0.8.332}/.github/workflows/publish.yml +0 -0
  51. {workbench-0.8.330 → workbench-0.8.332}/.github/workflows/python-lint.yml +0 -0
  52. {workbench-0.8.330 → workbench-0.8.332}/.gitignore +0 -0
  53. {workbench-0.8.330 → workbench-0.8.332}/CONTRIBUTING.md +0 -0
  54. {workbench-0.8.330 → workbench-0.8.332}/Dockerfile +0 -0
  55. {workbench-0.8.330 → workbench-0.8.332}/LICENSE +0 -0
  56. {workbench-0.8.330 → workbench-0.8.332}/Makefile +0 -0
  57. {workbench-0.8.330 → workbench-0.8.332}/README.md +0 -0
  58. {workbench-0.8.330 → workbench-0.8.332}/SECURITY.md +0 -0
  59. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/.gitignore +0 -0
  60. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/Dockerfile +0 -0
  61. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/README.md +0 -0
  62. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/app.py +0 -0
  63. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/assets/favicon.ico +0 -0
  64. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/dashboard +0 -0
  65. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/deploy.sh +0 -0
  66. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/open_source_config.json +0 -0
  67. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/data_sources/callbacks.py +0 -0
  68. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/data_sources/layout.py +0 -0
  69. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/data_sources/page.py +0 -0
  70. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/endpoints/callbacks.py +0 -0
  71. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/endpoints/layout.py +0 -0
  72. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/endpoints/page.py +0 -0
  73. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/feature_sets/callbacks.py +0 -0
  74. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/feature_sets/layout.py +0 -0
  75. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/feature_sets/page.py +0 -0
  76. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/license/page.py +0 -0
  77. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/main/callbacks.py +0 -0
  78. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/main/layout.py +0 -0
  79. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/main/page.py +0 -0
  80. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/models/callbacks.py +0 -0
  81. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/models/layout.py +0 -0
  82. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/models/page.py +0 -0
  83. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/pages/status/page.py +0 -0
  84. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/static/dark.css +0 -0
  85. {workbench-0.8.330 → workbench-0.8.332}/applications/aws_dashboard/static/light.css +0 -0
  86. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/Dockerfile +0 -0
  87. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/README.md +0 -0
  88. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/app.py +0 -0
  89. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/assets/favicon.ico +0 -0
  90. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/callbacks.py +0 -0
  91. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/explorer +0 -0
  92. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/layout.py +0 -0
  93. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/nginx.conf +0 -0
  94. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/open_source_config.json +0 -0
  95. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/requirements.txt +0 -0
  96. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/storage/callbacks.py +0 -0
  97. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/storage/callbacks_new.py +0 -0
  98. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/storage/layout_new.py +0 -0
  99. {workbench-0.8.330 → workbench-0.8.332}/applications/compound_explorer/supervisord.conf +0 -0
  100. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/aws_account_setup.py +0 -0
  101. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/aws_identity_check.py +0 -0
  102. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/build_ml_pipeline.py +0 -0
  103. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/compound_explorer/.gitignore +0 -0
  104. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/compound_explorer/README.md +0 -0
  105. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/compound_explorer/app.py +0 -0
  106. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/compound_explorer/cdk.json +0 -0
  107. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/compound_explorer/compound_explorer/__init__.py +0 -0
  108. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/compound_explorer/compound_explorer/compound_explorer_stack.py +0 -0
  109. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/compound_explorer/requirements.txt +0 -0
  110. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/event_bridge/Readme.md +0 -0
  111. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_compute/README.md +0 -0
  112. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_compute/app.py +0 -0
  113. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_compute/cdk.json +0 -0
  114. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_compute/requirements.txt +0 -0
  115. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_compute/workbench_compute/__init__.py +0 -0
  116. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_compute/workbench_compute/lambdas/batch_failure/handler.py +0 -0
  117. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_compute/workbench_compute/lambdas/batch_trigger/handler.py +0 -0
  118. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_compute/workbench_compute/workbench_compute_stack.py +0 -0
  119. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/.gitignore +0 -0
  120. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/README.md +0 -0
  121. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/app.py +0 -0
  122. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/cdk.json +0 -0
  123. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/requirements-dev.txt +0 -0
  124. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/requirements.txt +0 -0
  125. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/source.bat +0 -0
  126. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/workbench_core/__init__.py +0 -0
  127. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_core/workbench_core/workbench_core_stack.py +0 -0
  128. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/.gitignore +0 -0
  129. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/README.md +0 -0
  130. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/app.py +0 -0
  131. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/cdk.json +0 -0
  132. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/requirements-dev.txt +0 -0
  133. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/requirements.txt +0 -0
  134. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/source.bat +0 -0
  135. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/workbench_dashboard_full/__init__.py +0 -0
  136. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_full/workbench_dashboard_full/workbench_dashboard_stack.py +0 -0
  137. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_lite/.gitignore +0 -0
  138. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_lite/README.md +0 -0
  139. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_lite/app.py +0 -0
  140. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_lite/cdk.json +0 -0
  141. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_lite/requirements.txt +0 -0
  142. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_lite/workbench_dashboard_lite/__init__.py +0 -0
  143. {workbench-0.8.330 → workbench-0.8.332}/aws_setup/workbench_dashboard_lite/workbench_dashboard_lite/workbench_dashboard_stack.py +0 -0
  144. {workbench-0.8.330 → workbench-0.8.332}/data/abalone.csv +0 -0
  145. {workbench-0.8.330 → workbench-0.8.332}/data/karate_graph.json +0 -0
  146. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/README.md +0 -0
  147. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/alignment_utils.py +0 -0
  148. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/build_synthetic_multi_task.py +0 -0
  149. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/descriptions.json +0 -0
  150. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/pull_common.py +0 -0
  151. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/pull_logd_data.py +0 -0
  152. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/pull_logp_data.py +0 -0
  153. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/requirements.txt +0 -0
  154. {workbench-0.8.330 → workbench-0.8.332}/data/public_data/upload_data.py +0 -0
  155. {workbench-0.8.330 → workbench-0.8.332}/data/test_data.csv +0 -0
  156. {workbench-0.8.330 → workbench-0.8.332}/data/test_data.json +0 -0
  157. {workbench-0.8.330 → workbench-0.8.332}/data/wine_dataset.csv +0 -0
  158. {workbench-0.8.330 → workbench-0.8.332}/deploy_docker.sh +0 -0
  159. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/aws_service_limits.md +0 -0
  160. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/base_docker_push.md +0 -0
  161. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/dashboard_docker_push.md +0 -0
  162. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/dashboard_s3_plugins.md +0 -0
  163. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/explorer_docker_push.md +0 -0
  164. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/images/dashboard_secret_click.png +0 -0
  165. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/images/serverless_quotas.png +0 -0
  166. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/images/status_showing_S3_path.png +0 -0
  167. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/pypi_release.md +0 -0
  168. {workbench-0.8.330 → workbench-0.8.332}/docs/admin/workbench_docker_for_lambdas.md +0 -0
  169. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/async_endpoint.md +0 -0
  170. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/data_source.md +0 -0
  171. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/df_store.md +0 -0
  172. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/endpoint.md +0 -0
  173. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/feature_set.md +0 -0
  174. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/inference_cache.md +0 -0
  175. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/meta.md +0 -0
  176. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/model.md +0 -0
  177. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/monitor.md +0 -0
  178. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/overview.md +0 -0
  179. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/parameter_store.md +0 -0
  180. {workbench-0.8.330 → workbench-0.8.332}/docs/api_classes/views.md +0 -0
  181. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/aws_access_management.md +0 -0
  182. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/aws_client_vpn.md +0 -0
  183. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/aws_setup.md +0 -0
  184. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/aws_tips_and_tricks.md +0 -0
  185. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/core_stack.md +0 -0
  186. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/dashboard_stack.md +0 -0
  187. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/domain_cert_setup.md +0 -0
  188. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/full_pipeline.md +0 -0
  189. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/iam_assume_role.md +0 -0
  190. {workbench-0.8.330 → workbench-0.8.332}/docs/aws_setup/sso_assume_role.md +0 -0
  191. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/aws_endpoint_architecture.md +0 -0
  192. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/chemprop_shap.md +0 -0
  193. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/confusion_explorer.md +0 -0
  194. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/feature_endpoints.md +0 -0
  195. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/model_confidence.md +0 -0
  196. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/molecular_standardization.md +0 -0
  197. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/storage/compound_etl.md +0 -0
  198. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/storage/compound_explorer.md +0 -0
  199. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/storage/eda.md +0 -0
  200. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/storage/feature_importances.md +0 -0
  201. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/storage/fun_with_endpoints.md +0 -0
  202. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/storage/htg.md +0 -0
  203. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/storage/model_monitoring.md +0 -0
  204. {workbench-0.8.330 → workbench-0.8.332}/docs/blogs/storage/residual_analysis.md +0 -0
  205. {workbench-0.8.330 → workbench-0.8.332}/docs/cached/cached_data_source.md +0 -0
  206. {workbench-0.8.330 → workbench-0.8.332}/docs/cached/cached_endpoint.md +0 -0
  207. {workbench-0.8.330 → workbench-0.8.332}/docs/cached/cached_feature_set.md +0 -0
  208. {workbench-0.8.330 → workbench-0.8.332}/docs/cached/cached_meta.md +0 -0
  209. {workbench-0.8.330 → workbench-0.8.332}/docs/cached/cached_model.md +0 -0
  210. {workbench-0.8.330 → workbench-0.8.332}/docs/cached/overview.md +0 -0
  211. {workbench-0.8.330 → workbench-0.8.332}/docs/chem_utils/index.md +0 -0
  212. {workbench-0.8.330 → workbench-0.8.332}/docs/cloudwatch/index.md +0 -0
  213. {workbench-0.8.330 → workbench-0.8.332}/docs/comparisons/workbench_vs_databricks.md +0 -0
  214. {workbench-0.8.330 → workbench-0.8.332}/docs/compound_explorer/tox21.md +0 -0
  215. {workbench-0.8.330 → workbench-0.8.332}/docs/compound_explorer/toxicity_modeling.md +0 -0
  216. {workbench-0.8.330 → workbench-0.8.332}/docs/confidence/index.md +0 -0
  217. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/artifact.md +0 -0
  218. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/async_endpoint_core.md +0 -0
  219. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/athena_source.md +0 -0
  220. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/data_source_abstract.md +0 -0
  221. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/endpoint_core.md +0 -0
  222. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/feature_set_core.md +0 -0
  223. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/model_core.md +0 -0
  224. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/monitor_core.md +0 -0
  225. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/artifacts/overview.md +0 -0
  226. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/overview.md +0 -0
  227. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/transforms/data_loaders_heavy.md +0 -0
  228. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/transforms/data_loaders_light.md +0 -0
  229. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/transforms/data_to_features.md +0 -0
  230. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/transforms/features_to_model.md +0 -0
  231. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/transforms/model_to_endpoint.md +0 -0
  232. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/transforms/overview.md +0 -0
  233. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/transforms/pandas_transforms.md +0 -0
  234. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/transforms/transform.md +0 -0
  235. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/views/computation_view.md +0 -0
  236. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/views/display_view.md +0 -0
  237. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/views/inference_view.md +0 -0
  238. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/views/overview.md +0 -0
  239. {workbench-0.8.330 → workbench-0.8.332}/docs/core_classes/views/training_view.md +0 -0
  240. {workbench-0.8.330 → workbench-0.8.332}/docs/data_algorithms/dataframes/overview.md +0 -0
  241. {workbench-0.8.330 → workbench-0.8.332}/docs/data_algorithms/graphs/overview.md +0 -0
  242. {workbench-0.8.330 → workbench-0.8.332}/docs/data_algorithms/overview.md +0 -0
  243. {workbench-0.8.330 → workbench-0.8.332}/docs/data_algorithms/spark/overview.md +0 -0
  244. {workbench-0.8.330 → workbench-0.8.332}/docs/data_algorithms/sql/overview.md +0 -0
  245. {workbench-0.8.330 → workbench-0.8.332}/docs/enterprise/index.md +0 -0
  246. {workbench-0.8.330 → workbench-0.8.332}/docs/enterprise/private_saas.md +0 -0
  247. {workbench-0.8.330 → workbench-0.8.332}/docs/enterprise/project_branding.md +0 -0
  248. {workbench-0.8.330 → workbench-0.8.332}/docs/enterprise/themes.md +0 -0
  249. {workbench-0.8.330 → workbench-0.8.332}/docs/getting_started/index.md +0 -0
  250. {workbench-0.8.330 → workbench-0.8.332}/docs/glue/index.md +0 -0
  251. {workbench-0.8.330 → workbench-0.8.332}/docs/images/3d_descriptor_pipeline.svg +0 -0
  252. {workbench-0.8.330 → workbench-0.8.332}/docs/images/big_spider.png +0 -0
  253. {workbench-0.8.330 → workbench-0.8.332}/docs/images/chemprop_logd.png +0 -0
  254. {workbench-0.8.330 → workbench-0.8.332}/docs/images/chemprop_shap_logd.png +0 -0
  255. {workbench-0.8.330 → workbench-0.8.332}/docs/images/chemprop_shap_pipeline.svg +0 -0
  256. {workbench-0.8.330 → workbench-0.8.332}/docs/images/confidence_percentile.svg +0 -0
  257. {workbench-0.8.330 → workbench-0.8.332}/docs/images/conformal_calibration.svg +0 -0
  258. {workbench-0.8.330 → workbench-0.8.332}/docs/images/confusion_explorer/drilldown_on_errors.png +0 -0
  259. {workbench-0.8.330 → workbench-0.8.332}/docs/images/confusion_explorer/high_confidence.png +0 -0
  260. {workbench-0.8.330 → workbench-0.8.332}/docs/images/confusion_explorer/overview.png +0 -0
  261. {workbench-0.8.330 → workbench-0.8.332}/docs/images/default_stack_flow.svg +0 -0
  262. {workbench-0.8.330 → workbench-0.8.332}/docs/images/endpoint_architecture.png +0 -0
  263. {workbench-0.8.330 → workbench-0.8.332}/docs/images/ensemble_disagreement.svg +0 -0
  264. {workbench-0.8.330 → workbench-0.8.332}/docs/images/graph_representation.png +0 -0
  265. {workbench-0.8.330 → workbench-0.8.332}/docs/images/powered_aws_dark_blue.png +0 -0
  266. {workbench-0.8.330 → workbench-0.8.332}/docs/images/powered_aws_transparent.png +0 -0
  267. {workbench-0.8.330 → workbench-0.8.332}/docs/images/powered_aws_white.png +0 -0
  268. {workbench-0.8.330 → workbench-0.8.332}/docs/images/powered_aws_with_tm_grey.png +0 -0
  269. {workbench-0.8.330 → workbench-0.8.332}/docs/images/scp.png +0 -0
  270. {workbench-0.8.330 → workbench-0.8.332}/docs/images/scp_labs.png +0 -0
  271. {workbench-0.8.330 → workbench-0.8.332}/docs/images/small_spider.png +0 -0
  272. {workbench-0.8.330 → workbench-0.8.332}/docs/images/uq_conf_residual.png +0 -0
  273. {workbench-0.8.330 → workbench-0.8.332}/docs/images/uq_pred_scatter.png +0 -0
  274. {workbench-0.8.330 → workbench-0.8.332}/docs/images/workbench_async_stack_flow.svg +0 -0
  275. {workbench-0.8.330 → workbench-0.8.332}/docs/images/workbench_concepts.png +0 -0
  276. {workbench-0.8.330 → workbench-0.8.332}/docs/images/workbench_stack_flow.svg +0 -0
  277. {workbench-0.8.330 → workbench-0.8.332}/docs/index.md +0 -0
  278. {workbench-0.8.330 → workbench-0.8.332}/docs/javascripts/mathjax.js +0 -0
  279. {workbench-0.8.330 → workbench-0.8.332}/docs/lambda_layer/index.md +0 -0
  280. {workbench-0.8.330 → workbench-0.8.332}/docs/misc/faq.md +0 -0
  281. {workbench-0.8.330 → workbench-0.8.332}/docs/misc/general_info.md +0 -0
  282. {workbench-0.8.330 → workbench-0.8.332}/docs/misc/scp_consulting.md +0 -0
  283. {workbench-0.8.330 → workbench-0.8.332}/docs/misc/workbench_classes_concepts.md +0 -0
  284. {workbench-0.8.330 → workbench-0.8.332}/docs/model_utils/index.md +0 -0
  285. {workbench-0.8.330 → workbench-0.8.332}/docs/models/chemprop_models.md +0 -0
  286. {workbench-0.8.330 → workbench-0.8.332}/docs/models/fingerprint_models.md +0 -0
  287. {workbench-0.8.330 → workbench-0.8.332}/docs/models/images/chemprop_decision_tree.svg +0 -0
  288. {workbench-0.8.330 → workbench-0.8.332}/docs/models/images/confidence.jpg +0 -0
  289. {workbench-0.8.330 → workbench-0.8.332}/docs/models/images/hybrid_architecture.svg +0 -0
  290. {workbench-0.8.330 → workbench-0.8.332}/docs/models/index.md +0 -0
  291. {workbench-0.8.330 → workbench-0.8.332}/docs/models/meta_endpoints.md +0 -0
  292. {workbench-0.8.330 → workbench-0.8.332}/docs/models/pytorch_models.md +0 -0
  293. {workbench-0.8.330 → workbench-0.8.332}/docs/models/sklearn_models.md +0 -0
  294. {workbench-0.8.330 → workbench-0.8.332}/docs/models/xgboost_models.md +0 -0
  295. {workbench-0.8.330 → workbench-0.8.332}/docs/plugins/index.md +0 -0
  296. {workbench-0.8.330 → workbench-0.8.332}/docs/presentations/index.md +0 -0
  297. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_106.md +0 -0
  298. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_158.md +0 -0
  299. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_50.md +0 -0
  300. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_55.md +0 -0
  301. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_58.md +0 -0
  302. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_60.md +0 -0
  303. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_71.md +0 -0
  304. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_74.md +0 -0
  305. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/0_8_78.md +0 -0
  306. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_7_8.md +0 -0
  307. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_11.md +0 -0
  308. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_20.md +0 -0
  309. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_22.md +0 -0
  310. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_23.md +0 -0
  311. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_27.md +0 -0
  312. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_29.md +0 -0
  313. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_33.md +0 -0
  314. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_35.md +0 -0
  315. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_36.md +0 -0
  316. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_39.md +0 -0
  317. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_42.md +0 -0
  318. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_46.md +0 -0
  319. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_6.md +0 -0
  320. {workbench-0.8.330 → workbench-0.8.332}/docs/release_notes/archived/0_8_8.md +0 -0
  321. {workbench-0.8.330 → workbench-0.8.332}/docs/repl/index.md +0 -0
  322. {workbench-0.8.330 → workbench-0.8.332}/docs/road_maps/0_9_0.md +0 -0
  323. {workbench-0.8.330 → workbench-0.8.332}/docs/road_maps/0_9_5.md +0 -0
  324. {workbench-0.8.330 → workbench-0.8.332}/docs/stylesheets/extra.css +0 -0
  325. {workbench-0.8.330 → workbench-0.8.332}/docs/themes/details.md +0 -0
  326. {workbench-0.8.330 → workbench-0.8.332}/docs/themes/index.md +0 -0
  327. {workbench-0.8.330 → workbench-0.8.332}/examples/ag-grid/hello_world.py +0 -0
  328. {workbench-0.8.330 → workbench-0.8.332}/examples/chem_utils/tautomerize_smiles.py +0 -0
  329. {workbench-0.8.330 → workbench-0.8.332}/examples/datasource/datasource_from_df.py +0 -0
  330. {workbench-0.8.330 → workbench-0.8.332}/examples/datasource/datasource_from_s3.py +0 -0
  331. {workbench-0.8.330 → workbench-0.8.332}/examples/datasource/datasource_query.py +0 -0
  332. {workbench-0.8.330 → workbench-0.8.332}/examples/datasource/datasource_stats.py +0 -0
  333. {workbench-0.8.330 → workbench-0.8.332}/examples/datasource/datasource_to_featureset.py +0 -0
  334. {workbench-0.8.330 → workbench-0.8.332}/examples/endpoint/endpoint_details.py +0 -0
  335. {workbench-0.8.330 → workbench-0.8.332}/examples/endpoint/endpoint_inference.py +0 -0
  336. {workbench-0.8.330 → workbench-0.8.332}/examples/endpoint/endpoint_metrics.py +0 -0
  337. {workbench-0.8.330 → workbench-0.8.332}/examples/featureset/featureset_eda.py +0 -0
  338. {workbench-0.8.330 → workbench-0.8.332}/examples/featureset/featureset_query.py +0 -0
  339. {workbench-0.8.330 → workbench-0.8.332}/examples/full_ml_pipeline.py +0 -0
  340. {workbench-0.8.330 → workbench-0.8.332}/examples/glue_jobs/glue_example_1.py +0 -0
  341. {workbench-0.8.330 → workbench-0.8.332}/examples/glue_jobs/glue_example_2.py +0 -0
  342. {workbench-0.8.330 → workbench-0.8.332}/examples/glue_jobs/glue_example_3.py +0 -0
  343. {workbench-0.8.330 → workbench-0.8.332}/examples/glue_jobs/glue_launcher_examples/example_1.py +0 -0
  344. {workbench-0.8.330 → workbench-0.8.332}/examples/glue_jobs/glue_launcher_examples/example_2.py +0 -0
  345. {workbench-0.8.330 → workbench-0.8.332}/examples/meta/meta_list_endpoints.py +0 -0
  346. {workbench-0.8.330 → workbench-0.8.332}/examples/meta/meta_list_models.py +0 -0
  347. {workbench-0.8.330 → workbench-0.8.332}/examples/meta/meta_model_metrics.py +0 -0
  348. {workbench-0.8.330 → workbench-0.8.332}/examples/ml_pipelines/list_models.py +0 -0
  349. {workbench-0.8.330 → workbench-0.8.332}/examples/ml_pipelines/wine_classifier.py +0 -0
  350. {workbench-0.8.330 → workbench-0.8.332}/examples/model_utils/model_metrics.py +0 -0
  351. {workbench-0.8.330 → workbench-0.8.332}/examples/model_utils/model_to_endpoint.py +0 -0
  352. {workbench-0.8.330 → workbench-0.8.332}/examples/model_utils/onboard_model.py +0 -0
  353. {workbench-0.8.330 → workbench-0.8.332}/examples/models/chemprop.py +0 -0
  354. {workbench-0.8.330 → workbench-0.8.332}/examples/models/chemprop_foundation.py +0 -0
  355. {workbench-0.8.330 → workbench-0.8.332}/examples/models/chemprop_logp_logd_synthetic.py +0 -0
  356. {workbench-0.8.330 → workbench-0.8.332}/examples/models/chemprop_logp_logd_tiered.py +0 -0
  357. {workbench-0.8.330 → workbench-0.8.332}/examples/models/custom_model.py +0 -0
  358. {workbench-0.8.330 → workbench-0.8.332}/examples/models/dbscan.py +0 -0
  359. {workbench-0.8.330 → workbench-0.8.332}/examples/models/knn.py +0 -0
  360. {workbench-0.8.330 → workbench-0.8.332}/examples/models/meta_endpoint.py +0 -0
  361. {workbench-0.8.330 → workbench-0.8.332}/examples/models/pytorch.py +0 -0
  362. {workbench-0.8.330 → workbench-0.8.332}/examples/models/random_forest.py +0 -0
  363. {workbench-0.8.330 → workbench-0.8.332}/examples/models/smiles_to_fingerprints.py +0 -0
  364. {workbench-0.8.330 → workbench-0.8.332}/examples/models/smiles_to_md_v1.py +0 -0
  365. {workbench-0.8.330 → workbench-0.8.332}/examples/models/split_comparison_chemprop.py +0 -0
  366. {workbench-0.8.330 → workbench-0.8.332}/examples/models/split_comparison_pytorch.py +0 -0
  367. {workbench-0.8.330 → workbench-0.8.332}/examples/models/split_comparison_xgb.py +0 -0
  368. {workbench-0.8.330 → workbench-0.8.332}/examples/models/uq/bayesian_ridge.py +0 -0
  369. {workbench-0.8.330 → workbench-0.8.332}/examples/models/uq/ensemble_xgb.py +0 -0
  370. {workbench-0.8.330 → workbench-0.8.332}/examples/models/uq/gaussian_process.py +0 -0
  371. {workbench-0.8.330 → workbench-0.8.332}/examples/models/uq/meta_uq.py +0 -0
  372. {workbench-0.8.330 → workbench-0.8.332}/examples/models/uq/ngboost.py +0 -0
  373. {workbench-0.8.330 → workbench-0.8.332}/examples/models/uq/quant_xgb.py +0 -0
  374. {workbench-0.8.330 → workbench-0.8.332}/examples/models/xgb_model.py +0 -0
  375. {workbench-0.8.330 → workbench-0.8.332}/examples/monitor/monitor_setup.py +0 -0
  376. {workbench-0.8.330 → workbench-0.8.332}/examples/monitor/monitor_usage.py +0 -0
  377. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/branding/Readme.md +0 -0
  378. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/branding/scp.json +0 -0
  379. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/components/custom_plugin.py +0 -0
  380. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/components/endpoint_plugin.py +0 -0
  381. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/components/endpoint_turbo.py +0 -0
  382. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/components/model_markdown.py +0 -0
  383. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/components/model_plugin.py +0 -0
  384. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/packages/my_plugin_utils/__init__.py +0 -0
  385. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/packages/my_plugin_utils/assets/foo.json +0 -0
  386. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/packages/my_plugin_utils/cool_stuff.py +0 -0
  387. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/pages/plugin_page_1.py +0 -0
  388. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/pages/plugin_page_2.py +0 -0
  389. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/pages/plugin_page_3.py +0 -0
  390. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/templates/Readme.md +0 -0
  391. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/views/model_plugin_view.py +0 -0
  392. {workbench-0.8.330 → workbench-0.8.332}/examples/plugins/views/my_view_plugin.py +0 -0
  393. {workbench-0.8.330 → workbench-0.8.332}/experiments/chem_info/bulk_sims.py +0 -0
  394. {workbench-0.8.330 → workbench-0.8.332}/experiments/chem_info/knn_sims.py +0 -0
  395. {workbench-0.8.330 → workbench-0.8.332}/experiments/cleanlab_bug_report.py +0 -0
  396. {workbench-0.8.330 → workbench-0.8.332}/experiments/confidence_roc_curve.py +0 -0
  397. {workbench-0.8.330 → workbench-0.8.332}/experiments/coverage_probability.py +0 -0
  398. {workbench-0.8.330 → workbench-0.8.332}/experiments/db_scan_test.py +0 -0
  399. {workbench-0.8.330 → workbench-0.8.332}/experiments/log_testing.py +0 -0
  400. {workbench-0.8.330 → workbench-0.8.332}/experiments/networkx_id.py +0 -0
  401. {workbench-0.8.330 → workbench-0.8.332}/experiments/prediction_intervals.py +0 -0
  402. {workbench-0.8.330 → workbench-0.8.332}/experiments/residual_analysis.py +0 -0
  403. {workbench-0.8.330 → workbench-0.8.332}/experiments/rocauc_testing.py +0 -0
  404. {workbench-0.8.330 → workbench-0.8.332}/experiments/scatter_zoom_issue.py +0 -0
  405. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/README.md +0 -0
  406. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/_common.py +0 -0
  407. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/model_scripts/molecular_utils/mol_descriptors.py +0 -0
  408. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/model_scripts/molecular_utils/mol_standardize.py +0 -0
  409. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/model_scripts/requirements.txt +0 -0
  410. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/model_scripts/smiles_to_2d_keep_salts_model_script.py +0 -0
  411. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/model_scripts/smiles_to_2d_model_script.py +0 -0
  412. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/model_scripts/smiles_to_3d_fast_model_script.py +0 -0
  413. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/model_scripts/smiles_to_3d_full_model_script.py +0 -0
  414. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/smiles_to_2d_3d_v1.py +0 -0
  415. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/smiles_to_2d_keep_salts_v1.py +0 -0
  416. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/smiles_to_2d_v1.py +0 -0
  417. {workbench-0.8.330 → workbench-0.8.332}/feature_endpoints/smiles_to_3d_fast_v1.py +0 -0
  418. {workbench-0.8.330 → workbench-0.8.332}/glue_jobs/create_glue_workflow_with_trigger.py +0 -0
  419. {workbench-0.8.330 → workbench-0.8.332}/glue_jobs/example_glue_job.py +0 -0
  420. {workbench-0.8.330 → workbench-0.8.332}/glue_jobs/glue_mixed_case.py +0 -0
  421. {workbench-0.8.330 → workbench-0.8.332}/ml_pipelines/hyper_uq.py +0 -0
  422. {workbench-0.8.330 → workbench-0.8.332}/notebooks/Inference_On_Legacy_Models.ipynb +0 -0
  423. {workbench-0.8.330 → workbench-0.8.332}/notebooks/ML_Pipeline_with_Workbench.ipynb +0 -0
  424. {workbench-0.8.330 → workbench-0.8.332}/notebooks/ML_Pipeline_with_Workbench_2.ipynb +0 -0
  425. {workbench-0.8.330 → workbench-0.8.332}/notebooks/Outliers_in_Workbench.ipynb +0 -0
  426. {workbench-0.8.330 → workbench-0.8.332}/notebooks/Regression_Confidence_Experiments.ipynb +0 -0
  427. {workbench-0.8.330 → workbench-0.8.332}/notebooks/Residual_Analysis.ipynb +0 -0
  428. {workbench-0.8.330 → workbench-0.8.332}/notebooks/images/athena_query_aqsol.png +0 -0
  429. {workbench-0.8.330 → workbench-0.8.332}/notebooks/images/aws_dashboard_aqsol.png +0 -0
  430. {workbench-0.8.330 → workbench-0.8.332}/notebooks/images/dashboard_aqsol_features.png +0 -0
  431. {workbench-0.8.330 → workbench-0.8.332}/notebooks/images/model_screenshot.png +0 -0
  432. {workbench-0.8.330 → workbench-0.8.332}/notebooks/images/scp_labs.png +0 -0
  433. {workbench-0.8.330 → workbench-0.8.332}/open_admet/.gitignore +0 -0
  434. {workbench-0.8.330 → workbench-0.8.332}/open_admet/README.md +0 -0
  435. {workbench-0.8.330 → workbench-0.8.332}/open_admet/all_models.py +0 -0
  436. {workbench-0.8.330 → workbench-0.8.332}/open_admet/hello_world.py +0 -0
  437. {workbench-0.8.330 → workbench-0.8.332}/open_admet/images/confidence.jpg +0 -0
  438. {workbench-0.8.330 → workbench-0.8.332}/open_admet/images/open_admet_model.jpg +0 -0
  439. {workbench-0.8.330 → workbench-0.8.332}/open_admet/load_data.py +0 -0
  440. {workbench-0.8.330 → workbench-0.8.332}/open_admet/model_metrics.md +0 -0
  441. {workbench-0.8.330 → workbench-0.8.332}/open_admet/run_inference.py +0 -0
  442. {workbench-0.8.330 → workbench-0.8.332}/open_admet/utils/compute_model_metrics.py +0 -0
  443. {workbench-0.8.330 → workbench-0.8.332}/open_admet_pxr/all_models.py +0 -0
  444. {workbench-0.8.330 → workbench-0.8.332}/open_admet_pxr/create_feature_sets.py +0 -0
  445. {workbench-0.8.330 → workbench-0.8.332}/open_admet_pxr/load_data.py +0 -0
  446. {workbench-0.8.330 → workbench-0.8.332}/open_admet_pxr/pytorch_experiments.py +0 -0
  447. {workbench-0.8.330 → workbench-0.8.332}/presentations/README.md +0 -0
  448. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/Readme.md +0 -0
  449. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/base/inference/Dockerfile +0 -0
  450. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/base/training/Dockerfile +0 -0
  451. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/build_deploy.sh +0 -0
  452. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/ml_pipelines/ml_pipeline_runner.py +0 -0
  453. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/ml_pipelines/requirements.txt +0 -0
  454. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/pytorch_chem/inference/Dockerfile +0 -0
  455. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/pytorch_chem/inference/requirements.txt +0 -0
  456. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/pytorch_chem/training/Dockerfile +0 -0
  457. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/pytorch_chem/training/requirements.txt +0 -0
  458. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/shared/main.py +0 -0
  459. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/shared/serve +0 -0
  460. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/tests/data/abalone_sm.csv +0 -0
  461. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/tests/example_model_script.py +0 -0
  462. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/tests/run_tests.sh +0 -0
  463. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/tests/test_inference.py +0 -0
  464. {workbench-0.8.330 → workbench-0.8.332}/sagemaker_images/tests/test_training.py +0 -0
  465. {workbench-0.8.330 → workbench-0.8.332}/scripts/active_logs.sh +0 -0
  466. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/async_typical_usage.py +0 -0
  467. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/athena_ddl_mixed_case.py +0 -0
  468. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/capture_check.py +0 -0
  469. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/check_all_glue_tables.py +0 -0
  470. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/compact_inference_cache.py +0 -0
  471. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/delete_invalid_views.py +0 -0
  472. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/delete_redis_keys.py +0 -0
  473. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/find_orphan_models.py +0 -0
  474. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/list_datacatalog.py +0 -0
  475. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/migration/copy_glue_database.py +0 -0
  476. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/migration/delete_sageworks_glue_database.sh +0 -0
  477. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/migration/ds_migrate.py +0 -0
  478. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/migration/endpoint_migrate.py +0 -0
  479. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/migration/fs_migrate.py +0 -0
  480. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/migration/model_migrate.py +0 -0
  481. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/populate_3d_perf_reference_compounds.py +0 -0
  482. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/populate_3d_reference_compounds.py +0 -0
  483. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/populate_complexity_skip_reference_compounds.py +0 -0
  484. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/populate_corner_cases_reference_compounds.py +0 -0
  485. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/populate_flexibility_reference_compounds.py +0 -0
  486. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/populate_standardization_reference_compounds.py +0 -0
  487. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/profile_3d_fast.py +0 -0
  488. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/pull_image_digest.py +0 -0
  489. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/redis_reaper.py +0 -0
  490. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/reference_compounds_common.py +0 -0
  491. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/smiles_nan_investigation.py +0 -0
  492. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/spam_list_tags.py +0 -0
  493. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/storage/convert_training_views.py +0 -0
  494. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/storage/migrate_data_source_via_df.py +0 -0
  495. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/storage/migrate_ds_meta.py +0 -0
  496. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/test_3d_descriptors.py +0 -0
  497. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/test_3d_endpoint.py +0 -0
  498. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/test_batch_job_failure.py +0 -0
  499. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/test_no_workbench_config.py +0 -0
  500. {workbench-0.8.330 → workbench-0.8.332}/scripts/admin/verify_async_autoscaling.py +0 -0
  501. {workbench-0.8.330 → workbench-0.8.332}/scripts/ag_table_row_selection.py +0 -0
  502. {workbench-0.8.330 → workbench-0.8.332}/scripts/compare_dataframes.py +0 -0
  503. {workbench-0.8.330 → workbench-0.8.332}/scripts/compare_model_packages.py +0 -0
  504. {workbench-0.8.330 → workbench-0.8.332}/scripts/delete_data_capture.py +0 -0
  505. {workbench-0.8.330 → workbench-0.8.332}/scripts/endpoint_timing.py +0 -0
  506. {workbench-0.8.330 → workbench-0.8.332}/scripts/get_tags.py +0 -0
  507. {workbench-0.8.330 → workbench-0.8.332}/scripts/instantiation_timings.py +0 -0
  508. {workbench-0.8.330 → workbench-0.8.332}/scripts/llm_deploys/deepseek_deploy.py +0 -0
  509. {workbench-0.8.330 → workbench-0.8.332}/scripts/model_cache_refresh.py +0 -0
  510. {workbench-0.8.330 → workbench-0.8.332}/scripts/model_endpoint_sanity_check.py +0 -0
  511. {workbench-0.8.330 → workbench-0.8.332}/scripts/monitor_event_bridge.py +0 -0
  512. {workbench-0.8.330 → workbench-0.8.332}/scripts/onboard_endpoints.py +0 -0
  513. {workbench-0.8.330 → workbench-0.8.332}/scripts/onboard_models.py +0 -0
  514. {workbench-0.8.330 → workbench-0.8.332}/scripts/pubchem/pubchem_example.py +0 -0
  515. {workbench-0.8.330 → workbench-0.8.332}/scripts/pubchem/pubchem_query.py +0 -0
  516. {workbench-0.8.330 → workbench-0.8.332}/scripts/pubchem/pubchem_query_with_cid.py +0 -0
  517. {workbench-0.8.330 → workbench-0.8.332}/scripts/sagemaker_feature_group_issue.py +0 -0
  518. {workbench-0.8.330 → workbench-0.8.332}/scripts/sagemaker_pipeline_model_endpoint.py +0 -0
  519. {workbench-0.8.330 → workbench-0.8.332}/scripts/seaborn_to_plotly.py +0 -0
  520. {workbench-0.8.330 → workbench-0.8.332}/scripts/storage/dns_data_to_features.py +0 -0
  521. {workbench-0.8.330 → workbench-0.8.332}/scripts/storage/generate_jsonl_data.py +0 -0
  522. {workbench-0.8.330 → workbench-0.8.332}/scripts/test_feature_resolution.py +0 -0
  523. {workbench-0.8.330 → workbench-0.8.332}/scripts/test_feature_set_creation.py +0 -0
  524. {workbench-0.8.330 → workbench-0.8.332}/scripts/tox21/test_tox_heuristic.py +0 -0
  525. {workbench-0.8.330 → workbench-0.8.332}/scripts/tox21/tox21_to_df_store.py +0 -0
  526. {workbench-0.8.330 → workbench-0.8.332}/setup.cfg +0 -0
  527. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/__init__.py +0 -0
  528. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/__init__.py +0 -0
  529. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/Readme.md +0 -0
  530. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/data_source_eda.py +0 -0
  531. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/feature_space_proximity.py +0 -0
  532. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/fingerprint_proximity.py +0 -0
  533. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/projection_2d.py +0 -0
  534. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/proximity.py +0 -0
  535. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/smart_aggregator.py +0 -0
  536. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/storage/aggregation.py +0 -0
  537. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/storage/feature_resolution.py +0 -0
  538. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/storage/feature_spider.py +0 -0
  539. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/storage/residuals_calculator.py +0 -0
  540. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/storage/row_tagger.py +0 -0
  541. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/dataframe/storage/target_gradients.py +0 -0
  542. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/graph/__init__.py +0 -0
  543. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/graph/heavy/Readme.md +0 -0
  544. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/graph/light/Readme.md +0 -0
  545. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/graph/light/__init__.py +0 -0
  546. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/graph/light/laplacian_smoothness.py +0 -0
  547. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/graph/light/proximity_graph.py +0 -0
  548. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/models/cleanlab_model.py +0 -0
  549. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/models/noise_model.py +0 -0
  550. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/spark/Readme.md +0 -0
  551. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/sql/Readme.md +0 -0
  552. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/sql/__init__.py +0 -0
  553. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/sql/column_stats.py +0 -0
  554. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/sql/correlations.py +0 -0
  555. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/sql/descriptive_stats.py +0 -0
  556. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/sql/outliers.py +0 -0
  557. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/sql/sample_rows.py +0 -0
  558. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/algorithms/sql/value_counts.py +0 -0
  559. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/__init__.py +0 -0
  560. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/compound.py +0 -0
  561. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/data_source.py +0 -0
  562. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/df_store.py +0 -0
  563. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/feature_set.py +0 -0
  564. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/graph_store.py +0 -0
  565. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/meta.py +0 -0
  566. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/monitor.py +0 -0
  567. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/parameter_store.py +0 -0
  568. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/api/public_data.py +0 -0
  569. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/cached/__init__.py +0 -0
  570. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/cached/cached_artifact_mixin.py +0 -0
  571. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/cached/cached_data_source.py +0 -0
  572. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/cached/cached_endpoint.py +0 -0
  573. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/cached/cached_feature_set.py +0 -0
  574. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/cached/cached_meta.py +0 -0
  575. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/cached/cached_model.py +0 -0
  576. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/__init__.py +0 -0
  577. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/__init__.py +0 -0
  578. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/artifact.py +0 -0
  579. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/athena_source.py +0 -0
  580. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/data_capture_core.py +0 -0
  581. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/data_source_abstract.py +0 -0
  582. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/data_source_factory.py +0 -0
  583. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/df_store_core.py +0 -0
  584. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/feature_set_core.py +0 -0
  585. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/model_core.py +0 -0
  586. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/artifacts/monitor_core.py +0 -0
  587. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/aws/README.md +0 -0
  588. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/aws/aws_account_clamp.py +0 -0
  589. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/aws/aws_graph_store.py +0 -0
  590. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/aws/aws_meta.py +0 -0
  591. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/aws/aws_secrets_manager.py +0 -0
  592. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/aws/aws_session.py +0 -0
  593. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/aws/cache_dataframe.py +0 -0
  594. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/azure/README.md +0 -0
  595. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/cloud_meta.py +0 -0
  596. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/cloud_platform/gcp/README.md +0 -0
  597. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/pipelines/__init__.py +0 -0
  598. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/pipelines/pipeline_meta.py +0 -0
  599. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/Readme.md +0 -0
  600. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/__init__.py +0 -0
  601. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_loaders/__init__.py +0 -0
  602. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_loaders/heavy/__init__.py +0 -0
  603. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_loaders/heavy/s3_heavy_to_data_source.py +0 -0
  604. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_loaders/light/__init__.py +0 -0
  605. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_loaders/light/csv_to_data_source.py +0 -0
  606. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_loaders/light/json_to_data_source.py +0 -0
  607. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_loaders/light/s3_to_data_source_light.py +0 -0
  608. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_data/__init__.py +0 -0
  609. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_data/heavy/__init__.py +0 -0
  610. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_data/heavy/emr/Readme.md +0 -0
  611. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_data/heavy/glue/Readme.md +0 -0
  612. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_data/light/__init__.py +0 -0
  613. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_data/light/clean_data.py +0 -0
  614. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_data/light/data_to_data_light.py +0 -0
  615. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/__init__.py +0 -0
  616. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/heavy/__init__.py +0 -0
  617. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/heavy/chunk/__init__.py +0 -0
  618. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/heavy/chunk/data_to_features_chunk.py +0 -0
  619. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/heavy/emr/Readme.md +0 -0
  620. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/heavy/glue/Readme.md +0 -0
  621. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/heavy/storage/data_to_features_heavy_old.py +0 -0
  622. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/light/__init__.py +0 -0
  623. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/light/data_to_features_light.py +0 -0
  624. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/data_to_features/light/molecular_descriptors.py +0 -0
  625. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/features_to_features/__init__.py +0 -0
  626. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/features_to_features/heavy/emr/Readme.md +0 -0
  627. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/features_to_features/heavy/glue/Readme.md +0 -0
  628. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/features_to_model/__init__.py +0 -0
  629. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/features_to_model/features_to_model.py +0 -0
  630. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/model_to_endpoint/__init__.py +0 -0
  631. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/pandas_transforms/__init__.py +0 -0
  632. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/pandas_transforms/data_to_pandas.py +0 -0
  633. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/pandas_transforms/features_to_pandas.py +0 -0
  634. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/pandas_transforms/pandas_to_data.py +0 -0
  635. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/pandas_transforms/pandas_to_features.py +0 -0
  636. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/pandas_transforms/pandas_to_features_chunked.py +0 -0
  637. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/transforms/transform.py +0 -0
  638. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/__init__.py +0 -0
  639. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/column_subset_view.py +0 -0
  640. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/computation_view.py +0 -0
  641. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/create_view.py +0 -0
  642. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/display_view.py +0 -0
  643. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/inference_view.py +0 -0
  644. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/pandas_to_view.py +0 -0
  645. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/storage/mdq_view.py +0 -0
  646. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/training_view.py +0 -0
  647. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/view.py +0 -0
  648. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/core/views/view_utils.py +0 -0
  649. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_script_utils/chemprop_shap_utils.py +0 -0
  650. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_script_utils/ensemble_utils.py +0 -0
  651. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_script_utils/model_script_utils.py +0 -0
  652. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_script_utils/pytorch_utils.py +0 -0
  653. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_script_utils/training_harness.py +0 -0
  654. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_script_utils/uq_harness.py +0 -0
  655. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/chemprop/chemprop_shap_utils.py +0 -0
  656. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/chemprop/model_script_utils.py +0 -0
  657. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/chemprop/requirements.txt +0 -0
  658. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/chemprop/uq_harness.py +0 -0
  659. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/chem_info/Readme.md +0 -0
  660. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/chem_info/fingerprints.py +0 -0
  661. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/chem_info/mol_descriptors.py +0 -0
  662. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/chem_info/mol_standardize.py +0 -0
  663. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/chem_info/molecular_descriptors.py +0 -0
  664. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/chem_info/morgan_fingerprints.py +0 -0
  665. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/chem_info/requirements.txt +0 -0
  666. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/network_security/Readme.md +0 -0
  667. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/proximity/Readme.md +0 -0
  668. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/proximity/feature_space_proximity.py +0 -0
  669. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/proximity/feature_space_proximity.template +0 -0
  670. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/proximity/requirements.txt +0 -0
  671. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/uq_models/Readme.md +0 -0
  672. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/uq_models/bayesian_ridge.template +0 -0
  673. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/uq_models/ensemble_xgb.template +0 -0
  674. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/uq_models/feature_space_proximity.py +0 -0
  675. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/uq_models/gaussian_process.template +0 -0
  676. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/uq_models/ngboost.template +0 -0
  677. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_models/uq_models/requirements.txt +0 -0
  678. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_script_example/custom_model_script.py +0 -0
  679. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/custom_script_example/requirements.txt +0 -0
  680. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/meta_endpoint/aggregation_nodes.py +0 -0
  681. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/meta_endpoint/ensemble_utils.py +0 -0
  682. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/pytorch_model/model_script_utils.py +0 -0
  683. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/pytorch_model/pytorch.template +0 -0
  684. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/pytorch_model/pytorch_utils.py +0 -0
  685. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/pytorch_model/requirements.txt +0 -0
  686. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/pytorch_model/uq_harness.py +0 -0
  687. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/scikit_learn/requirements.txt +0 -0
  688. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/scikit_learn/scikit_learn.template +0 -0
  689. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/script_generation.py +0 -0
  690. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/xgb_model/model_script_utils.py +0 -0
  691. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/xgb_model/requirements.txt +0 -0
  692. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/xgb_model/uq_harness.py +0 -0
  693. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/model_scripts/xgb_model/xgb_model.template +0 -0
  694. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/repl/__init__.py +0 -0
  695. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/repl/workbench_shell.py +0 -0
  696. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/resources/open_source_api.key +0 -0
  697. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/resources/signature_verify_pub.pem +0 -0
  698. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/check_double_bond_stereo.py +0 -0
  699. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/df_store.py +0 -0
  700. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/endpoint_test.py +0 -0
  701. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/ensemble_sim.py +0 -0
  702. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/glue_launcher.py +0 -0
  703. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/lambda_test.py +0 -0
  704. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/ml_pipeline_batch.py +0 -0
  705. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/ml_pipeline_launcher.py +0 -0
  706. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/ml_pipeline_sqs.py +0 -0
  707. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/monitor_cloud_watch.py +0 -0
  708. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/redis_expire.py +0 -0
  709. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/redis_report.py +0 -0
  710. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/show_config.py +0 -0
  711. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/scripts/training_test.py +0 -0
  712. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/dark/base_css.url +0 -0
  713. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/dark/custom.css +0 -0
  714. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/dark/plotly.json +0 -0
  715. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/light/base_css.url +0 -0
  716. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/light/branding.json +0 -0
  717. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/light/custom.css +0 -0
  718. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/light/plotly.json +0 -0
  719. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/midnight_blue/base_css.url +0 -0
  720. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/midnight_blue/branding.json +0 -0
  721. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/midnight_blue/custom.css +0 -0
  722. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/themes/midnight_blue/plotly.json +0 -0
  723. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/__init__.py +0 -0
  724. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/aggregation_nodes.py +0 -0
  725. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/ai_compound_generator.py +0 -0
  726. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/ai_summary.py +0 -0
  727. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/ai_synth.py +0 -0
  728. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/athena_utils.py +0 -0
  729. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/aws_utils.py +0 -0
  730. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/bulk_utils.py +0 -0
  731. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/cache.py +0 -0
  732. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/__init__.py +0 -0
  733. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/fingerprints.py +0 -0
  734. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/misc.py +0 -0
  735. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/mol_descriptors.py +0 -0
  736. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/mol_standardize.py +0 -0
  737. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/mol_tagging.py +0 -0
  738. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/projections.py +0 -0
  739. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/salts.py +0 -0
  740. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/sdf.py +0 -0
  741. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/toxicity.py +0 -0
  742. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chem_utils/vis.py +0 -0
  743. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/chemprop_utils.py +0 -0
  744. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/clientside_callbacks.py +0 -0
  745. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/cloudwatch_handler.py +0 -0
  746. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/cloudwatch_utils.py +0 -0
  747. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/color_utils.py +0 -0
  748. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/config_manager.py +0 -0
  749. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/dashboard_metrics.py +0 -0
  750. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/datetime_utils.py +0 -0
  751. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/deprecated_utils.py +0 -0
  752. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/df_to_endpoint.py +0 -0
  753. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/distribution_stats.py +0 -0
  754. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/ecs_info.py +0 -0
  755. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/endpoint_metrics.py +0 -0
  756. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/endpoint_utils.py +0 -0
  757. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/ensemble_simulator.py +0 -0
  758. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/extract_model_artifact.py +0 -0
  759. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/glue_utils.py +0 -0
  760. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/graph_utils.py +0 -0
  761. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/ipython_utils.py +0 -0
  762. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/json_utils.py +0 -0
  763. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/lambda_utils.py +0 -0
  764. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/license_manager.py +0 -0
  765. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/log_utils.py +0 -0
  766. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/markdown_utils.py +0 -0
  767. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/metrics_utils.py +0 -0
  768. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/model_utils.py +0 -0
  769. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/monitor_utils.py +0 -0
  770. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/pandas_utils.py +0 -0
  771. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/performance_utils.py +0 -0
  772. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/plot_utils.py +0 -0
  773. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/plugin_manager.py +0 -0
  774. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/prox_utils.py +0 -0
  775. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/pytorch_utils.py +0 -0
  776. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/redis_cache.py +0 -0
  777. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/repl_utils.py +0 -0
  778. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/s3_utils.py +0 -0
  779. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/shap_utils.py +0 -0
  780. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/shapley_values.py +0 -0
  781. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/symbols.py +0 -0
  782. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/theme_manager.py +0 -0
  783. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/trace_calls.py +0 -0
  784. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/type_abbrev.py +0 -0
  785. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/workbench_cache.py +0 -0
  786. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/workbench_event_bridge.py +0 -0
  787. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/workbench_logging.py +0 -0
  788. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/workbench_sqs.py +0 -0
  789. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/xgboost_local_crossfold.py +0 -0
  790. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/utils/xgboost_model_utils.py +0 -0
  791. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/component_interface.py +0 -0
  792. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/correlation_matrix.py +0 -0
  793. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/data_details_markdown.py +0 -0
  794. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/endpoint_metric_plots.py +0 -0
  795. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/experiments/dashboard_metric_plots.py +0 -0
  796. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/experiments/outlier_plot.py +0 -0
  797. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugin_interface.py +0 -0
  798. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugin_unit_test.py +0 -0
  799. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/ag_table.py +0 -0
  800. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/confusion_explorer.py +0 -0
  801. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/confusion_matrix.py +0 -0
  802. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/confusion_triangle.py +0 -0
  803. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/dashboard_status.py +0 -0
  804. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/data_details.py +0 -0
  805. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/endpoint_details.py +0 -0
  806. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/generated_compounds.py +0 -0
  807. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/graph_plot.py +0 -0
  808. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/license_details.py +0 -0
  809. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/model_details.py +0 -0
  810. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/model_plot.py +0 -0
  811. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/molecule_panel.py +0 -0
  812. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/molecule_viewer.py +0 -0
  813. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/proximity_mini_graph.py +0 -0
  814. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/scatter_plot.py +0 -0
  815. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/plugins/shap_summary_plot.py +0 -0
  816. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/regression_plot.py +0 -0
  817. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/settings_menu.py +0 -0
  818. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/components/violin_plots.py +0 -0
  819. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/page_views/data_sources_page_view.py +0 -0
  820. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/page_views/endpoints_page_view.py +0 -0
  821. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/page_views/feature_sets_page_view.py +0 -0
  822. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/page_views/main_page.py +0 -0
  823. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/page_views/models_page_view.py +0 -0
  824. {workbench-0.8.330 → workbench-0.8.332}/src/workbench/web_interface/page_views/page_view.py +0 -0
  825. {workbench-0.8.330 → workbench-0.8.332}/src/workbench.egg-info/dependency_links.txt +0 -0
  826. {workbench-0.8.330 → workbench-0.8.332}/src/workbench.egg-info/entry_points.txt +0 -0
  827. {workbench-0.8.330 → workbench-0.8.332}/src/workbench.egg-info/top_level.txt +0 -0
  828. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_aqsol_artifacts.py +0 -0
  829. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_aqsol_artifacts_all.py +0 -0
  830. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_aqsol_rt_artifacts.py +0 -0
  831. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_basic_test_artifacts.py +0 -0
  832. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_copy_artifacts.py +0 -0
  833. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_empty_model_group.py +0 -0
  834. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_endpoints_for_timing.py +0 -0
  835. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_graph_artifacts.py +0 -0
  836. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_knn_artifacts.py +0 -0
  837. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_meta_endpoints.py +0 -0
  838. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_proximity_models.py +0 -0
  839. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_quant_regression_artifacts.py +0 -0
  840. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_realtime_endpoint.py +0 -0
  841. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_sagemaker_pipeline_model.py +0 -0
  842. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_training_adjusted_artifacts.py +0 -0
  843. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/create_wine_artifacts.py +0 -0
  844. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/delete_stress_test_artifacts.py +0 -0
  845. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/delete_test_artifacts.py +0 -0
  846. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/hyper_testing.py +0 -0
  847. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/regression_ensemble.py +0 -0
  848. {workbench-0.8.330 → workbench-0.8.332}/test_artifacts/stress_test_aws.py +0 -0
  849. {workbench-0.8.330 → workbench-0.8.332}/tests/README.md +0 -0
  850. {workbench-0.8.330 → workbench-0.8.332}/tests/artifacts/data_source_tests.py +0 -0
  851. {workbench-0.8.330 → workbench-0.8.332}/tests/artifacts/empty_model_group.py +0 -0
  852. {workbench-0.8.330 → workbench-0.8.332}/tests/artifacts/featureset_ingest_boundaries.py +0 -0
  853. {workbench-0.8.330 → workbench-0.8.332}/tests/artifacts/featureset_tests.py +0 -0
  854. {workbench-0.8.330 → workbench-0.8.332}/tests/artifacts/graph_tests.py +0 -0
  855. {workbench-0.8.330 → workbench-0.8.332}/tests/artifacts/model_metrics_tests.py +0 -0
  856. {workbench-0.8.330 → workbench-0.8.332}/tests/artifacts/model_tests.py +0 -0
  857. {workbench-0.8.330 → workbench-0.8.332}/tests/aws_account/aws_account_clamp_tests.py +0 -0
  858. {workbench-0.8.330 → workbench-0.8.332}/tests/cached/cached_artifact_tests.py +0 -0
  859. {workbench-0.8.330 → workbench-0.8.332}/tests/cached/cached_meta_tests.py +0 -0
  860. {workbench-0.8.330 → workbench-0.8.332}/tests/chem_info/test_standardization_reference.py +0 -0
  861. {workbench-0.8.330 → workbench-0.8.332}/tests/chem_info/test_tautomerization.py +0 -0
  862. {workbench-0.8.330 → workbench-0.8.332}/tests/confidence/test_uq_harness.py +0 -0
  863. {workbench-0.8.330 → workbench-0.8.332}/tests/corner_cases/end_to_end.py +0 -0
  864. {workbench-0.8.330 → workbench-0.8.332}/tests/df_store/df_store_tests.py +0 -0
  865. {workbench-0.8.330 → workbench-0.8.332}/tests/endpoints/endpoint_tests.py +0 -0
  866. {workbench-0.8.330 → workbench-0.8.332}/tests/endpoints/inference_cache_tests.py +0 -0
  867. {workbench-0.8.330 → workbench-0.8.332}/tests/endpoints/meta_endpoint_dag_tests.py +0 -0
  868. {workbench-0.8.330 → workbench-0.8.332}/tests/feature_endpoints/test_3d_complexity_skips.py +0 -0
  869. {workbench-0.8.330 → workbench-0.8.332}/tests/feature_endpoints/test_3d_consistency.py +0 -0
  870. {workbench-0.8.330 → workbench-0.8.332}/tests/feature_endpoints/test_3d_corner_cases.py +0 -0
  871. {workbench-0.8.330 → workbench-0.8.332}/tests/feature_endpoints/test_3d_flexibility_comparison.py +0 -0
  872. {workbench-0.8.330 → workbench-0.8.332}/tests/feature_endpoints/test_smiles_to_3d_fast_v1.py +0 -0
  873. {workbench-0.8.330 → workbench-0.8.332}/tests/feature_endpoints/test_smiles_to_3d_full_v1.py +0 -0
  874. {workbench-0.8.330 → workbench-0.8.332}/tests/lambda/decompress_layers.py +0 -0
  875. {workbench-0.8.330 → workbench-0.8.332}/tests/pandas_tests/test_drift.py +0 -0
  876. {workbench-0.8.330 → workbench-0.8.332}/tests/pandas_tests/test_multi_task.py +0 -0
  877. {workbench-0.8.330 → workbench-0.8.332}/tests/pandas_tests/test_temporal_split.py +0 -0
  878. {workbench-0.8.330 → workbench-0.8.332}/tests/parameter_store/param_store_tests.py +0 -0
  879. {workbench-0.8.330 → workbench-0.8.332}/tests/pipelines/test_pipeline_launcher.py +0 -0
  880. {workbench-0.8.330 → workbench-0.8.332}/tests/pipelines/test_pipeline_meta.py +0 -0
  881. {workbench-0.8.330 → workbench-0.8.332}/tests/plugin_tests/crashing_plugin.py +0 -0
  882. {workbench-0.8.330 → workbench-0.8.332}/tests/pytorch/pytorch_hello.py +0 -0
  883. {workbench-0.8.330 → workbench-0.8.332}/tests/requirements-dev.txt +0 -0
  884. {workbench-0.8.330 → workbench-0.8.332}/tests/specific/capital_tests.py +0 -0
  885. {workbench-0.8.330 → workbench-0.8.332}/tests/specific/column_changes.py +0 -0
  886. {workbench-0.8.330 → workbench-0.8.332}/tests/specific/config_manager.py +0 -0
  887. {workbench-0.8.330 → workbench-0.8.332}/tests/specific/deletion_tests.py +0 -0
  888. {workbench-0.8.330 → workbench-0.8.332}/tests/specific/public_data_test.py +0 -0
  889. {workbench-0.8.330 → workbench-0.8.332}/tests/specific/shap_tests.py +0 -0
  890. {workbench-0.8.330 → workbench-0.8.332}/tests/specific/spawn_test.py +0 -0
  891. {workbench-0.8.330 → workbench-0.8.332}/tests/specific/tag_tests.py +0 -0
  892. {workbench-0.8.330 → workbench-0.8.332}/tests/transforms/data_to_data_tests.py +0 -0
  893. {workbench-0.8.330 → workbench-0.8.332}/tests/transforms/data_to_features_tests.py +0 -0
  894. {workbench-0.8.330 → workbench-0.8.332}/tests/transforms/features_to_model_tests.py +0 -0
  895. {workbench-0.8.330 → workbench-0.8.332}/tests/transforms/model_to_endpoint_tests.py +0 -0
  896. {workbench-0.8.330 → workbench-0.8.332}/tests/transforms/pandas_to_data_tests.py +0 -0
  897. {workbench-0.8.330 → workbench-0.8.332}/tests/transforms/pandas_to_features_test.py +0 -0
  898. {workbench-0.8.330 → workbench-0.8.332}/tests/views/view_tests.py +0 -0
  899. {workbench-0.8.330 → workbench-0.8.332}/tests/views/view_tests_complex.py +0 -0
  900. {workbench-0.8.330 → workbench-0.8.332}/tests/web_components/confusion_matrix_test.py +0 -0
  901. {workbench-0.8.330 → workbench-0.8.332}/tests/web_components/correlation_matrix_test.py +0 -0
  902. {workbench-0.8.330 → workbench-0.8.332}/tests/web_components/graph_plot_test.py +0 -0
  903. {workbench-0.8.330 → workbench-0.8.332}/tests/web_components/plugin_interface_test.py +0 -0
  904. {workbench-0.8.330 → workbench-0.8.332}/tests/web_components/scatter_plot_test.py +0 -0
  905. {workbench-0.8.330 → workbench-0.8.332}/tox.ini +0 -0
  906. {workbench-0.8.330 → workbench-0.8.332}/ui_testing/assets/custom.css +0 -0
  907. {workbench-0.8.330 → workbench-0.8.332}/ui_testing/table_comparison.py +0 -0
  908. {workbench-0.8.330 → workbench-0.8.332}/ui_testing/theme_switching.py +0 -0
  909. {workbench-0.8.330 → workbench-0.8.332}/ui_testing/theme_switching_2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workbench
3
- Version: 0.8.330
3
+ Version: 0.8.332
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
6
  License: MIT License
@@ -53,7 +53,7 @@ Requires-Dist: joblib>=1.3.2
53
53
  Requires-Dist: requests>=2.26.0
54
54
  Requires-Dist: rdkit>=2026.3.1
55
55
  Requires-Dist: mordredcommunity>=2.0.6
56
- Requires-Dist: workbench-bridges>=0.2.8
56
+ Requires-Dist: workbench-bridges>=0.2.9
57
57
  Requires-Dist: cleanlab>=2.9.0
58
58
  Requires-Dist: pyyaml>=6.0
59
59
  Provides-Extra: ui
@@ -25,9 +25,9 @@ Per-tier construction
25
25
  * Band selections capped at --max-aux (default 1,558) via deterministic
26
26
  random sample (--seed) when more candidates exist than the cap.
27
27
 
28
- Approach: run DatasetComparison with logd as reference and logp as query, so
29
- each LogP compound gets a per-row Tanimoto-to-LogD score. Filter by band, cap,
30
- merge with the LogD primary, write CSV.
28
+ Approach: build a MultiTaskAlignment with logd as primary and logp as aux. Each
29
+ LogP-only row in the unified results gets a `tanimoto_to_primary` score. Filter
30
+ by band, cap, merge with the LogD primary, write CSV.
31
31
 
32
32
  Output: output/experiments/logp_logd_overlap_<suffix>.csv
33
33
  """
@@ -38,7 +38,7 @@ from pathlib import Path
38
38
 
39
39
  import pandas as pd
40
40
 
41
- from workbench.algorithms.dataframe import DatasetComparison
41
+ from workbench.algorithms.dataframe import MultiTaskAlignment
42
42
 
43
43
  log = logging.getLogger("workbench")
44
44
 
@@ -58,7 +58,7 @@ TIERS = [
58
58
 
59
59
 
60
60
  def build_one(
61
- dc: DatasetComparison,
61
+ mta: MultiTaskAlignment,
62
62
  logp: pd.DataFrame,
63
63
  logd: pd.DataFrame,
64
64
  suffix: str,
@@ -67,15 +67,18 @@ def build_one(
67
67
  max_aux: int,
68
68
  seed: int,
69
69
  ) -> Path:
70
- """Build a single tier CSV. Reuses the already-built DatasetComparison model."""
71
- results = dc.results()
72
- logp_scored = results[results["dataset"] == "query"].copy()
70
+ """Build a single tier CSV. Reuses the already-built MultiTaskAlignment model."""
71
+ results = mta.results()
72
+ # LogP-only rows in the unified results `tanimoto_to_primary` is best Tanimoto to any LogD compound.
73
+ logp_scored = results[results["logp"].notna()].copy()
73
74
 
74
75
  # Inclusive band [min, max]. The high tier ([0.7, 1.0]) naturally captures
75
76
  # exact-SMILES compounds (Tanimoto == 1.0); their merged rows show both
76
77
  # logp and logd populated. Lower tiers (< 1.0) by definition have no
77
78
  # smiles in common with LogD.
78
- band_mask = (logp_scored["tanimoto_sim"] >= tanimoto_min) & (logp_scored["tanimoto_sim"] <= tanimoto_max)
79
+ band_mask = (logp_scored["tanimoto_to_primary"] >= tanimoto_min) & (
80
+ logp_scored["tanimoto_to_primary"] <= tanimoto_max
81
+ )
79
82
  band = logp_scored.loc[band_mask].copy()
80
83
 
81
84
  n_band_total = len(band)
@@ -84,7 +87,7 @@ def build_one(
84
87
  log.info(
85
88
  f"[{suffix}] Band [{tanimoto_min:.2f}, {tanimoto_max:.2f}] "
86
89
  f"candidates={n_band_total:,} selected={len(band):,} "
87
- f"sim_range={band['tanimoto_sim'].min():.3f}-{band['tanimoto_sim'].max():.3f}"
90
+ f"sim_range={band['tanimoto_to_primary'].min():.3f}-{band['tanimoto_to_primary'].max():.3f}"
88
91
  )
89
92
 
90
93
  # Take selected LogP rows and outer-merge with LogD primary.
@@ -122,14 +125,21 @@ def main(max_aux: int, seed: int, only: list[str] | None) -> None:
122
125
  logp_ids = logp.assign(id=logp["id"].astype(str).radd("logp_"))
123
126
  logd_ids = logd.assign(id=logd["id"].astype(str).radd("logd_"))
124
127
 
125
- # Build the comparison once (logd=ref, logp=query) gives each LogP a Tanimoto-to-LogD score.
126
- # All three tiers are derived from the same scored set, so we only build the FP/UMAP model once.
127
- log.info("Building DatasetComparison (logd=reference, logp=query) ...")
128
- dc = DatasetComparison(
129
- df_reference=logd_ids[["id", "smiles", "logd"]],
130
- df_query=logp_ids[["id", "smiles", "logp"]],
131
- reference_target="logd",
132
- query_target="logp",
128
+ # Wide multi-task DataFrame: LogD-only rows + LogP-only rows. The shared FP/UMAP model
129
+ # is built once, and every LogP row gets a tanimoto_to_primary score against LogD.
130
+ mt_df = pd.concat(
131
+ [
132
+ logd_ids[["id", "smiles"]].assign(logd=logd_ids["logd"]),
133
+ logp_ids[["id", "smiles"]].assign(logp=logp_ids["logp"]),
134
+ ],
135
+ ignore_index=True,
136
+ )
137
+
138
+ log.info("Building MultiTaskAlignment (primary=logd, aux=logp) ...")
139
+ mta = MultiTaskAlignment(
140
+ mt_df,
141
+ primary="logd",
142
+ auxiliaries=["logp"],
133
143
  id_column="id",
134
144
  )
135
145
 
@@ -138,7 +148,7 @@ def main(max_aux: int, seed: int, only: list[str] | None) -> None:
138
148
  raise ValueError(f"--only filtered out all tiers; valid suffixes: {[t[0] for t in TIERS]}")
139
149
 
140
150
  for suffix, lo, hi in selected_tiers:
141
- build_one(dc, logp, logd, suffix, lo, hi, max_aux, seed)
151
+ build_one(mta, logp, logd, suffix, lo, hi, max_aux, seed)
142
152
 
143
153
 
144
154
  if __name__ == "__main__":
@@ -0,0 +1,128 @@
1
+ """Report LogP/LogD chemical-space overlap to inform multi-task modeling decisions.
2
+
3
+ Goal: decide whether a chemprop multi-task LogP+LogD model is likely to outperform
4
+ a LogD-only model. That depends on two things:
5
+
6
+ (1) Coverage — do LogD compounds have nearby LogP neighbors in chemical space?
7
+ If LogP doesn't cover the LogD distribution, the auxiliary task adds
8
+ little signal where it matters.
9
+ (2) Concordance — for similar compounds, do LogP and LogD agree (correlated)?
10
+ Strong agreement suggests easy auxiliary signal; mild disagreement
11
+ is exactly what multi-task learning can exploit.
12
+
13
+ Thin CLI wrapper around `workbench.algorithms.dataframe.MultiTaskAlignment`:
14
+
15
+ MultiTaskAlignment(df, primary="logd", auxiliaries=["logp"], id_column="id")
16
+
17
+ We then print the per-aux summary and the multi-task verdict. Per-compound details
18
+ are written to `output/overlap_summary.csv` for downstream slicing/plotting.
19
+ """
20
+
21
+ import logging
22
+ from pathlib import Path
23
+
24
+ import pandas as pd
25
+
26
+ from workbench.algorithms.dataframe import MultiTaskAlignment
27
+
28
+ log = logging.getLogger("workbench")
29
+
30
+ DATA_DIR = Path(__file__).parent
31
+ OUTPUT_DIR = DATA_DIR / "output"
32
+ LOGP_PATH = OUTPUT_DIR / "logp" / "logp_all.csv"
33
+ LOGD_PATH = OUTPUT_DIR / "logd" / "logd_all.csv"
34
+ SUMMARY_CSV = OUTPUT_DIR / "overlap_summary.csv"
35
+
36
+
37
+ def _print_summary(summary_row: pd.Series, n_logp: int, n_logd: int) -> None:
38
+ print("\n" + "=" * 72)
39
+ print("MultiTaskAlignment Summary (primary=LogD, auxiliary=LogP)")
40
+ print("=" * 72)
41
+ print(f" Primary (LogD): {n_logd:>7,} compounds")
42
+ print(f" Auxiliary (LogP): {n_logp:>7,} compounds")
43
+ print(f" Shared compounds: {int(summary_row['n_shared']):>7,}")
44
+ print(f" LogP-only: {int(summary_row['n_aux_only']):>7,}")
45
+
46
+ print("\nLabel correlation on shared compounds")
47
+ r = summary_row["pearson_r"]
48
+ if pd.notna(r):
49
+ print(f" Pearson r = {r:.3f} ({summary_row['r_confidence']} confidence)")
50
+ else:
51
+ print(f" Pearson r = N/A ({summary_row['r_confidence']})")
52
+
53
+ print("\nChemical-space coverage (LogP -> nearest LogD)")
54
+ print(f" mean Tanimoto: {summary_row['tanimoto_coverage_mean']:.3f}")
55
+ print(f" fraction sim >= 0.50: {100 * summary_row['frac_coverage_ge_05']:5.1f}%")
56
+ print(f" fraction sim >= 0.30: {100 * summary_row['frac_coverage_ge_03']:5.1f}%")
57
+
58
+ print("\nZ-scored residual on aux-having rows")
59
+ print(f" |residual| mean: {summary_row['residual_abs_mean']:.3f}")
60
+ print(f" |residual| p95: {summary_row['residual_abs_p95']:.3f}")
61
+
62
+
63
+ def _print_verdict(summary_row: pd.Series) -> None:
64
+ print("\n" + "=" * 72)
65
+ print("Multi-Task Recommendation")
66
+ print("=" * 72)
67
+ print(f" Overlap verdict: {summary_row['overlap']}")
68
+ print(f" Extension verdict: {summary_row['extension']}")
69
+ print(f" Recommendation: {summary_row['recommendation']}")
70
+
71
+
72
+ def main() -> None:
73
+ logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s")
74
+
75
+ if not LOGP_PATH.exists():
76
+ raise FileNotFoundError(f"{LOGP_PATH} not found — run pull_logp_data.py first.")
77
+ if not LOGD_PATH.exists():
78
+ raise FileNotFoundError(f"{LOGD_PATH} not found — run pull_logd_data.py first.")
79
+
80
+ logp = pd.read_csv(LOGP_PATH)
81
+ logd = pd.read_csv(LOGD_PATH)
82
+
83
+ # ID disambiguation so the combined model can identify rows uniquely
84
+ logp = logp.assign(id=logp["id"].astype(str).radd("logp_"))
85
+ logd = logd.assign(id=logd["id"].astype(str).radd("logd_"))
86
+
87
+ # Build a wide multi-task DataFrame: one row per source compound with NaN where missing
88
+ mt_df = pd.concat(
89
+ [
90
+ logd[["id", "smiles"]].assign(logd=logd["logd"]),
91
+ logp[["id", "smiles"]].assign(logp=logp["logp"]),
92
+ ],
93
+ ignore_index=True,
94
+ )
95
+
96
+ mta = MultiTaskAlignment(
97
+ mt_df,
98
+ primary="logd",
99
+ auxiliaries=["logp"],
100
+ id_column="id",
101
+ )
102
+
103
+ summary = mta.summary()
104
+ summary_row = summary.iloc[0]
105
+ _print_summary(summary_row, n_logp=len(logp), n_logd=len(logd))
106
+ _print_verdict(summary_row)
107
+
108
+ results = mta.results()
109
+ keep = [
110
+ c
111
+ for c in [
112
+ "id",
113
+ "smiles",
114
+ "logd",
115
+ "logp",
116
+ "x",
117
+ "y",
118
+ "tanimoto_to_primary",
119
+ "residual_logp",
120
+ ]
121
+ if c in results.columns
122
+ ]
123
+ results[keep].to_csv(SUMMARY_CSV, index=False)
124
+ print(f"\nPer-compound results saved -> {SUMMARY_CSV}")
125
+
126
+
127
+ if __name__ == "__main__":
128
+ main()
@@ -1,21 +1,33 @@
1
1
  # 3D Molecular Descriptors: Shape, Surface, and Pharmacophore Features
2
- !!! tip inline end "Combine 2D + 3D"
3
- Run both the [2D descriptor endpoint](molecular_standardization.md) and the 3D endpoint, then concatenate the results for a ~388-feature set covering topological, electronic, and geometric properties.
2
+ !!! tip inline end "When to reach for 3D"
3
+ On most TDC ADMET endpoints, careful 2D fingerprints + learned graph representations are highly competitive on their own. Use the 3D endpoint when you need shape-aware features for geometry-sensitive endpoints (passive permeability, P-gp / BCRP interactions, conformer-dependent solubility), typically alongside the 2D feature set, not as a replacement for it.
4
4
 
5
- 2D molecular descriptors capture a lot about a molecule's chemistry from its connectivity graph alone -- molecular weight, hydrogen bond donors, topological polar surface area, and hundreds of other properties. But some of the most important ADMET properties depend on the molecule's *shape* in three dimensions: how it fits into a transporter binding site, whether it can fold to mask polar groups for membrane permeation, or how its charge distribution maps onto its surface.
5
+ 2D molecular descriptors capture a lot about a molecule's chemistry from its connectivity graph alone -- molecular weight, hydrogen bond donors, topological polar surface area, and hundreds of other properties. Some ADMET properties have geometric components that 2D descriptors capture only indirectly through their correlations with the molecular graph: how a molecule fits into a transporter binding site, whether it can fold to mask polar groups for membrane permeation, or how its charge distribution maps onto its surface. The 3D endpoint exposes these directly as engineered features -- whether they help on a given task is an empirical question, not a foregone conclusion.
6
6
 
7
7
  Workbench's 3D descriptor endpoints compute **74 conformer-based features** from SMILES strings, covering molecular shape, charged partial surface area, pharmacophore spatial distribution, and conformational flexibility. Like all Workbench endpoints, the contract is simple: **send a DataFrame, get a DataFrame back** -- the input DataFrame comes back with 74 descriptor columns appended. Two pipeline modes are available -- a **fast** endpoint for realtime inference and a **Boltzmann** endpoint for high-quality batch processing. Both produce the same 74 features so downstream models can consume either interchangeably.
8
8
 
9
- ## Why 3D Descriptors?
9
+ ## When 3D Descriptors Help (and When They Don't)
10
10
 
11
- 2D descriptors treat molecules as graphs -- atoms are nodes, bonds are edges. This misses geometry-dependent properties that matter for ADMET:
11
+ 2D descriptors treat molecules as graphs -- atoms are nodes, bonds are edges. There are ADMET-relevant properties whose geometric components 2D captures only indirectly:
12
12
 
13
13
  - **Membrane permeability** depends on molecular shape and the spatial separation of polar and nonpolar regions (amphiphilic moment)
14
14
  - **Transporter interactions** (P-gp, BCRP) correlate with molecular elongation, nitrogen spatial distribution, and overall size
15
15
  - **Protein-ligand binding** depends on 3D shape complementarity, not just functional group counts
16
- - **Intramolecular hydrogen bonds** enable "chameleonic" behavior where molecules mask polar groups in nonpolar environments -- a purely 3D phenomenon
16
+ - **Intramolecular hydrogen bonds** enable "chameleonic" behavior where molecules mask polar groups in nonpolar environments -- a 3D phenomenon
17
17
 
18
- These properties can't be captured from the molecular graph. You need 3D coordinates.
18
+ 3D descriptors expose these directly as engineered features. Whether they actually move the needle on a given downstream model is a separate, empirical question -- and the answer is more nuanced than the bullets above suggest.
19
+
20
+ ### When 2D Alone Is Enough
21
+
22
+ There is a real and well-supported skeptical position in the cheminformatics community: for most ADMET endpoints, well-engineered 2D fingerprints + learned graph representations are competitive with -- or better than -- 2D + 3D combined.
23
+
24
+ The evidence:
25
+
26
+ - On the [TDC ADMET leaderboards](https://tdcommons.ai/benchmark/overview/) through 2024-2026, top reproducible models (MapLight, MapLight+GNN, CaliciBoost, NovoExpert-2) use **ECFP/Avalon/ErG + 200 RDKit 2D physchem + GIN embeddings**, with **no explicit 3D features**. The Konopka et al. 2026 critical assessment of TDC leaderboard reproducibility makes this concrete.
27
+ - **PharmaBench** (Niu et al., *Sci. Data* 2024) finds no statistically significant 2D-vs-3D difference on most ADMET endpoints across thousands of compounds.
28
+ - **Bahia et al.** (*Mol. Inform.* 2023) report a 2D + 3D advantage over 2D alone -- but the delta is low single-digit AUC / R², not transformative.
29
+
30
+ So treat the 3D feature stream honestly: a *complementary* set that may give modest, endpoint-dependent gains (most plausibly on passive permeability, P-gp / BCRP recognition, conformer-dependent solubility) on top of a strong 2D + learned-representation baseline. It is not a foregone conclusion that 3D features improve any specific ADMET model -- run an ablation. See the [Limitations & Future Work](#limitations-future-work) section for forward-looking upgrades and a fuller honest accounting.
19
31
 
20
32
  ## Two Pipeline Modes: Fast and Full
21
33
 
@@ -55,7 +67,7 @@ The full endpoint uses a datamol-style adaptive tiering, with the upper tiers bu
55
67
  | 8-12 | 300 | Moderate flexibility, needs broader sampling |
56
68
  | ≥ 13 | 500 | High flexibility, large conformational space |
57
69
 
58
- This ensures adequate sampling of the conformational landscape without wasting compute on rigid molecules. On 300-conformer runs at 13+ rotatable bonds we measured ~20% NPR1 variance across random seeds; bumping to 500 conformers uses the documented "more samples" path to reduce that stochastic spread by roughly √(500/300) 1.29×.
70
+ This ensures adequate sampling of the conformational landscape without wasting compute on rigid molecules. On 300-conformer runs at 13+ rotatable bonds we measured ~20% NPR1 variance across random seeds; bumping to 500 conformers reduces *within-seed* variance by roughly √(500/300) ≈ 1.29× via the documented "more samples" path. It does not eliminate *cross-seed* variance different random seeds will still produce slightly different Boltzmann averages on highly flexible molecules — but for most ADMET endpoints this residual is below downstream model noise.
59
71
 
60
72
  ## The Computation Pipeline
61
73
 
@@ -253,6 +265,22 @@ cached_endpoint = InferenceCache(end_fast, cache_key_column="smiles")
253
265
  df_cached = cached_endpoint.inference(big_df) # Only computes uncached rows
254
266
  ```
255
267
 
268
+ ## Limitations & Future Work
269
+
270
+ The pipeline is conservative by design — production ADMET targets stable, deterministic features over the latest research methods. A few areas worth flagging for downstream users and future iterations:
271
+
272
+ **3D vs 2D in ADMET reality.** As noted in the introduction, top reproducible TDC ADMET models lean on 2D fingerprints + learned graph representations. The published evidence (PharmaBench *Sci. Data* 2024; Bahia *Mol. Inform.* 2023) is that 3D descriptors give marginal-but-real gains on geometry-sensitive endpoints and roughly neutral effects on most others. The 3D feature stream complements rather than replaces a strong 2D + learned-representation baseline.
273
+
274
+ **Cross-seed variance on highly flexible molecules.** The 500-conformer top tier reduces within-seed stochastic variance, but different random seeds will still produce slightly different Boltzmann averages on 13+ rotatable-bond molecules. For most ADMET endpoints this residual is below downstream model noise; for tasks that genuinely depend on a single conformer geometry it is not.
275
+
276
+ **Forward-looking upgrades** (evidence-backed; not yet implemented):
277
+
278
+ 1. **Single-point xTB / tblite re-ranking** of MMFF-optimized conformers before Boltzmann weighting. Kong et al. (*ChemPhysChem* 2025) show GFN2-xTB is currently the most suitable energy filter for drug-like conformer ranking. Pip-installable via `tblite-python`, deterministic.
279
+ 2. **CONFORGE as alternative embedder** for macrocycles and very-flexible scaffolds. Seidel et al. (*JCIM* 2023, CDPKit) — open source, slightly outperforms RDKit on small molecules and matches it on macrocycles where ETKDGv3 sampling plateaus.
280
+ 3. **Replace Gasteiger partial charges in CPSA** with AM1-BCC or an ML charge model (DASH; Mahmoud et al. 2023). Gasteiger is documented as the least accurate common partial-charge method, and CPSA accounts for 43 of our 52 Mordred 3D features — the highest-leverage upgrade for the existing feature set.
281
+
282
+ Deliberately *not* on this list: ML conformer generators (ETFlow, GeoMol, Lyrebird) — research-stage with no proven ADMET benefit; MACE-OFF / ANI-2x routine optimization — too heavy for production throughput; tautomer/protomer ensemble enumeration — mature in research, niche in production. We may revisit any of these as the surrounding tooling matures.
283
+
256
284
  ## References
257
285
 
258
286
  **Conformer Ensemble Methods**
@@ -271,16 +299,27 @@ df_cached = cached_endpoint.inference(big_df) # Only computes uncached rows
271
299
  - Landrum, G. *"Understanding conformer generation failures."* RDKit Blog (2023). [Blog post](https://greglandrum.github.io/rdkit-blog/posts/2023-05-17-understanding-confgen-errors.html)
272
300
  - Landrum, G. *"Scaling conformer generation."* RDKit Blog (2025). [Blog post](https://greglandrum.github.io/rdkit-blog/posts/2025-08-30-confgen-scaling.html)
273
301
  - Datamol conformer generation with adaptive tiering. [Documentation](https://docs.datamol.io/stable/tutorials/Conformers.html)
302
+ - Seidel, T., Permann, C., Wieder, O., Kohlbacher, S. & Langer, T. *"High-Quality Conformer Generation with CONFORGE: Algorithm and Performance Assessment."* J. Chem. Inf. Model. 63, 5549-5570 (2023). [DOI: 10.1021/acs.jcim.3c00563](https://doi.org/10.1021/acs.jcim.3c00563)
274
303
 
275
304
  **Force Fields**
276
305
 
277
306
  - Tosco, P., Stiefl, N. & Landrum, G. *"Bringing the MMFF force field to the RDKit: implementation and validation."* J. Cheminform. 6, 37 (2014). [DOI: 10.1186/s13321-014-0037-3](https://doi.org/10.1186/s13321-014-0037-3)
307
+ - Kong, Z., et al. *"Discriminating High from Low Energy Conformers of Druglike Molecules."* ChemPhysChem (2025). [DOI: 10.1002/cphc.202400992](https://doi.org/10.1002/cphc.202400992)
278
308
 
279
309
  **Descriptors**
280
310
 
281
311
  - RDKit 3D Descriptors: [Documentation](https://www.rdkit.org/docs/source/rdkit.Chem.Descriptors3D.html)
282
312
  - Mordred Community: [GitHub](https://github.com/JacksonBurns/mordred-community)
283
313
  - Stanton, D.T. & Jurs, P.C. *"Development and Use of Charged Partial Surface Area Structural Descriptors in Computer-Assisted Quantitative Structure-Property Relationship Studies."* Anal. Chem. 62, 2323-2329 (1990). [DOI: 10.1021/ac00220a013](https://doi.org/10.1021/ac00220a013)
314
+ - Bleiziffer, P., Schaller, K. & Riniker, S. *"Machine Learning of Partial Charges Derived from High-Quality Quantum-Mechanical Calculations."* J. Chem. Inf. Model. 58, 579-589 (2018). [DOI: 10.1021/acs.jcim.7b00663](https://doi.org/10.1021/acs.jcim.7b00663)
315
+ - Mahmoud, A.H., Masters, M.R., Lill, M.A., et al. *"DASH: Dynamic Attention-Based Substructure Hierarchy for Partial Charge Assignment."* J. Chem. Inf. Model. (2023). [DOI: 10.1021/acs.jcim.3c00800](https://doi.org/10.1021/acs.jcim.3c00800)
316
+
317
+ **ADMET Benchmarks and 2D vs 3D Evidence**
318
+
319
+ - Huang, K., et al. *"Therapeutics Data Commons: Machine Learning Datasets and Tasks for Drug Discovery and Development."* [TDC ADMET Leaderboards](https://tdcommons.ai/benchmark/overview/)
320
+ - Konopka, M., et al. *"Critical Assessment of ML Models for ADMET Prediction in TDC Leaderboards."* bioRxiv (2026). [DOI: 10.64898/2026.02.26.708193](https://www.biorxiv.org/content/10.64898/2026.02.26.708193v1)
321
+ - Niu, Z., et al. *"PharmaBench: Enhancing ADMET Benchmarks with Large Language Models."* Sci. Data 11, 985 (2024). [DOI: 10.1038/s41597-024-03793-0](https://doi.org/10.1038/s41597-024-03793-0)
322
+ - Bahia, M.S., et al. *"Comparison Between 2D and 3D Descriptors in QSAR Modeling Based on Bio-Activities."* Mol. Inform. 42, 2200186 (2023). [DOI: 10.1002/minf.202200186](https://doi.org/10.1002/minf.202200186)
284
323
 
285
324
  **ADMET and Chameleonic Molecules**
286
325
 
@@ -0,0 +1,129 @@
1
+ # Multi-Task ChemProp: Two Mechanisms, One Model
2
+ !!! tip inline end "ChemProp in Workbench"
3
+ Workbench supports four ChemProp variants — single-task, multi-task, hybrid, and foundation. See the [ChemProp Models](../models/chemprop_models.md) page for the full API.
4
+
5
+ A multi-task ChemProp model trains **one** message-passing encoder to predict **several** target properties at once. Each target gets its own feedforward head, but they all share the molecular representation that the MPNN learns. That shared encoder is where the wins come from — and where the failures come from when the setup is wrong.
6
+
7
+ In this blog we'll separate the two distinct mechanisms that drive multi-task lift:
8
+
9
+ 1. **Transfer learning** — gradients from auxiliary tasks regularize and enrich the shared encoder
10
+ 2. **Chemical-space expansion** — auxiliary datasets bring compounds the primary task never saw
11
+
12
+ These mechanisms are independent. A multi-task setup can lift from one, the other, or both — and recognizing which is at play guides how you design the data.
13
+
14
+ ## Mechanism 1: Transfer Learning Through the Shared Encoder
15
+
16
+ In a single-task ChemProp model, the encoder is supervised by exactly one signal — the gradient flowing back from one head, derived from one target column. In a multi-task model, the same encoder receives gradients from **every** head. Each task pulls the embedding space in its own direction, and the encoder converges to a representation that satisfies all of them at once.
17
+
18
+ <figure style="margin: 20px 0; width: 100%; display: block;">
19
+ <img src="../../images/chemprop_mt_transfer.svg" alt="Multi-task transfer learning: shared MPNN encoder with N task-specific FFN heads, gradients flowing back to the shared encoder" style="width: 100%; height: auto; display: block;">
20
+ <figcaption><em>One encoder, N heads, N gradients flowing back into the same weights — auxiliaries co-supervise the primary's representation.</em></figcaption>
21
+ </figure>
22
+
23
+ This sounds like a tug-of-war, and it is — but a productive one when the tasks are related. The encoder ends up encoding the molecular features useful **across** the family of tasks, rather than overfitting cues specific to any single one. That is exactly the transfer-learning setup, except the "transfer" happens *during* training rather than after.
24
+
25
+ Whether you get lift depends on the label relationship between primary and auxiliary on **shared** compounds (the rows where both have ground truth):
26
+
27
+ <table style="width: 100%;">
28
+ <thead>
29
+ <tr>
30
+ <th style="background-color: rgba(58, 134, 255, 0.5); color: white; padding: 10px 16px;">Pearson r on shared rows</th>
31
+ <th style="background-color: rgba(58, 134, 255, 0.5); color: white; padding: 10px 16px;">Verdict</th>
32
+ <th style="background-color: rgba(58, 134, 255, 0.5); color: white; padding: 10px 16px;">What happens to the encoder</th>
33
+ </tr>
34
+ </thead>
35
+ <tbody>
36
+ <tr><td class="text-orange" style="padding: 8px 16px; font-weight: bold;">0.4 – 0.95</td><td style="padding: 8px 16px;">Beneficial</td><td style="padding: 8px 16px;">Sweet spot — heads predict related but distinct targets, encoder learns richer features</td></tr>
37
+ <tr><td class="text-orange" style="padding: 8px 16px; font-weight: bold;">&gt; 0.95</td><td style="padding: 8px 16px;">Neutral</td><td style="padding: 8px 16px;">Labels redundant; aux head just re-weights primary supervision — no harm, no new info</td></tr>
38
+ <tr><td class="text-orange" style="padding: 8px 16px; font-weight: bold;">&lt; 0.4</td><td style="padding: 8px 16px;">Harmful</td><td style="padding: 8px 16px;">Heads disagree; encoder gradients conflict — negative-transfer risk</td></tr>
39
+ </tbody>
40
+ </table>
41
+
42
+ The "sweet spot" is the regime where transfer learning earns its name. The auxiliary task is related enough that its gradient pushes the encoder toward useful chemistry, but distinct enough that it brings new information. Outside that band, multi-task either contributes nothing or actively hurts — picking auxiliaries blindly is the most common cause of a multi-task model that underperforms its single-task baseline.
43
+
44
+ ## Mechanism 2: Chemical-Space Expansion
45
+
46
+ The transfer-learning story above plays out on the **overlap region** — compounds where both primary and auxiliary tasks have ground truth. But auxiliary datasets often contain compounds the primary task never saw at all. When the auxiliary is, say, public ChEMBL data while the primary is in-house screening data, the auxiliary brings in **chemistry** the primary doesn't have.
47
+
48
+ <figure style="margin: 20px 0; width: 100%; display: block;">
49
+ <img src="../../images/chemprop_mt_expansion.svg" alt="Chemical-space expansion: single-task encoder sees only primary chemistry; multi-task encoder also sees auxiliary chemistry that surrounds and extends beyond the primary" style="width: 100%; height: auto; display: block;">
50
+ <figcaption><em>A test compound outside the primary's chemistry is an extrapolation for the single-task encoder; the multi-task encoder has already seen that region via auxiliary data.</em></figcaption>
51
+ </figure>
52
+
53
+ For aux-only compounds, the primary head's loss is masked — there's no primary label to supervise against — so the primary head sees no direct gradient on those rows. But the **encoder** does. Every aux-only molecule pushes the encoder to handle a broader range of chemistry, and the encoder's representation generalizes accordingly. The primary head, downstream, inherits a more capable encoder.
54
+
55
+ Two important consequences follow:
56
+
57
+ - **Extension can lift even with zero label correlation.** It doesn't require the auxiliary task to *predict* anything related to the primary — it just requires the auxiliary to bring relevant chemistry. A noisy public dataset on a marginally related endpoint can still expand the encoder's coverage.
58
+ - **Extension cannot actively hurt the primary.** The worst case for an aux-only compound is "encoder learns features that don't help" — not "encoder learns features that mislead." There's no primary gradient on those rows to be corrupted.
59
+
60
+ This is why extension and overlap are scored as independent axes in our pre-flight check.
61
+
62
+ ## Putting Both Axes Together
63
+
64
+ Workbench's `assess_multi_task_data` utility scores each auxiliary along these two axes from labels alone — no training required — then combines them into an actionable recommendation:
65
+
66
+ ```python
67
+ from workbench.utils.multi_task import assess_multi_task_data
68
+
69
+ assessment = assess_multi_task_data(
70
+ df,
71
+ target_columns=["logd", "ksol", "hlm_clint", "mlm_clint"],
72
+ )
73
+ print(assessment[["auxiliary", "overlap", "extension", "recommendation"]])
74
+ ```
75
+
76
+ The recommendation logic is straightforward once both axes are scored:
77
+
78
+ <table style="width: 100%;">
79
+ <thead>
80
+ <tr>
81
+ <th style="background-color: rgba(58, 134, 255, 0.5); color: white; padding: 10px 16px;">Recommendation</th>
82
+ <th style="background-color: rgba(58, 134, 255, 0.5); color: white; padding: 10px 16px;">When</th>
83
+ </tr>
84
+ </thead>
85
+ <tbody>
86
+ <tr><td class="text-orange" style="padding: 8px 16px; font-weight: bold;">Use</td><td style="padding: 8px 16px;">Either axis is genuinely lifting and there are no harm signals</td></tr>
87
+ <tr><td class="text-orange" style="padding: 8px 16px; font-weight: bold;">Marginal</td><td style="padding: 8px 16px;">Limited contribution from either axis — proceed only if domain knowledge supports it</td></tr>
88
+ <tr><td class="text-orange" style="padding: 8px 16px; font-weight: bold;">Risky</td><td style="padding: 8px 16px;">Harmful overlap, but extension might rescue it — validate against single-task baseline</td></tr>
89
+ <tr><td class="text-orange" style="padding: 8px 16px; font-weight: bold;">Skip</td><td style="padding: 8px 16px;">No useful contribution from either axis</td></tr>
90
+ </tbody>
91
+ </table>
92
+
93
+ ## When Multi-Task Helps in Practice
94
+
95
+ The mechanism breakdown suggests a few practical heuristics:
96
+
97
+ 1. **Pick auxiliaries that are mechanistically related to the primary.** ADMET endpoints (LogD, solubility, clearance, permeability) all share underlying physicochemistry — a textbook MT setup. Mixing unrelated bioactivity with ADMET tends to fall in the negative-transfer zone.
98
+
99
+ 2. **Public data is often valuable purely for chemical-space expansion.** Even when public labels are noisy or measured under different protocols, the chemistry they bring can sharpen the encoder. Use SMILES-based merging via `combine_multi_task_data(..., merge_on_smiles=True)` to fold them in without needing a shared id namespace.
100
+
101
+ 3. **Use task weights deliberately.** When all tasks are end products, `compute_inverse_count_task_weights` balances each task's gradient contribution. When you have a primary + auxiliaries that are only there to help the primary, use manual primary-favored weights (e.g. `[1.0, 0.3, 0.3]`) so the auxiliaries don't swamp the primary signal.
102
+
103
+ 4. **Validate against single-task baselines.** Multi-task is an architectural choice, not a free lunch. Always train the matched single-task model and compare on a held-out test set — especially for "Risky" and "Marginal" auxiliaries.
104
+
105
+ ## Summary
106
+
107
+ Multi-task ChemProp lift comes from two distinct mechanisms — transfer learning through the shared encoder, and chemical-space expansion from non-overlapping auxiliary compounds. Recognizing which mechanism is operating (or whether neither is) lets you design the multi-task setup deliberately rather than hoping it works. Workbench's pre-flight assessment quantifies both axes from the labels alone, before you spend the training cycles.
108
+
109
+ ## References
110
+
111
+ **ChemProp v2** — The message-passing neural network framework that Workbench uses for molecular property prediction:
112
+
113
+ - Chemprop v2 Paper: Graff, D.E., Morgan, N.K., Burns, J.W., et al. *"Chemprop v2: An Efficient, Modular Machine Learning Package for Chemical Property Prediction."* Journal of Chemical Information and Modeling 66(1), 28–33 (2026). [DOI: 10.1021/acs.jcim.5c02332](https://doi.org/10.1021/acs.jcim.5c02332)
114
+ - GitHub: [https://github.com/chemprop/chemprop](https://github.com/chemprop/chemprop)
115
+
116
+ **Multi-Task Learning** — Foundational and survey work on shared-representation learning:
117
+
118
+ - Caruana, R. *"Multitask Learning."* Machine Learning 28, 41–75 (1997). [DOI: 10.1023/A:1007379606734](https://doi.org/10.1023/A:1007379606734)
119
+ - Ruder, S. *"An Overview of Multi-Task Learning in Deep Neural Networks."* arXiv:1706.05098 (2017). [https://arxiv.org/abs/1706.05098](https://arxiv.org/abs/1706.05098)
120
+
121
+ **Multi-Task Learning for Molecular Property Prediction**:
122
+
123
+ - Ramsundar, B., Kearnes, S., Riley, P., et al. *"Massively Multitask Networks for Drug Discovery."* arXiv:1502.02072 (2015). [https://arxiv.org/abs/1502.02072](https://arxiv.org/abs/1502.02072)
124
+ - Wenzel, J., Matter, H., Schmidt, F. *"Predictive Multitask Deep Neural Network Models for ADME-Tox Properties."* Journal of Chemical Information and Modeling 59(3), 1253–1268 (2019). [DOI: 10.1021/acs.jcim.8b00785](https://doi.org/10.1021/acs.jcim.8b00785)
125
+
126
+ ## Questions?
127
+ <img align="right" src="../../images/scp.png" width="180">
128
+
129
+ The SuperCowPowers team is happy to answer any questions you may have about AWS and Workbench. Please contact us at [workbench@supercowpowers.com](mailto:workbench@supercowpowers.com) or on chat us up on [Discord](https://discord.gg/WHAJuz8sw8)
@@ -12,6 +12,8 @@ Workbench blogs highlight interesting functionality and approaches that might be
12
12
 
13
13
  - **[SHAP Values for ChemProp Models](chemprop_shap.md):** How do you explain a graph neural network? In this blog we explore our per-bit ablation approach for computing [SHAP values](https://shap.readthedocs.io/) on [ChemProp](https://github.com/chemprop/chemprop) MPNN models. We walk through the technical approach, show key code snippets, and analyze real SHAP output from a LogD regression model — validating that the model independently learns known structure-lipophilicity relationships.
14
14
 
15
+ - **[Multi-Task ChemProp: Two Mechanisms, One Model](chemprop_multi_task.md):** Multi-task ChemProp lifts come from two distinct mechanisms — transfer learning through a shared MPNN encoder, and chemical-space expansion from non-overlapping auxiliary compounds. We separate the two with conceptual diagrams, show when each one helps (vs. hurts), and tie the discussion back to Workbench's pre-flight `assess_multi_task_data` utility that scores both axes from labels alone.
16
+
15
17
  - **[Inside a Workbench AWS Endpoint](aws_endpoint_architecture.md):** A deep dive into endpoint architecture — comparing the default SageMaker stack (Nginx, Gunicorn, Flask) with Workbench's modern ASGI stack (Uvicorn, FastAPI). We cover the custom image with pre-loaded chemistry packages, and Workbench's binary-search error handling that isolates bad rows instead of failing entire batches.
16
18
 
17
19
  - **[Molecular Standardization](molecular_standardization.md):** Why molecular standardization matters for ML pipelines. We walk through Workbench's four-step pipeline — cleanup, salt handling, charge neutralization, and tautomer canonicalization. We also describe **2D** and **3D** molecular descriptors computed by our feature endpoints.
@@ -0,0 +1,111 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 540" font-family="'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif">
2
+ <defs>
3
+ <radialGradient id="exp-primary" cx="50%" cy="50%" r="50%">
4
+ <stop offset="0%" stop-color="#1E88E5" stop-opacity="0.55"/>
5
+ <stop offset="100%" stop-color="#1565C0" stop-opacity="0.15"/>
6
+ </radialGradient>
7
+ <radialGradient id="exp-aux" cx="50%" cy="50%" r="50%">
8
+ <stop offset="0%" stop-color="#FB8C00" stop-opacity="0.40"/>
9
+ <stop offset="100%" stop-color="#EF6C00" stop-opacity="0.08"/>
10
+ </radialGradient>
11
+ <filter id="exp-shadow">
12
+ <feDropShadow dx="1" dy="2" stdDeviation="2" flood-opacity="0.18"/>
13
+ </filter>
14
+ <marker id="exp-arrow" markerWidth="9" markerHeight="7" refX="8" refY="3.5" orient="auto">
15
+ <path d="M0,0 L9,3.5 L0,7 Z" fill="#888"/>
16
+ </marker>
17
+ </defs>
18
+
19
+ <!-- Title -->
20
+ <text x="500" y="38" text-anchor="middle" font-size="26" font-weight="700" fill="#E0E0E0">Chemical-Space Expansion</text>
21
+ <text x="500" y="64" text-anchor="middle" font-size="17" fill="#9E9E9E">Auxiliary tasks bring novel chemistry the primary never saw</text>
22
+
23
+ <!-- ============================================================== -->
24
+ <!-- LEFT PANEL: Single-task encoder -->
25
+ <!-- ============================================================== -->
26
+ <rect x="30" y="90" width="430" height="380" rx="14" fill="#1F2A33" stroke="#37474F" stroke-width="1.5"/>
27
+ <text x="245" y="121" text-anchor="middle" font-size="19" font-weight="700" fill="#E0E0E0">Single-Task Encoder</text>
28
+ <text x="245" y="143" text-anchor="middle" font-size="16" fill="#90A4AE">trained on primary task only</text>
29
+
30
+ <!-- Primary cluster -->
31
+ <ellipse cx="220" cy="295" rx="105" ry="90" fill="url(#exp-primary)" stroke="#1E88E5" stroke-width="2"/>
32
+ <text x="220" y="298" text-anchor="middle" font-size="16" font-weight="700" fill="#BBDEFB">Primary task</text>
33
+ <text x="220" y="319" text-anchor="middle" font-size="15" fill="#90CAF9">in-house chemotypes</text>
34
+
35
+ <!-- Primary dots -->
36
+ <g fill="#1E88E5">
37
+ <circle cx="180" cy="255" r="3.5"/><circle cx="210" cy="245" r="3.5"/>
38
+ <circle cx="245" cy="260" r="3.5"/><circle cx="275" cy="280" r="3.5"/>
39
+ <circle cx="170" cy="295" r="3.5"/><circle cx="200" cy="340" r="3.5"/>
40
+ <circle cx="240" cy="350" r="3.5"/><circle cx="265" cy="325" r="3.5"/>
41
+ <circle cx="155" cy="325" r="3.5"/><circle cx="225" cy="275" r="3.5"/>
42
+ </g>
43
+
44
+ <!-- Test compound (out-of-distribution for primary) -->
45
+ <g>
46
+ <circle cx="380" cy="200" r="7" fill="none" stroke="#FF5252" stroke-width="2.5"/>
47
+ <circle cx="380" cy="200" r="3" fill="#FF5252"/>
48
+ <text x="395" y="195" font-size="16" font-weight="700" fill="#FF5252">test compound</text>
49
+ <text x="395" y="215" font-size="14" fill="#EF9A9A">(out of distribution)</text>
50
+ </g>
51
+ <line x1="370" y1="207" x2="320" y2="240" stroke="#FF5252" stroke-width="1.5" stroke-dasharray="4,3"/>
52
+
53
+ <!-- Verdict -->
54
+ <rect x="55" y="408" width="380" height="50" rx="8" fill="#2D1B1B" stroke="#FF5252" stroke-width="1.5"/>
55
+ <text x="245" y="431" text-anchor="middle" font-size="16" font-weight="700" fill="#FF8A80">Encoder never saw this chemistry</text>
56
+ <text x="245" y="450" text-anchor="middle" font-size="14" fill="#EF9A9A">unreliable extrapolation, brittle predictions</text>
57
+
58
+ <!-- ============================================================== -->
59
+ <!-- RIGHT PANEL: Multi-task encoder -->
60
+ <!-- ============================================================== -->
61
+ <rect x="540" y="90" width="430" height="380" rx="14" fill="#1F2A33" stroke="#37474F" stroke-width="1.5"/>
62
+ <text x="755" y="121" text-anchor="middle" font-size="19" font-weight="700" fill="#E0E0E0">Multi-Task Encoder</text>
63
+ <text x="755" y="143" text-anchor="middle" font-size="16" fill="#90A4AE">trained on primary + auxiliary tasks</text>
64
+
65
+ <!-- Aux extension cloud (large, behind primary) -->
66
+ <ellipse cx="755" cy="290" rx="180" ry="140" fill="url(#exp-aux)" stroke="#FB8C00" stroke-width="2" stroke-dasharray="6,3"/>
67
+ <text x="845" y="180" text-anchor="middle" font-size="17" font-weight="700" fill="#FFCC80">Aux chemistry</text>
68
+ <text x="845" y="200" text-anchor="middle" font-size="15" fill="#FFB74D">public / related endpoints</text>
69
+
70
+ <!-- Primary cluster (same as left panel) -->
71
+ <ellipse cx="700" cy="300" rx="80" ry="68" fill="url(#exp-primary)" stroke="#1E88E5" stroke-width="2"/>
72
+ <text x="700" y="305" text-anchor="middle" font-size="15" font-weight="700" fill="#BBDEFB">Primary</text>
73
+
74
+ <!-- Primary dots -->
75
+ <g fill="#1E88E5">
76
+ <circle cx="680" cy="275" r="3.5"/><circle cx="705" cy="267" r="3.5"/>
77
+ <circle cx="730" cy="283" r="3.5"/><circle cx="660" cy="300" r="3.5"/>
78
+ <circle cx="695" cy="335" r="3.5"/><circle cx="725" cy="325" r="3.5"/>
79
+ <circle cx="710" cy="300" r="3.5"/><circle cx="675" cy="325" r="3.5"/>
80
+ </g>
81
+
82
+ <!-- Aux-only dots (scattered around the larger cloud, NOT in primary) -->
83
+ <g fill="#FB8C00">
84
+ <circle cx="610" cy="225" r="3"/><circle cx="640" cy="205" r="3"/>
85
+ <circle cx="600" cy="275" r="3"/><circle cx="585" cy="325" r="3"/>
86
+ <circle cx="610" cy="370" r="3"/><circle cx="650" cy="390" r="3"/>
87
+ <circle cx="720" cy="400" r="3"/><circle cx="790" cy="390" r="3"/>
88
+ <circle cx="845" cy="365" r="3"/><circle cx="880" cy="325" r="3"/>
89
+ <circle cx="890" cy="265" r="3"/><circle cx="800" cy="205" r="3"/>
90
+ <circle cx="755" cy="200" r="3"/><circle cx="700" cy="205" r="3"/>
91
+ <circle cx="870" cy="290" r="3"/><circle cx="595" cy="300" r="3"/>
92
+ <circle cx="620" cy="340" r="3"/>
93
+ </g>
94
+
95
+ <!-- Test compound (now INSIDE the union, sitting on an aux dot) -->
96
+ <g>
97
+ <circle cx="820" cy="225" r="7" fill="none" stroke="#69F0AE" stroke-width="2.5"/>
98
+ <circle cx="820" cy="225" r="3" fill="#69F0AE"/>
99
+ <text x="836" y="222" font-size="16" font-weight="700" fill="#69F0AE">test compound</text>
100
+ <text x="836" y="241" font-size="14" fill="#A5D6A7">(covered by aux)</text>
101
+ </g>
102
+
103
+ <!-- Verdict -->
104
+ <rect x="565" y="408" width="380" height="50" rx="8" fill="#152418" stroke="#69F0AE" stroke-width="1.5"/>
105
+ <text x="755" y="431" text-anchor="middle" font-size="16" font-weight="700" fill="#A5D6A7">Encoder learned features across both</text>
106
+ <text x="755" y="450" text-anchor="middle" font-size="14" fill="#C8E6C9">extends to chemistry the primary never labeled</text>
107
+
108
+ <!-- Bottom annotation -->
109
+ <rect x="30" y="488" width="940" height="42" rx="10" fill="none" stroke="#FF9800" stroke-width="1.5" stroke-dasharray="6,3"/>
110
+ <text x="500" y="515" text-anchor="middle" font-size="16" fill="#BDBDBD">Aux-only compounds give the <tspan font-weight="700" fill="#FF9800">encoder</tspan> more chemistry to learn from — even without a primary gradient</text>
111
+ </svg>