D4CMPP2 1.0.0__tar.gz → 1.0.2__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 (190) hide show
  1. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/PKG-INFO +5 -2
  2. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/PKG-INFO +5 -2
  3. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/README.md +4 -1
  4. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/__init__.py +1 -2
  5. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/pyproject.toml +1 -1
  6. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/optimization.py +28 -7
  7. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_optimize.py +33 -0
  8. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t6_ci_contract.py +15 -0
  9. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/SOURCES.txt +0 -0
  10. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/dependency_links.txt +0 -0
  11. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/entry_points.txt +0 -0
  12. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/requires.txt +0 -0
  13. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/top_level.txt +0 -0
  14. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/LICENSE +0 -0
  15. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/MANIFEST.in +0 -0
  16. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/AGENTS.md +0 -0
  17. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/Aqsoldb.csv +0 -0
  18. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/BradleyMP.csv +0 -0
  19. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/Lipophilicity.csv +0 -0
  20. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/README.md +0 -0
  21. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/__init__.py +0 -0
  22. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/optical.csv +0 -0
  23. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/test.csv +0 -0
  24. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/__main__.py +0 -0
  25. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_main.py +0 -0
  26. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/cli.py +0 -0
  27. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/AGENTS.md +0 -0
  28. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/ISA/segment.py +0 -0
  29. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/README.md +0 -0
  30. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/assets/tiny_numeric.csv +0 -0
  31. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/cli/README.md +0 -0
  32. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/custom_network.py +0 -0
  33. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/experiments/01_compare.py +0 -0
  34. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/experiments/02_optimize.py +0 -0
  35. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/experiments/03_legacy_grid_search.py +0 -0
  36. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/extensions/01_callbacks.py +0 -0
  37. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/extensions/02_custom_network_training.py +0 -0
  38. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/extensions/03_numeric_inputs.py +0 -0
  39. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/inference/01_prediction.py +0 -0
  40. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/inference/02_csv_prediction.py +0 -0
  41. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/inference/03_uncertainty_ensemble.py +0 -0
  42. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/inference/04_isa_interpretation.py +0 -0
  43. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/README.md +0 -0
  44. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/common.py +0 -0
  45. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/run_all.py +0 -0
  46. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/solvent_analyzer.py +0 -0
  47. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/transfer_learning.py +0 -0
  48. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/01_basic_cpu.py +0 -0
  49. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/02_solvent.py +0 -0
  50. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/03_multitarget.py +0 -0
  51. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/04_splitting_reproducibility.py +0 -0
  52. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/05_isa.py +0 -0
  53. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/06_saved_model_modes.py +0 -0
  54. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/07_model_families.py +0 -0
  55. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/exceptions.py +0 -0
  56. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/grid_search.py +0 -0
  57. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/network_refer.yaml +0 -0
  58. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/AFP_model.py +0 -0
  59. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/AFPwithSolv_model.py +0 -0
  60. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/DMPNN_model.py +0 -0
  61. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/DMPNNwithSolv_model.py +0 -0
  62. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GAT_model.py +0 -0
  63. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GATwithSolv_model.py +0 -0
  64. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GCN_model.py +0 -0
  65. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GCNwithSolv_model.py +0 -0
  66. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GC_model.py +0 -0
  67. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/ISATPM_model.py +0 -0
  68. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/ISATPN_model.py +0 -0
  69. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/ISAT_model.py +0 -0
  70. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/MPNN_model.py +0 -0
  71. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/MPNNwithSolv_model.py +0 -0
  72. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/__init__.py +0 -0
  73. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/base.py +0 -0
  74. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/registry.py +0 -0
  75. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/AFP.py +0 -0
  76. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/BiDropout.py +0 -0
  77. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/DMPNN.py +0 -0
  78. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/GAT.py +0 -0
  79. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/GC.py +0 -0
  80. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/GCN.py +0 -0
  81. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/ISAT.py +0 -0
  82. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/Linear.py +0 -0
  83. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/MPNN.py +0 -0
  84. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/SolventLayer.py +0 -0
  85. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/__init__.py +0 -0
  86. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/distGCN.py +0 -0
  87. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/pyg_hetero.py +0 -0
  88. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/optimize.py +0 -0
  89. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/setup.cfg +0 -0
  90. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/ISAAnalyzer.py +0 -0
  91. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/ISAPNAnalyzer.py +0 -0
  92. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/ISAwSAnalyzer.py +0 -0
  93. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/MolAnalyzer.py +0 -0
  94. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/__init__.py +0 -0
  95. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/core.py +0 -0
  96. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/factory.py +0 -0
  97. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/interpretation.py +0 -0
  98. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/results.py +0 -0
  99. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/Dataset/GraphDataset.py +0 -0
  100. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/Dataset/ISAGraphDataset.py +0 -0
  101. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/Dataset/__init__.py +0 -0
  102. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/GraphGenerator/ISAGraphGenerator.py +0 -0
  103. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/GraphGenerator/MolGraphGenerator.py +0 -0
  104. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/GraphGenerator/__init__.py +0 -0
  105. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/ISADataManager.py +0 -0
  106. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/MolDataManager.py +0 -0
  107. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/__init__.py +0 -0
  108. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/contracts.py +0 -0
  109. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/NetworkManager/ISANetworkManager.py +0 -0
  110. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/NetworkManager/NetworkManager.py +0 -0
  111. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/NetworkManager/__init__.py +0 -0
  112. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/PostProcessor.py +0 -0
  113. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/TrainManager/ISATrainManager.py +0 -0
  114. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/TrainManager/TrainManager.py +0 -0
  115. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/TrainManager/__init__.py +0 -0
  116. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/TrainManager/callbacks.py +0 -0
  117. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/__init__.py +0 -0
  118. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/__init__.py +0 -0
  119. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/command.py +0 -0
  120. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/errors.py +0 -0
  121. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/legacy_grid_search.py +0 -0
  122. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/training.py +0 -0
  123. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/PATH.py +0 -0
  124. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/__init__.py +0 -0
  125. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/argparser.py +0 -0
  126. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/checkpointing.py +0 -0
  127. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/config_resolution.py +0 -0
  128. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/config_validation.py +0 -0
  129. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/csv_validation.py +0 -0
  130. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/data_quality.py +0 -0
  131. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/featureizer.py +0 -0
  132. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/functional_group.csv +0 -0
  133. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/graph_cache.py +0 -0
  134. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/leaderboard.py +0 -0
  135. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/metrics.py +0 -0
  136. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/module_loader.py +0 -0
  137. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/output.py +0 -0
  138. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/reproducibility.py +0 -0
  139. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/run_manifest.py +0 -0
  140. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/scaler.py +0 -0
  141. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/sculptor.py +0 -0
  142. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/splitting.py +0 -0
  143. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/supportfile_saver.py +0 -0
  144. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/tools.py +0 -0
  145. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/transfer_learning.py +0 -0
  146. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_cli_packaging.py +0 -0
  147. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_config_validation.py +0 -0
  148. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_csv_data_manager_validation.py +0 -0
  149. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_csv_validation.py +0 -0
  150. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_custom_network.py +0 -0
  151. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_data_fixture.py +0 -0
  152. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_example_model_compatibility.py +0 -0
  153. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_examples_syntax.py +0 -0
  154. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_failure_behavior.py +0 -0
  155. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_failure_contracts.py +0 -0
  156. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_gcn_end_to_end.py +0 -0
  157. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_graph_alignment.py +0 -0
  158. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_heavy_smoke.py +0 -0
  159. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_network_abc.py +0 -0
  160. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_network_persistence.py +0 -0
  161. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_path_utils.py +0 -0
  162. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_public_contracts.py +0 -0
  163. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_data_contract.py +0 -0
  164. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_dmpnn_afp.py +0 -0
  165. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_gcn.py +0 -0
  166. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_isa_models.py +0 -0
  167. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_mpnn_gat.py +0 -0
  168. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_runtime_environment.py +0 -0
  169. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_scaler_alignment.py +0 -0
  170. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_solvent_analyzer_end_to_end.py +0 -0
  171. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_state_dict_contract.py +0 -0
  172. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_checkpoint_policy.py +0 -0
  173. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_data_quality.py +0 -0
  174. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_dataset_contract_matrix.py +0 -0
  175. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_graph_cache_integrity.py +0 -0
  176. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_grid_search.py +0 -0
  177. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_leaderboard.py +0 -0
  178. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_registry_smoke_matrix.py +0 -0
  179. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_reproducibility.py +0 -0
  180. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_run_manifest.py +0 -0
  181. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_scaffold_split.py +0 -0
  182. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_transfer_learning.py +0 -0
  183. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t4_analyzer_core.py +0 -0
  184. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_callbacks.py +0 -0
  185. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_config_resolution.py +0 -0
  186. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_errors_logging.py +0 -0
  187. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_import_discovery.py +0 -0
  188. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_manager_contracts.py +0 -0
  189. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_verbose_output.py +0 -0
  190. {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t7_cycle_audit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: D4CMPP2
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: PyTorch Geometric molecular property prediction models
5
5
  License-Expression: MIT
6
6
  Requires-Python: <3.13,>=3.10
@@ -371,7 +371,10 @@ print(result.best_params, result.best_model_path)
371
371
  `HP=None` uses the model's default optimization space. A key list uses declared
372
372
  model ranges; a dictionary supplies categorical values or numeric ranges.
373
373
  Supported strategies are `"bayesian"` and `"grid"`. Atomic JSON/CSV summaries
374
- and trial directories allow compatible searches to resume.
374
+ and trial directories allow compatible searches to resume. When
375
+ `optimization_path` is omitted, each call creates a separate timestamped
376
+ `_Models/optimize_{network}_...` directory. To resume a search, pass its
377
+ existing directory as `optimization_path` with `resume=True`.
375
378
 
376
379
  The legacy `grid_search()` API remains available with its historical `None`
377
380
  return value and continue-on-trial-error behavior.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: D4CMPP2
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: PyTorch Geometric molecular property prediction models
5
5
  License-Expression: MIT
6
6
  Requires-Python: <3.13,>=3.10
@@ -371,7 +371,10 @@ print(result.best_params, result.best_model_path)
371
371
  `HP=None` uses the model's default optimization space. A key list uses declared
372
372
  model ranges; a dictionary supplies categorical values or numeric ranges.
373
373
  Supported strategies are `"bayesian"` and `"grid"`. Atomic JSON/CSV summaries
374
- and trial directories allow compatible searches to resume.
374
+ and trial directories allow compatible searches to resume. When
375
+ `optimization_path` is omitted, each call creates a separate timestamped
376
+ `_Models/optimize_{network}_...` directory. To resume a search, pass its
377
+ existing directory as `optimization_path` with `resume=True`.
375
378
 
376
379
  The legacy `grid_search()` API remains available with its historical `None`
377
380
  return value and continue-on-trial-error behavior.
@@ -346,7 +346,10 @@ print(result.best_params, result.best_model_path)
346
346
  `HP=None` uses the model's default optimization space. A key list uses declared
347
347
  model ranges; a dictionary supplies categorical values or numeric ranges.
348
348
  Supported strategies are `"bayesian"` and `"grid"`. Atomic JSON/CSV summaries
349
- and trial directories allow compatible searches to resume.
349
+ and trial directories allow compatible searches to resume. When
350
+ `optimization_path` is omitted, each call creates a separate timestamped
351
+ `_Models/optimize_{network}_...` directory. To resume a search, pass its
352
+ existing directory as `optimization_path` with `resume=True`.
350
353
 
351
354
  The legacy `grid_search()` API remains available with its historical `None`
352
355
  return value and continue-on-trial-error behavior.
@@ -1,4 +1,4 @@
1
- __version__ = "1.0.0"
1
+ __version__ = "1.0.2"
2
2
 
3
3
  from D4CMPP2.src.api.training import train as train
4
4
  from D4CMPP2.src.api.legacy_grid_search import grid_search as grid_search
@@ -13,4 +13,3 @@ from D4CMPP2.networks import (
13
13
  MolecularNetwork as MolecularNetwork,
14
14
  register_network as register_network,
15
15
  )
16
-
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "D4CMPP2"
7
- version = "1.0.0"
7
+ version = "1.0.2"
8
8
  description = "PyTorch Geometric molecular property prediction models"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10,<3.13"
@@ -268,6 +268,21 @@ def _write_summary(path, summary):
268
268
  staging.unlink()
269
269
 
270
270
 
271
+ def _create_default_optimization_root(model_dir, network):
272
+ """Create and return a unique directory for one optimization invocation."""
273
+ parent = Path(model_dir or "_Models").resolve()
274
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
275
+ stem = f"optimize_{network}_{timestamp}"
276
+ for suffix in itertools.count():
277
+ name = stem if suffix == 0 else f"{stem}_{suffix + 1}"
278
+ candidate = parent / name
279
+ try:
280
+ candidate.mkdir(parents=True, exist_ok=False)
281
+ except FileExistsError:
282
+ continue
283
+ return candidate
284
+
285
+
271
286
  def _random_parameters(domains, rng):
272
287
  return {domain.name: domain.sample(rng) for domain in domains}
273
288
 
@@ -327,7 +342,12 @@ def optimize(
327
342
  resume=True,
328
343
  **train_kwargs,
329
344
  ):
330
- """Tune one registered network and return its best completed trial."""
345
+ """Tune one registered network and return its best completed trial.
346
+
347
+ Calls without ``optimization_path`` create independent timestamped run
348
+ directories. Pass the same explicit path with ``resume=True`` to resume a
349
+ compatible search.
350
+ """
331
351
  if not isinstance(optimize_strategy, str):
332
352
  raise TypeError("optimize_strategy must be 'grid' or 'bayesian'.")
333
353
  strategy = optimize_strategy.lower()
@@ -342,12 +362,13 @@ def optimize(
342
362
  elif n_trials is not None:
343
363
  raise ValueError("n_trials is only used with optimize_strategy='bayesian'.")
344
364
 
345
- root = Path(
346
- optimization_path
347
- or Path(train_kwargs.get("MODEL_DIR", "_Models"))
348
- / f"optimize_{network}"
349
- ).resolve()
350
- root.mkdir(parents=True, exist_ok=True)
365
+ if optimization_path:
366
+ root = Path(optimization_path).resolve()
367
+ root.mkdir(parents=True, exist_ok=True)
368
+ else:
369
+ root = _create_default_optimization_root(
370
+ train_kwargs.get("MODEL_DIR"), network
371
+ )
351
372
  summary_path = root / "optimization.json"
352
373
  if resume and summary_path.exists():
353
374
  summary = json.loads(summary_path.read_text(encoding="utf-8"))
@@ -93,6 +93,39 @@ class OptimizeTests(unittest.TestCase):
93
93
  optimization_path=temp,
94
94
  )
95
95
 
96
+ @heavy_test
97
+ def test_default_path_is_unique_per_optimization_invocation(self):
98
+ optimize_module = importlib.import_module("D4CMPP2.optimize")
99
+ with tempfile.TemporaryDirectory(prefix="d4cmpp2-optimize-default-") as temp:
100
+ with mock.patch.object(
101
+ optimize_module, "train", side_effect=self._fake_train
102
+ ) as train_mock:
103
+ first = optimize_module.optimize(
104
+ data="fixture.csv",
105
+ target=["target"],
106
+ network="GCN",
107
+ HP={"hidden_dim": [16]},
108
+ optimize_strategy="grid",
109
+ MODEL_DIR=temp,
110
+ )
111
+ second = optimize_module.optimize(
112
+ data="fixture.csv",
113
+ target=["target"],
114
+ network="GCN",
115
+ HP={"hidden_dim": [16]},
116
+ optimize_strategy="grid",
117
+ MODEL_DIR=temp,
118
+ )
119
+
120
+ first_root = Path(first.summary_path).parent
121
+ second_root = Path(second.summary_path).parent
122
+ self.assertEqual(train_mock.call_count, 2)
123
+ self.assertNotEqual(first_root, second_root)
124
+ self.assertEqual(first_root.parent, Path(temp).resolve())
125
+ self.assertEqual(second_root.parent, Path(temp).resolve())
126
+ self.assertTrue(first_root.name.startswith("optimize_GCN_"))
127
+ self.assertTrue(second_root.name.startswith("optimize_GCN_"))
128
+
96
129
  @heavy_test
97
130
  def test_bayesian_runs_requested_trials_and_is_reproducible(self):
98
131
  optimize_module = importlib.import_module("D4CMPP2.optimize")
@@ -1,4 +1,5 @@
1
1
  from pathlib import Path
2
+ import re
2
3
  import unittest
3
4
 
4
5
 
@@ -7,6 +8,19 @@ WORKFLOW = ROOT / ".github" / "workflows" / "ci.yml"
7
8
 
8
9
 
9
10
  class CIContractTests(unittest.TestCase):
11
+ def test_runtime_version_matches_distribution_metadata(self):
12
+ pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8")
13
+ package_init = (ROOT / "__init__.py").read_text(encoding="utf-8")
14
+ metadata_version = re.search(
15
+ r'^version\s*=\s*"([^"]+)"', pyproject, re.MULTILINE
16
+ )
17
+ runtime_version = re.search(
18
+ r'^__version__\s*=\s*"([^"]+)"', package_init, re.MULTILINE
19
+ )
20
+ self.assertIsNotNone(metadata_version)
21
+ self.assertIsNotNone(runtime_version)
22
+ self.assertEqual(metadata_version.group(1), runtime_version.group(1))
23
+
10
24
  def test_release_workflow_uses_verified_artifact_and_job_scoped_oidc(self):
11
25
  release = (ROOT / ".github" / "workflows" / "release.yml").read_text(
12
26
  encoding="utf-8"
@@ -95,6 +109,7 @@ class CIContractTests(unittest.TestCase):
95
109
  self.assertIn("check_distribution_artifacts.py", artifact_script)
96
110
  self.assertIn("wheel_install_smoke.py", artifact_script)
97
111
  self.assertIn('"--no-deps", "--force-reinstall", str(wheel)', wheel_smoke)
112
+ self.assertIn("m.version('D4CMPP2')", wheel_smoke)
98
113
 
99
114
  def test_dependency_metadata_uses_approved_major_version_bounds(self):
100
115
  pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes