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.
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/PKG-INFO +5 -2
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/PKG-INFO +5 -2
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/README.md +4 -1
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/__init__.py +1 -2
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/pyproject.toml +1 -1
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/optimization.py +28 -7
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_optimize.py +33 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t6_ci_contract.py +15 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/SOURCES.txt +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/dependency_links.txt +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/entry_points.txt +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/requires.txt +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/D4CMPP2.egg-info/top_level.txt +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/LICENSE +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/MANIFEST.in +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/AGENTS.md +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/Aqsoldb.csv +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/BradleyMP.csv +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/Lipophilicity.csv +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/README.md +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/optical.csv +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_Data/test.csv +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/__main__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/_main.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/cli.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/AGENTS.md +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/ISA/segment.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/README.md +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/assets/tiny_numeric.csv +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/cli/README.md +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/custom_network.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/experiments/01_compare.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/experiments/02_optimize.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/experiments/03_legacy_grid_search.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/extensions/01_callbacks.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/extensions/02_custom_network_training.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/extensions/03_numeric_inputs.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/inference/01_prediction.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/inference/02_csv_prediction.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/inference/03_uncertainty_ensemble.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/inference/04_isa_interpretation.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/README.md +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/common.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/run_all.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/solvent_analyzer.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/integration/transfer_learning.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/01_basic_cpu.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/02_solvent.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/03_multitarget.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/04_splitting_reproducibility.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/05_isa.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/06_saved_model_modes.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/examples/training/07_model_families.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/exceptions.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/grid_search.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/network_refer.yaml +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/AFP_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/AFPwithSolv_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/DMPNN_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/DMPNNwithSolv_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GAT_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GATwithSolv_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GCN_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GCNwithSolv_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/GC_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/ISATPM_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/ISATPN_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/ISAT_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/MPNN_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/MPNNwithSolv_model.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/base.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/registry.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/AFP.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/BiDropout.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/DMPNN.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/GAT.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/GC.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/GCN.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/ISAT.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/Linear.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/MPNN.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/SolventLayer.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/distGCN.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/networks/src/pyg_hetero.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/optimize.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/setup.cfg +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/ISAAnalyzer.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/ISAPNAnalyzer.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/ISAwSAnalyzer.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/MolAnalyzer.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/core.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/factory.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/interpretation.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/Analyzer/results.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/Dataset/GraphDataset.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/Dataset/ISAGraphDataset.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/Dataset/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/GraphGenerator/ISAGraphGenerator.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/GraphGenerator/MolGraphGenerator.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/GraphGenerator/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/ISADataManager.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/MolDataManager.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/DataManager/contracts.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/NetworkManager/ISANetworkManager.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/NetworkManager/NetworkManager.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/NetworkManager/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/PostProcessor.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/TrainManager/ISATrainManager.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/TrainManager/TrainManager.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/TrainManager/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/TrainManager/callbacks.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/command.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/errors.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/legacy_grid_search.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/api/training.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/PATH.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/__init__.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/argparser.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/checkpointing.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/config_resolution.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/config_validation.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/csv_validation.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/data_quality.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/featureizer.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/functional_group.csv +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/graph_cache.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/leaderboard.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/metrics.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/module_loader.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/output.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/reproducibility.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/run_manifest.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/scaler.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/sculptor.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/splitting.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/supportfile_saver.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/tools.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/src/utils/transfer_learning.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_cli_packaging.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_config_validation.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_csv_data_manager_validation.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_csv_validation.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_custom_network.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_data_fixture.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_example_model_compatibility.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_examples_syntax.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_failure_behavior.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_failure_contracts.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_gcn_end_to_end.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_graph_alignment.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_heavy_smoke.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_network_abc.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_network_persistence.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_path_utils.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_public_contracts.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_data_contract.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_dmpnn_afp.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_gcn.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_isa_models.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_pyg_mpnn_gat.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_runtime_environment.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_scaler_alignment.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_solvent_analyzer_end_to_end.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_state_dict_contract.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_checkpoint_policy.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_data_quality.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_dataset_contract_matrix.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_graph_cache_integrity.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_grid_search.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_leaderboard.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_registry_smoke_matrix.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_reproducibility.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_run_manifest.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_scaffold_split.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t3_transfer_learning.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t4_analyzer_core.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_callbacks.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_config_resolution.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_errors_logging.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_import_discovery.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_manager_contracts.py +0 -0
- {d4cmpp2-1.0.0 → d4cmpp2-1.0.2}/tests/test_t5_verbose_output.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
@@ -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
|
-
|
|
346
|
-
optimization_path
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|