synkit 1.6.5__py3-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- synkit/CRN/Benchmark/__init__.py +53 -0
- synkit/CRN/Benchmark/crosschecks.py +13 -0
- synkit/CRN/Benchmark/kegg.py +12 -0
- synkit/CRN/Benchmark/networks.py +13 -0
- synkit/CRN/Benchmark/scaling.py +13 -0
- synkit/CRN/Benchmark/validate.py +13 -0
- synkit/CRN/Construct/__init__.py +16 -0
- synkit/CRN/Construct/abstract.py +668 -0
- synkit/CRN/Construct/arity.py +36 -0
- synkit/CRN/Construct/builder.py +619 -0
- synkit/CRN/Construct/derivation.py +63 -0
- synkit/CRN/Construct/flattener.py +100 -0
- synkit/CRN/Construct/keys.py +14 -0
- synkit/CRN/Construct/mixtures.py +117 -0
- synkit/CRN/Construct/rdkit_worker.py +69 -0
- synkit/CRN/Construct/smiles.py +99 -0
- synkit/CRN/Construct/state.py +31 -0
- synkit/CRN/Construct/strategy.py +75 -0
- synkit/CRN/Construct/worker.py +42 -0
- synkit/CRN/IO/__init__.py +36 -0
- synkit/CRN/IO/sbml.py +925 -0
- synkit/CRN/Pathway/__init__.py +72 -0
- synkit/CRN/Pathway/_adapter.py +333 -0
- synkit/CRN/Pathway/pathfinder.py +500 -0
- synkit/CRN/Pathway/reachability.py +796 -0
- synkit/CRN/Pathway/realizability.py +1322 -0
- synkit/CRN/Petrinet/__init__.py +93 -0
- synkit/CRN/Petrinet/analyzer.py +486 -0
- synkit/CRN/Petrinet/minimal_semiflows.py +436 -0
- synkit/CRN/Petrinet/net.py +1041 -0
- synkit/CRN/Petrinet/persistence.py +97 -0
- synkit/CRN/Petrinet/semiflows.py +483 -0
- synkit/CRN/Petrinet/siphon_search.py +402 -0
- synkit/CRN/Petrinet/structure.py +286 -0
- synkit/CRN/Props/__init__.py +130 -0
- synkit/CRN/Props/_rank.py +29 -0
- synkit/CRN/Props/deficiency.py +953 -0
- synkit/CRN/Props/dynamics.py +832 -0
- synkit/CRN/Props/helper.py +151 -0
- synkit/CRN/Props/stoich.py +751 -0
- synkit/CRN/Props/thermo.py +584 -0
- synkit/CRN/Query/__init__.py +66 -0
- synkit/CRN/Query/cache.py +41 -0
- synkit/CRN/Query/kegg_api.py +99 -0
- synkit/CRN/Query/kegg_extract.py +714 -0
- synkit/CRN/Query/kegg_impute.py +707 -0
- synkit/CRN/Query/kegg_parse.py +480 -0
- synkit/CRN/Query/to_syncrn.py +290 -0
- synkit/CRN/README.md +234 -0
- synkit/CRN/Structure/__init__.py +12 -0
- synkit/CRN/Structure/_graph_io.py +713 -0
- synkit/CRN/Structure/_matrices.py +88 -0
- synkit/CRN/Structure/_parse.py +544 -0
- synkit/CRN/Structure/reaction.py +237 -0
- synkit/CRN/Structure/rule.py +55 -0
- synkit/CRN/Structure/species.py +46 -0
- synkit/CRN/Structure/syncrn.py +929 -0
- synkit/CRN/Symmetry/__init__.py +20 -0
- synkit/CRN/Symmetry/_common.py +1059 -0
- synkit/CRN/Symmetry/_ir.py +940 -0
- synkit/CRN/Symmetry/automorphism.py +472 -0
- synkit/CRN/Symmetry/canon.py +441 -0
- synkit/CRN/Symmetry/isomorphism.py +412 -0
- synkit/CRN/Symmetry/symmetry.py +61 -0
- synkit/CRN/Symmetry/wl_canon.py +967 -0
- synkit/CRN/Visualize/__init__.py +11 -0
- synkit/CRN/Visualize/labels.py +113 -0
- synkit/CRN/Visualize/layout.py +708 -0
- synkit/CRN/Visualize/palette.py +292 -0
- synkit/CRN/Visualize/validation.py +122 -0
- synkit/CRN/Visualize/vis.py +1152 -0
- synkit/CRN/__init__.py +233 -0
- synkit/CRN/_build.py +50 -0
- synkit/CRN/_native_build.py +175 -0
- synkit/CRN/analysis.py +629 -0
- synkit/CRN/backend.py +74 -0
- synkit/CRN/cpp/CMakeLists.txt +58 -0
- synkit/CRN/cpp/algebra.cpp +46 -0
- synkit/CRN/cpp/closure.cpp +29 -0
- synkit/CRN/cpp/exact.h +55 -0
- synkit/CRN/cpp/pathway.cpp +46 -0
- synkit/CRN/cpp/semiflows.cpp +209 -0
- synkit/CRN/cpp/structural.cpp +240 -0
- synkit/CRN/cpp/symmetry.cpp +45 -0
- synkit/CRN/cpp/write_manifest.cmake +28 -0
- synkit/CRN/kinds.py +137 -0
- synkit/CRN/lib/synkit_crn.dll +0 -0
- synkit/CRN/lib/synkit_crn.json +33 -0
- synkit/CRN/native.py +388 -0
- synkit/CRN/native_analysis.py +459 -0
- synkit/Chem/Cluster/__init__.py +0 -0
- synkit/Chem/Cluster/butina.py +140 -0
- synkit/Chem/Fingerprint/__init__.py +0 -0
- synkit/Chem/Fingerprint/fp_calculator.py +155 -0
- synkit/Chem/Fingerprint/smiles_featurizer.py +258 -0
- synkit/Chem/Fingerprint/transformation_fp.py +139 -0
- synkit/Chem/Mapper/README.rst +43 -0
- synkit/Chem/Mapper/__init__.py +255 -0
- synkit/Chem/Mapper/_compat.py +130 -0
- synkit/Chem/Mapper/adapters/__init__.py +1 -0
- synkit/Chem/Mapper/adapters/prediction.py +126 -0
- synkit/Chem/Mapper/adapters/template.py +412 -0
- synkit/Chem/Mapper/chem/__init__.py +52 -0
- synkit/Chem/Mapper/chem/aam.py +673 -0
- synkit/Chem/Mapper/chem/blind.py +160 -0
- synkit/Chem/Mapper/chem/its.py +309 -0
- synkit/Chem/Mapper/chem/smiles.py +564 -0
- synkit/Chem/Mapper/graph/__init__.py +66 -0
- synkit/Chem/Mapper/graph/automorphism.py +395 -0
- synkit/Chem/Mapper/graph/blockcut.py +98 -0
- synkit/Chem/Mapper/graph/labeled_graph.py +104 -0
- synkit/Chem/Mapper/graph/refine.py +176 -0
- synkit/Chem/Mapper/graph/synkit_adapter.py +110 -0
- synkit/Chem/Mapper/io/__init__.py +13 -0
- synkit/Chem/Mapper/io/idxmapstr.py +82 -0
- synkit/Chem/Mapper/mapper.py +685 -0
- synkit/Chem/Mapper/reaction_search.py +554 -0
- synkit/Chem/Mapper/reporting/__init__.py +1 -0
- synkit/Chem/Mapper/reporting/alternatives.py +451 -0
- synkit/Chem/Mapper/reporting/analysis.py +681 -0
- synkit/Chem/Mapper/reporting/native_analysis.py +485 -0
- synkit/Chem/Mapper/reporting/spectrum.py +642 -0
- synkit/Chem/Mapper/solvers/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/__init__.py +141 -0
- synkit/Chem/Mapper/solvers/exact/assignment/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_certificate.py +113 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_domains.py +162 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_verification.py +58 -0
- synkit/Chem/Mapper/solvers/exact/assignment/incremental_assignment.py +247 -0
- synkit/Chem/Mapper/solvers/exact/certificate.py +128 -0
- synkit/Chem/Mapper/solvers/exact/core.py +183 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/bounds.py +319 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/exhaustive.py +179 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/inputs.py +283 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/records.py +242 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/search.py +1025 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/verify.py +378 -0
- synkit/Chem/Mapper/solvers/exact/edit_support.py +375 -0
- synkit/Chem/Mapper/solvers/exact/hybrid.py +224 -0
- synkit/Chem/Mapper/solvers/exact/hydrogen.py +264 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/branching.py +499 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/enumerate.py +1050 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/enumeration_result.py +30 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/kernel.py +256 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/milp.py +194 -0
- synkit/Chem/Mapper/solvers/exact/native/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/native/build.py +154 -0
- synkit/Chem/Mapper/solvers/exact/native/candidates.py +593 -0
- synkit/Chem/Mapper/solvers/exact/native/canonical.py +396 -0
- synkit/Chem/Mapper/solvers/exact/native/disk_frontier.py +415 -0
- synkit/Chem/Mapper/solvers/exact/native/frontier.py +390 -0
- synkit/Chem/Mapper/solvers/exact/native/hydrogen_quotient.py +213 -0
- synkit/Chem/Mapper/solvers/exact/native/its.py +528 -0
- synkit/Chem/Mapper/solvers/exact/native/native_distance.cpp +2803 -0
- synkit/Chem/Mapper/solvers/exact/native/orbit_aggregation.py +328 -0
- synkit/Chem/Mapper/solvers/exact/native/parallel.py +205 -0
- synkit/Chem/Mapper/solvers/exact/native/pmcd.py +203 -0
- synkit/Chem/Mapper/solvers/exact/native/runtime.py +40 -0
- synkit/Chem/Mapper/solvers/exact/native/search.py +294 -0
- synkit/Chem/Mapper/solvers/exact/native/separator.py +224 -0
- synkit/Chem/Mapper/solvers/exact/native_build.py +12 -0
- synkit/Chem/Mapper/solvers/exact/pabs/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/pabs/cost_lattice.py +43 -0
- synkit/Chem/Mapper/solvers/exact/pabs/factor_spectrum.py +110 -0
- synkit/Chem/Mapper/solvers/exact/pabs/multi_shell.py +368 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation.py +679 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_bounds.py +436 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_limits.py +13 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_search.py +856 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_symmetry.py +66 -0
- synkit/Chem/Mapper/solvers/exact/pabs/residual_typed_bonds.py +136 -0
- synkit/Chem/Mapper/solvers/exact/pabs/reward_frontier.py +201 -0
- synkit/Chem/Mapper/solvers/exact/pabs/separator_bound.py +258 -0
- synkit/Chem/Mapper/solvers/exact/pabs/separator_spectrum.py +308 -0
- synkit/Chem/Mapper/solvers/exact/pabs/sparse_reward_bound.py +207 -0
- synkit/Chem/Mapper/solvers/exact/pabs/suffix_spectrum.py +299 -0
- synkit/Chem/Mapper/solvers/exact/search.py +55 -0
- synkit/Chem/Mapper/solvers/exact/seeds/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed.py +104 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed_fragments.py +148 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed_relaxation.py +181 -0
- synkit/Chem/Mapper/solvers/exact/symmetry.py +223 -0
- synkit/Chem/Mapper/solvers/native/__init__.py +4 -0
- synkit/Chem/Mapper/solvers/native/assignment.py +99 -0
- synkit/Chem/Mapper/solvers/native/astar.py +22 -0
- synkit/Chem/Mapper/solvers/native/build.py +385 -0
- synkit/Chem/Mapper/solvers/native/classification.py +641 -0
- synkit/Chem/Mapper/solvers/native/core.py +378 -0
- synkit/Chem/Mapper/solvers/native/cpp/CMakeLists.txt +120 -0
- synkit/Chem/Mapper/solvers/native/cpp/examples/map_reaction.cpp +29 -0
- synkit/Chem/Mapper/solvers/native/cpp/examples/slap_graph.cpp +63 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/assignment/assignment.h +18 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/astar/astar.h +18 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/astar/bound.h +33 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/core/pmcd_witness.h +16 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/core/runtime.h +130 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/hydrogen/hydrogen.h +73 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/mapper.h +175 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/mces/mces.h +9 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/pabs/seed.h +34 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/reaction/reaction.h +30 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/sepdp/sepdp.h +21 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/slap.h +72 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/solvers/solvers.h +16 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/symmetry/classification.h +140 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/symmetry/cpabs.h +33 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/assignment/abb.cpp +302 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/CMakeLists.txt +12 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/README.md +47 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/astar.cpp +228 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/astar_graph.cpp +37 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/bound.cpp +212 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/core/dispatch.cpp +272 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/core/pmcd_witness.cpp +36 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/hydrogen/hydrogen.cpp +380 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/mces/README.md +57 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/mces/mces.cpp +287 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/bridge.cpp +334 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/chemical_floor.inc +181 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/endpoint_symmetry.inc +104 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/exact_helpers.h +20 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_assignment_certificate.h +165 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_certificate.h +125 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_model.h +365 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_provider.inc +319 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_rounding.inc +170 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_test_hooks.h +342 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/objective_reduction.inc +137 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/overlap_dual.inc +351 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/profile_seed.inc +214 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/seed_heuristics.inc +640 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/sparse_embedding.cpp +430 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/sparse_root_lp.h +176 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/test_hooks.inc +262 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/reaction/reaction.cpp +611 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/sepdp/README.md +61 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/sepdp/sepdp.cpp +253 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/slap.cpp +810 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/formulation.h +138 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/maxsat.cpp +526 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/ortools.cpp +475 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/seed.h +80 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/weighted_cnf.h +256 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/README.md +43 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/dfs.cpp +123 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/edit_support.cpp +224 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification.cpp +553 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification_pipeline.cpp +124 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification_stream.h +13 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/cpabs.cpp +455 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/edge_deck.cpp +743 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/COPYRIGHT +44 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/LICENSE-2.0.txt +202 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naugraph.c +732 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naurng.c +94 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naurng.h +49 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nausparse.c +1771 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nausparse.h +133 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nautil.c +750 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naututil.h +355 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nauty.c +1256 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nauty.h +1544 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/schreier.c +1131 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/schreier.h +70 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/sorttemplates.c +580 -0
- synkit/Chem/Mapper/solvers/native/hydrogen.py +711 -0
- synkit/Chem/Mapper/solvers/native/implicit.py +506 -0
- synkit/Chem/Mapper/solvers/native/implicit_certificate.py +187 -0
- synkit/Chem/Mapper/solvers/native/implicit_preparation.py +309 -0
- synkit/Chem/Mapper/solvers/native/lib/synkit_mapper.dll +0 -0
- synkit/Chem/Mapper/solvers/native/mces.py +16 -0
- synkit/Chem/Mapper/solvers/native/reaction.py +179 -0
- synkit/Chem/Mapper/solvers/native/reaction_build.py +277 -0
- synkit/Chem/Mapper/solvers/native/reaction_text.py +26 -0
- synkit/Chem/Mapper/solvers/native/runtime.py +242 -0
- synkit/Chem/Mapper/solvers/native/sepdp.py +47 -0
- synkit/Chem/Mapper/solvers/native/slap.py +266 -0
- synkit/Chem/Mapper/solvers/native/solvers.py +67 -0
- synkit/Chem/Mapper/solvers/native/stereo.py +86 -0
- synkit/Chem/Mapper/solvers/native/supporting.py +34 -0
- synkit/Chem/Mapper/solvers/native/symmetry.py +91 -0
- synkit/Chem/Mapper/solvers/slap/__init__.py +29 -0
- synkit/Chem/Mapper/solvers/slap/lap.py +174 -0
- synkit/Chem/Mapper/solvers/slap/sequential.py +696 -0
- synkit/Chem/Mapper/validation/__init__.py +1 -0
- synkit/Chem/Mapper/validation/aam_validator.py +442 -0
- synkit/Chem/Mapper/validation/annotations.py +274 -0
- synkit/Chem/Mapper/validation/bonds.py +124 -0
- synkit/Chem/Mapper/validation/cohorts.py +72 -0
- synkit/Chem/Mapper/validation/identifiability.py +150 -0
- synkit/Chem/Mapper/validation/numerical_scope.py +36 -0
- synkit/Chem/Mapper/validation/orbits.py +137 -0
- synkit/Chem/Molecule/__init__.py +0 -0
- synkit/Chem/Molecule/_chirality_loci.py +165 -0
- synkit/Chem/Molecule/_chirality_types.py +231 -0
- synkit/Chem/Molecule/_helical_loci.py +167 -0
- synkit/Chem/Molecule/_stereo_axis_evidence.py +202 -0
- synkit/Chem/Molecule/_stereo_element_detection.py +193 -0
- synkit/Chem/Molecule/_stereo_orientation_constraints.py +511 -0
- synkit/Chem/Molecule/_tetrahedral_carriers.py +63 -0
- synkit/Chem/Molecule/atom_features.py +379 -0
- synkit/Chem/Molecule/chirality.py +1041 -0
- synkit/Chem/Molecule/cip_assignment.py +569 -0
- synkit/Chem/Molecule/cip_ranking.py +843 -0
- synkit/Chem/Molecule/coordinate_stereo.py +503 -0
- synkit/Chem/Molecule/derived_stereo_naming.py +165 -0
- synkit/Chem/Molecule/descriptors.py +452 -0
- synkit/Chem/Molecule/formula.py +249 -0
- synkit/Chem/Molecule/global_stereo.py +175 -0
- synkit/Chem/Molecule/graph_annotator.py +300 -0
- synkit/Chem/Molecule/standardize.py +817 -0
- synkit/Chem/Molecule/stereo_evidence.py +179 -0
- synkit/Chem/Molecule/stereo_perception.py +1032 -0
- synkit/Chem/Molecule/valence.py +123 -0
- synkit/Chem/Reaction/Mapper/__init__.py +44 -0
- synkit/Chem/Reaction/__init__.py +20 -0
- synkit/Chem/Reaction/aam_validator.py +5 -0
- synkit/Chem/Reaction/balance_check.py +138 -0
- synkit/Chem/Reaction/canon_rsmi.py +249 -0
- synkit/Chem/Reaction/cleaning.py +58 -0
- synkit/Chem/Reaction/deionize.py +199 -0
- synkit/Chem/Reaction/explicit_h_audit.py +232 -0
- synkit/Chem/Reaction/fix_aam.py +64 -0
- synkit/Chem/Reaction/neutralize.py +207 -0
- synkit/Chem/Reaction/radical_wildcard.py +224 -0
- synkit/Chem/Reaction/standardize.py +203 -0
- synkit/Chem/Reaction/tautomerize.py +205 -0
- synkit/Chem/__init__.py +1 -0
- synkit/Chem/utils.py +315 -0
- synkit/Data/__init__.py +0 -0
- synkit/Data/aldol.json.gz +1 -0
- synkit/Data/gen_partial_aam.py +147 -0
- synkit/Data/paracetamol.json.gz +1 -0
- synkit/Graph/Canon/__init__.py +16 -0
- synkit/Graph/Canon/_native/__init__.py +13 -0
- synkit/Graph/Canon/_native/build.py +93 -0
- synkit/Graph/Canon/_native/lib/synkit_canon.dll +0 -0
- synkit/Graph/Canon/_native/prepare.py +49 -0
- synkit/Graph/Canon/_native/runtime.py +140 -0
- synkit/Graph/Canon/_native/search.py +137 -0
- synkit/Graph/Canon/canon_algs.py +228 -0
- synkit/Graph/Canon/canon_graph.py +531 -0
- synkit/Graph/Canon/cpp/CMakeLists.txt +42 -0
- synkit/Graph/Canon/cpp/README.md +123 -0
- synkit/Graph/Canon/cpp/examples/canonical_graph.cpp +16 -0
- synkit/Graph/Canon/cpp/include/synkit_canon/canon.h +85 -0
- synkit/Graph/Canon/cpp/src/canonical.cpp +391 -0
- synkit/Graph/Canon/cpp/src/symmetry.h +83 -0
- synkit/Graph/Canon/cpp/tests/symmetry.cpp +93 -0
- synkit/Graph/Canon/exact.py +1020 -0
- synkit/Graph/Canon/exact_refinement.py +368 -0
- synkit/Graph/Canon/nauty.py +143 -0
- synkit/Graph/Context/__init__.py +0 -0
- synkit/Graph/Context/hier_context.py +244 -0
- synkit/Graph/Context/radius_expand.py +252 -0
- synkit/Graph/FG/__init__.py +19 -0
- synkit/Graph/FG/api.py +39 -0
- synkit/Graph/FG/audit.py +155 -0
- synkit/Graph/FG/catalog.py +919 -0
- synkit/Graph/FG/detector.py +288 -0
- synkit/Graph/FG/model.py +97 -0
- synkit/Graph/FG/recognizers.py +274 -0
- synkit/Graph/FG/ring_system.py +154 -0
- synkit/Graph/Feature/Descriptors/topology.py +857 -0
- synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
- synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +222 -0
- synkit/Graph/Feature/__init__.py +5 -0
- synkit/Graph/Feature/graph_descriptors.py +323 -0
- synkit/Graph/Feature/graph_fps.py +96 -0
- synkit/Graph/Feature/graph_signature.py +239 -0
- synkit/Graph/Feature/hash_fps.py +133 -0
- synkit/Graph/Feature/morgan_fps.py +88 -0
- synkit/Graph/Feature/path_fps.py +81 -0
- synkit/Graph/Feature/wl_hash.py +134 -0
- synkit/Graph/Fusion/__init__.py +85 -0
- synkit/Graph/Fusion/candidate.py +559 -0
- synkit/Graph/Fusion/constructor.py +877 -0
- synkit/Graph/Fusion/identity.py +184 -0
- synkit/Graph/Fusion/interface.py +700 -0
- synkit/Graph/Fusion/search.py +241 -0
- synkit/Graph/Hyrogen/__init__.py +6 -0
- synkit/Graph/Hyrogen/_misc.py +591 -0
- synkit/Graph/Hyrogen/hcomplete.py +995 -0
- synkit/Graph/Hyrogen/hcomplete_legacy.py +368 -0
- synkit/Graph/Hyrogen/hcompletion_algorithms.py +713 -0
- synkit/Graph/Hyrogen/hextend.py +570 -0
- synkit/Graph/Hyrogen/hextend_legacy.py +215 -0
- synkit/Graph/ITS/__init__.py +4 -0
- synkit/Graph/ITS/its_builder.py +120 -0
- synkit/Graph/ITS/its_construction.py +719 -0
- synkit/Graph/ITS/its_decompose.py +572 -0
- synkit/Graph/ITS/its_destruction.py +331 -0
- synkit/Graph/ITS/its_expand.py +1251 -0
- synkit/Graph/ITS/its_relabel.py +187 -0
- synkit/Graph/ITS/its_reverter.py +356 -0
- synkit/Graph/ITS/normalize_aam.py +145 -0
- synkit/Graph/ITS/partial_its.py +238 -0
- synkit/Graph/ITS/rc_extractor.py +656 -0
- synkit/Graph/ITS/stereo.py +74 -0
- synkit/Graph/MTG/__init__.py +107 -0
- synkit/Graph/MTG/gluing.py +451 -0
- synkit/Graph/MTG/history.py +928 -0
- synkit/Graph/MTG/inventory.py +118 -0
- synkit/Graph/MTG/local.py +447 -0
- synkit/Graph/MTG/mcs_matcher.py +246 -0
- synkit/Graph/MTG/mtg.py +611 -0
- synkit/Graph/MTG/mtg_explore.py +74 -0
- synkit/Graph/MTG/observation.py +209 -0
- synkit/Graph/MTG/process.py +577 -0
- synkit/Graph/MTG/queries.py +66 -0
- synkit/Graph/MTG/realization.py +95 -0
- synkit/Graph/MTG/series_parallel.py +107 -0
- synkit/Graph/MTG/utils.py +424 -0
- synkit/Graph/Matcher/__init__.py +10 -0
- synkit/Graph/Matcher/approx_mcs.py +1264 -0
- synkit/Graph/Matcher/auto_est.py +736 -0
- synkit/Graph/Matcher/automorphism.py +314 -0
- synkit/Graph/Matcher/batch_cluster.py +224 -0
- synkit/Graph/Matcher/dedup_matches.py +247 -0
- synkit/Graph/Matcher/graph_cluster.py +191 -0
- synkit/Graph/Matcher/graph_matcher.py +312 -0
- synkit/Graph/Matcher/graph_morphism.py +421 -0
- synkit/Graph/Matcher/mcs_matcher.py +804 -0
- synkit/Graph/Matcher/multi_turbo_iso.py +186 -0
- synkit/Graph/Matcher/orbit.py +284 -0
- synkit/Graph/Matcher/partial_matcher.py +694 -0
- synkit/Graph/Matcher/sing.py +544 -0
- synkit/Graph/Matcher/subgraph_matcher.py +812 -0
- synkit/Graph/Matcher/turbo_iso.py +272 -0
- synkit/Graph/Matcher/wl_sel.py +537 -0
- synkit/Graph/Mech/__init__.py +26 -0
- synkit/Graph/Mech/conversion.py +1466 -0
- synkit/Graph/Mech/conversion_debug.py +237 -0
- synkit/Graph/Mech/electron_accounting.py +200 -0
- synkit/Graph/Mech/lwg_editor.py +406 -0
- synkit/Graph/Mech/lwg_ops.py +313 -0
- synkit/Graph/Morphism/__init__.py +99 -0
- synkit/Graph/Morphism/constraints.py +460 -0
- synkit/Graph/Morphism/llg.py +999 -0
- synkit/Graph/Morphism/morphism.py +349 -0
- synkit/Graph/Morphism/stereo.py +258 -0
- synkit/Graph/Morphism/stereo_morphism.py +383 -0
- synkit/Graph/Morphism/stereo_morphism_helpers.py +957 -0
- synkit/Graph/Morphism/stereo_morphism_types.py +117 -0
- synkit/Graph/Stereo/__init__.py +376 -0
- synkit/Graph/Stereo/_descriptor_core.py +207 -0
- synkit/Graph/Stereo/_descriptor_serialization.py +138 -0
- synkit/Graph/Stereo/canonical.py +648 -0
- synkit/Graph/Stereo/changes.py +964 -0
- synkit/Graph/Stereo/composition.py +391 -0
- synkit/Graph/Stereo/configured.py +946 -0
- synkit/Graph/Stereo/couplings.py +245 -0
- synkit/Graph/Stereo/descriptors.py +1030 -0
- synkit/Graph/Stereo/enumeration.py +597 -0
- synkit/Graph/Stereo/extended_descriptors.py +406 -0
- synkit/Graph/Stereo/global_configured.py +152 -0
- synkit/Graph/Stereo/global_stereo.py +304 -0
- synkit/Graph/Stereo/identity.py +648 -0
- synkit/Graph/Stereo/interchange.py +496 -0
- synkit/Graph/Stereo/legacy.py +460 -0
- synkit/Graph/Stereo/matching.py +899 -0
- synkit/Graph/Stereo/native.py +154 -0
- synkit/Graph/Stereo/orbits.py +668 -0
- synkit/Graph/Stereo/outcomes.py +99 -0
- synkit/Graph/Stereo/pairwise.py +350 -0
- synkit/Graph/Stereo/rdkit_adapter.py +662 -0
- synkit/Graph/Stereo/rdkit_identity.py +118 -0
- synkit/Graph/Stereo/rdkit_resonance.py +140 -0
- synkit/Graph/Stereo/reaction_interchange.py +266 -0
- synkit/Graph/Stereo/semantics.py +296 -0
- synkit/Graph/Stereo/supports.py +257 -0
- synkit/Graph/Stereo/wire.py +339 -0
- synkit/Graph/Wildcard/__init__.py +0 -0
- synkit/Graph/Wildcard/fuse_graph.py +156 -0
- synkit/Graph/Wildcard/graph_wc.py +303 -0
- synkit/Graph/Wildcard/its_merge.py +857 -0
- synkit/Graph/Wildcard/radwc.py +114 -0
- synkit/Graph/Wildcard/wc_matcher.py +576 -0
- synkit/Graph/Wildcard/wildcard.py +225 -0
- synkit/Graph/__init__.py +17 -0
- synkit/Graph/canon_graph.py +14 -0
- synkit/Graph/syn_graph.py +199 -0
- synkit/Graph/utils.py +324 -0
- synkit/IO/__init__.py +4 -0
- synkit/IO/chem_converter.py +1059 -0
- synkit/IO/combinatorial/__init__.py +8 -0
- synkit/IO/combinatorial/gml_to_graph.py +223 -0
- synkit/IO/combinatorial/graph_to_gml.py +280 -0
- synkit/IO/combinatorial/graph_to_smarts.py +186 -0
- synkit/IO/combinatorial/smarts_expander.py +147 -0
- synkit/IO/combinatorial/smarts_generalizer.py +133 -0
- synkit/IO/combinatorial/smarts_to_graph.py +179 -0
- synkit/IO/conversion.py +42 -0
- synkit/IO/data_io.py +269 -0
- synkit/IO/data_process.py +143 -0
- synkit/IO/debug.py +73 -0
- synkit/IO/gml_to_nx.py +150 -0
- synkit/IO/graph_to_mol.py +199 -0
- synkit/IO/mol_to_graph.py +1105 -0
- synkit/IO/mol_to_graph_chemistry.py +545 -0
- synkit/IO/nx_to_gml.py +209 -0
- synkit/IO/smiles_to_id.py +123 -0
- synkit/Mechanism/__init__.py +151 -0
- synkit/Mechanism/adapters.py +136 -0
- synkit/Mechanism/audit.py +323 -0
- synkit/Mechanism/benchmark.py +638 -0
- synkit/Mechanism/compatibility.py +13 -0
- synkit/Mechanism/drawing.py +85 -0
- synkit/Mechanism/electron_models.py +725 -0
- synkit/Mechanism/equivalence.py +521 -0
- synkit/Mechanism/evidence.py +262 -0
- synkit/Mechanism/interchange.py +141 -0
- synkit/Mechanism/model.py +918 -0
- synkit/Mechanism/neighbor_stereo.py +312 -0
- synkit/Mechanism/radical_data.py +740 -0
- synkit/Mechanism/replay.py +986 -0
- synkit/Mechanism/schema.py +264 -0
- synkit/Mechanism/stereo_state.py +416 -0
- synkit/Mechanism/symbols.py +91 -0
- synkit/Rule/Apply/__init__.py +35 -0
- synkit/Rule/Apply/conditions.py +45 -0
- synkit/Rule/Apply/dpo.py +998 -0
- synkit/Rule/Apply/rule_matcher.py +218 -0
- synkit/Rule/Apply/validation.py +354 -0
- synkit/Rule/Compose/__init__.py +106 -0
- synkit/Rule/Compose/_identity.py +43 -0
- synkit/Rule/Compose/composition.py +976 -0
- synkit/Rule/Compose/laws.py +439 -0
- synkit/Rule/Compose/search.py +771 -0
- synkit/Rule/Compose/synrule.py +170 -0
- synkit/Rule/Modify/__init__.py +0 -0
- synkit/Rule/Modify/implict_rule.py +56 -0
- synkit/Rule/Modify/longest_path.py +92 -0
- synkit/Rule/Modify/molecule_rule.py +115 -0
- synkit/Rule/Modify/prune_templates.py +78 -0
- synkit/Rule/Modify/rule_utils.py +194 -0
- synkit/Rule/Modify/strip_rule.py +97 -0
- synkit/Rule/__init__.py +28 -0
- synkit/Rule/generic_stereo.py +884 -0
- synkit/Rule/stereo_identity.py +271 -0
- synkit/Rule/syn_rule.py +1090 -0
- synkit/Synthesis/MSR/__init__.py +0 -0
- synkit/Synthesis/MSR/path_finder.py +239 -0
- synkit/Synthesis/Metrics/__init__.py +0 -0
- synkit/Synthesis/Metrics/_base.py +52 -0
- synkit/Synthesis/Metrics/_plot.py +129 -0
- synkit/Synthesis/Metrics/_ranking.py +179 -0
- synkit/Synthesis/RBL/__init__.py +80 -0
- synkit/Synthesis/RBL/engine.py +1249 -0
- synkit/Synthesis/RBL/matching.py +652 -0
- synkit/Synthesis/RBL/overlap.py +336 -0
- synkit/Synthesis/RBL/pipeline.py +376 -0
- synkit/Synthesis/RBL/policy.py +139 -0
- synkit/Synthesis/RBL/proof.py +370 -0
- synkit/Synthesis/RBL/reaction.py +506 -0
- synkit/Synthesis/RBL/state.py +169 -0
- synkit/Synthesis/RBL/validation.py +1060 -0
- synkit/Synthesis/Reactor/__init__.py +60 -0
- synkit/Synthesis/Reactor/core/__init__.py +1 -0
- synkit/Synthesis/Reactor/core/engine.py +967 -0
- synkit/Synthesis/Reactor/core/product.py +621 -0
- synkit/Synthesis/Reactor/core/rewrite.py +561 -0
- synkit/Synthesis/Reactor/core/strategy.py +44 -0
- synkit/Synthesis/Reactor/matching/__init__.py +1 -0
- synkit/Synthesis/Reactor/matching/mixin.py +920 -0
- synkit/Synthesis/Reactor/matching/policy.py +345 -0
- synkit/Synthesis/Reactor/matching/symmetry.py +309 -0
- synkit/Synthesis/Reactor/output/__init__.py +1 -0
- synkit/Synthesis/Reactor/output/deduplication.py +703 -0
- synkit/Synthesis/Reactor/output/policy.py +16 -0
- synkit/Synthesis/Reactor/output/serialization.py +485 -0
- synkit/Synthesis/Reactor/output/structural.py +893 -0
- synkit/Synthesis/Reactor/stereo/__init__.py +1 -0
- synkit/Synthesis/Reactor/stereo/assignment.py +35 -0
- synkit/Synthesis/Reactor/stereo/mixin.py +780 -0
- synkit/Synthesis/Reactor/variants/__init__.py +1 -0
- synkit/Synthesis/Reactor/variants/imbalanced.py +180 -0
- synkit/Synthesis/Reactor/variants/partial.py +84 -0
- synkit/Synthesis/Reactor/workflow/__init__.py +1 -0
- synkit/Synthesis/Reactor/workflow/batch.py +550 -0
- synkit/Synthesis/Reactor/workflow/benchmark.py +143 -0
- synkit/Synthesis/Reactor/workflow/postprocess.py +267 -0
- synkit/Synthesis/Reactor/workflow/rule_filter.py +210 -0
- synkit/Synthesis/__init__.py +0 -0
- synkit/Synthesis/reactor_utils.py +316 -0
- synkit/Utils/__init__.py +0 -0
- synkit/Utils/utils.py +172 -0
- synkit/Vis/__init__.py +91 -0
- synkit/Vis/crn/__init__.py +40 -0
- synkit/Vis/epd/__init__.py +20 -0
- synkit/Vis/epd/arrows.py +425 -0
- synkit/Vis/epd/chem.py +197 -0
- synkit/Vis/epd/constants.py +83 -0
- synkit/Vis/epd/layout.py +283 -0
- synkit/Vis/epd/mapping.py +51 -0
- synkit/Vis/epd/models.py +136 -0
- synkit/Vis/epd/render.py +543 -0
- synkit/Vis/epd/utils.py +108 -0
- synkit/Vis/epd/visualizer.py +811 -0
- synkit/Vis/graph_visualizer.py +375 -0
- synkit/Vis/its/__init__.py +19 -0
- synkit/Vis/its/drawer.py +615 -0
- synkit/Vis/its_drawer.py +35 -0
- synkit/Vis/molecule/__init__.py +31 -0
- synkit/Vis/molecule/drawer.py +563 -0
- synkit/Vis/molecule/reaction.py +285 -0
- synkit/Vis/molecule_drawer.py +33 -0
- synkit/Vis/mtg/__init__.py +17 -0
- synkit/Vis/mtg/drawer.py +769 -0
- synkit/Vis/mtg_drawer.py +34 -0
- synkit/Vis/pdf_writer.py +146 -0
- synkit/Vis/reaction/__init__.py +19 -0
- synkit/Vis/reaction/rule.py +141 -0
- synkit/Vis/reaction/rxn.py +532 -0
- synkit/Vis/reaction_drawer.py +41 -0
- synkit/Vis/space/__init__.py +17 -0
- synkit/Vis/space/chemical.py +80 -0
- synkit/Vis/space/embedding.py +87 -0
- synkit/Vis/vis_synedu/Vis/__init__.py +7 -0
- synkit/Vis/vis_synedu/Vis/dpo.py +862 -0
- synkit/Vis/vis_synedu/rxn_vis.py +377 -0
- synkit/Vis/vis_synedu/vis.py +501 -0
- synkit/Vis/visual_drawer.py +215 -0
- synkit/Vis/visual_model.py +520 -0
- synkit/__init__.py +3 -0
- synkit/_native.py +91 -0
- synkit/examples.py +50 -0
- synkit/version.py +23 -0
- synkit-1.6.5.dist-info/METADATA +156 -0
- synkit-1.6.5.dist-info/RECORD +636 -0
- synkit-1.6.5.dist-info/WHEEL +4 -0
- synkit-1.6.5.dist-info/licenses/LICENSE +21 -0
- synkit-1.6.5.dist-info/licenses/synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/COPYRIGHT +44 -0
- synkit-1.6.5.dist-info/licenses/synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/LICENSE-2.0.txt +202 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Any, Dict, List
|
|
3
|
+
from joblib import Parallel, delayed
|
|
4
|
+
|
|
5
|
+
from synkit.IO.debug import configure_warnings_and_logs
|
|
6
|
+
from synkit.Chem.Fingerprint.transformation_fp import TransformationFP
|
|
7
|
+
|
|
8
|
+
configure_warnings_and_logs(True, True)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class FPCalculator:
|
|
12
|
+
"""Calculate fingerprint vectors for chemical reactions represented by
|
|
13
|
+
SMILES strings.
|
|
14
|
+
|
|
15
|
+
:cvar fps: Shared fingerprint engine instance.
|
|
16
|
+
:vartype fps: TransformationFP
|
|
17
|
+
:cvar VALID_FP_TYPES: Supported fingerprint type identifiers.
|
|
18
|
+
:vartype VALID_FP_TYPES: List[str]
|
|
19
|
+
:param n_jobs: Number of parallel jobs to use for batch processing.
|
|
20
|
+
:type n_jobs: int
|
|
21
|
+
:param verbose: Verbosity level for parallel execution.
|
|
22
|
+
:type verbose: int
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
fps: TransformationFP = TransformationFP()
|
|
26
|
+
VALID_FP_TYPES: List[str] = [
|
|
27
|
+
"drfp",
|
|
28
|
+
"avalon",
|
|
29
|
+
"maccs",
|
|
30
|
+
"torsion",
|
|
31
|
+
"pharm2D",
|
|
32
|
+
"ecfp2",
|
|
33
|
+
"ecfp4",
|
|
34
|
+
"ecfp6",
|
|
35
|
+
"fcfp2",
|
|
36
|
+
"fcfp4",
|
|
37
|
+
"fcfp6",
|
|
38
|
+
"rdk5",
|
|
39
|
+
"rdk6",
|
|
40
|
+
"rdk7",
|
|
41
|
+
"ap",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
def __init__(self, n_jobs: int = 1, verbose: int = 0) -> None:
|
|
45
|
+
"""Initialize the FPCalculator.
|
|
46
|
+
|
|
47
|
+
:param n_jobs: Number of parallel jobs to use for fingerprint
|
|
48
|
+
computation.
|
|
49
|
+
:type n_jobs: int
|
|
50
|
+
:param verbose: Verbosity level for the parallel processing.
|
|
51
|
+
:type verbose: int
|
|
52
|
+
"""
|
|
53
|
+
self.n_jobs = n_jobs
|
|
54
|
+
self.verbose = verbose
|
|
55
|
+
|
|
56
|
+
def _validate_fp_type(self, fp_type: str) -> None:
|
|
57
|
+
"""Ensure the requested fingerprint type is supported.
|
|
58
|
+
|
|
59
|
+
:param fp_type: Fingerprint type identifier to validate.
|
|
60
|
+
:type fp_type: str
|
|
61
|
+
:raises ValueError: If `fp_type` is not in VALID_FP_TYPES.
|
|
62
|
+
"""
|
|
63
|
+
if fp_type not in self.VALID_FP_TYPES:
|
|
64
|
+
valid = ", ".join(self.VALID_FP_TYPES)
|
|
65
|
+
raise ValueError(
|
|
66
|
+
f"Unsupported fingerprint type '{fp_type}'. Supported types: {valid}."
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
@staticmethod
|
|
70
|
+
def dict_process(
|
|
71
|
+
data_dict: Dict[str, Any],
|
|
72
|
+
rsmi_key: str,
|
|
73
|
+
symbol: str = ">>",
|
|
74
|
+
fp_type: str = "ecfp4",
|
|
75
|
+
absolute: bool = True,
|
|
76
|
+
) -> Dict[str, Any]:
|
|
77
|
+
"""Compute a fingerprint for a single reaction SMILES entry and add it
|
|
78
|
+
to the dict.
|
|
79
|
+
|
|
80
|
+
:param data_dict: Dictionary containing reaction data.
|
|
81
|
+
:type data_dict: dict
|
|
82
|
+
:param rsmi_key: Key in `data_dict` for the reaction SMILES string.
|
|
83
|
+
:type rsmi_key: str
|
|
84
|
+
:param symbol: Delimiter between reactant and product in the SMILES.
|
|
85
|
+
:type symbol: str
|
|
86
|
+
:param fp_type: Fingerprint type to compute.
|
|
87
|
+
:type fp_type: str
|
|
88
|
+
:param absolute: Whether to take absolute values of the fingerprint difference.
|
|
89
|
+
:type absolute: bool
|
|
90
|
+
:return: The input dictionary with a new key named by `fp_type`, holding the fingerprint vector.
|
|
91
|
+
:rtype: dict
|
|
92
|
+
:raises ValueError: If `rsmi_key` is missing in `data_dict`.
|
|
93
|
+
"""
|
|
94
|
+
if rsmi_key not in data_dict:
|
|
95
|
+
raise ValueError(f"Key '{rsmi_key}' not found in data dictionary.")
|
|
96
|
+
# compute and insert fingerprint
|
|
97
|
+
vec = FPCalculator.fps.fit(
|
|
98
|
+
data_dict[rsmi_key], symbols=symbol, fp_type=fp_type, abs=absolute
|
|
99
|
+
)
|
|
100
|
+
data_dict[f"{fp_type}"] = vec
|
|
101
|
+
return data_dict
|
|
102
|
+
|
|
103
|
+
def parallel_process(
|
|
104
|
+
self,
|
|
105
|
+
data_dicts: List[Dict[str, Any]],
|
|
106
|
+
rsmi_key: str,
|
|
107
|
+
symbol: str = ">>",
|
|
108
|
+
fp_type: str = "ecfp4",
|
|
109
|
+
absolute: bool = True,
|
|
110
|
+
) -> List[Dict[str, Any]]:
|
|
111
|
+
"""Compute fingerprints for a batch of reaction dictionaries in
|
|
112
|
+
parallel.
|
|
113
|
+
|
|
114
|
+
:param data_dicts: List of dictionaries, each containing a reaction SMILES.
|
|
115
|
+
:type data_dicts: list of dict
|
|
116
|
+
:param rsmi_key: Key in each dict for the reaction SMILES string.
|
|
117
|
+
:type rsmi_key: str
|
|
118
|
+
:param symbol: Delimiter between reactant and product in the SMILES.
|
|
119
|
+
:type symbol: str
|
|
120
|
+
:param fp_type: Fingerprint type to compute.
|
|
121
|
+
:type fp_type: str
|
|
122
|
+
:param absolute: Whether to take absolute values of the fingerprint difference.
|
|
123
|
+
:type absolute: bool
|
|
124
|
+
:return: A list of dictionaries augmented with `fp_{fp_type}` entries.
|
|
125
|
+
:rtype: list of dict
|
|
126
|
+
:raises ValueError: If `fp_type` is unsupported or any dict is missing `rsmi_key`.
|
|
127
|
+
"""
|
|
128
|
+
# Validate fingerprint type once
|
|
129
|
+
self._validate_fp_type(fp_type)
|
|
130
|
+
|
|
131
|
+
# Process in parallel
|
|
132
|
+
results = Parallel(n_jobs=self.n_jobs, verbose=self.verbose)(
|
|
133
|
+
delayed(self.dict_process)(dd, rsmi_key, symbol, fp_type, absolute)
|
|
134
|
+
for dd in data_dicts
|
|
135
|
+
)
|
|
136
|
+
return results
|
|
137
|
+
|
|
138
|
+
def __str__(self) -> str:
|
|
139
|
+
"""Short string summarizing the calculator configuration.
|
|
140
|
+
|
|
141
|
+
:return: A summary of n_jobs and verbosity.
|
|
142
|
+
:rtype: str
|
|
143
|
+
"""
|
|
144
|
+
return f"<FPCalculator n_jobs={self.n_jobs} verbose={self.verbose}>"
|
|
145
|
+
|
|
146
|
+
def help(self) -> None:
|
|
147
|
+
"""Print details about supported fingerprint types and usage.
|
|
148
|
+
|
|
149
|
+
:return: None
|
|
150
|
+
:rtype: NoneType
|
|
151
|
+
"""
|
|
152
|
+
print("FPCalculator supports the following fingerprint types:")
|
|
153
|
+
for t in self.VALID_FP_TYPES:
|
|
154
|
+
print(" -", t)
|
|
155
|
+
print(f"Configured for {self.n_jobs} parallel jobs, verbose={self.verbose}")
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"""smiles_featurizer.py
|
|
2
|
+
=======================
|
|
3
|
+
Utility for converting SMILES strings into various cheminformatics fingerprints,
|
|
4
|
+
with optional NumPy‐array conversion.
|
|
5
|
+
|
|
6
|
+
Key features
|
|
7
|
+
------------
|
|
8
|
+
* **Multi‐fingerprint support** – MACCS, Avalon, ECFP/FCFP, RDKit, AtomPair, Torsion, Pharm2D
|
|
9
|
+
* **SMILES validation** – raises on invalid input
|
|
10
|
+
* **Array conversion** – output as NumPy arrays for ML pipelines
|
|
11
|
+
* **Extensible** – add new methods or override via subclassing
|
|
12
|
+
|
|
13
|
+
Quick start
|
|
14
|
+
-----------
|
|
15
|
+
>>> from synkit.Chem.Fingerprint.smiles_featurizer import SmilesFeaturizer
|
|
16
|
+
>>> arr = SmilesFeaturizer.featurize_smiles("CCO", "ecfp4", convert_to_array=True)
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
import numpy as np
|
|
23
|
+
from rdkit import Chem, DataStructs
|
|
24
|
+
from rdkit.Chem import AllChem, MACCSkeys
|
|
25
|
+
from rdkit.Chem.AtomPairs import Pairs, Torsions
|
|
26
|
+
from rdkit.Avalon import pyAvalonTools as fpAvalon
|
|
27
|
+
from rdkit.Chem.Pharm2D import Gobbi_Pharm2D, Generate
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class SmilesFeaturizer:
|
|
31
|
+
"""Convert SMILES strings into chemical fingerprint vectors.
|
|
32
|
+
|
|
33
|
+
:cvar None: This class only provides static/class methods and holds no state.
|
|
34
|
+
|
|
35
|
+
Supported fingerprint methods:
|
|
36
|
+
- MACCS keys
|
|
37
|
+
- Avalon
|
|
38
|
+
- ECFP/FCFP (Morgan)
|
|
39
|
+
- RDKit topological
|
|
40
|
+
- AtomPair
|
|
41
|
+
- Torsion
|
|
42
|
+
- 2D Pharmacophore
|
|
43
|
+
|
|
44
|
+
Use `featurize_smiles` for one‑line access.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(self) -> None:
|
|
48
|
+
"""Initialize SmilesFeaturizer.
|
|
49
|
+
|
|
50
|
+
This class has no instance state; all methods are static or
|
|
51
|
+
class‑level.
|
|
52
|
+
"""
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def smiles_to_mol(smiles: str) -> Chem.Mol:
|
|
57
|
+
"""Convert a SMILES string to an RDKit Mol object.
|
|
58
|
+
|
|
59
|
+
:param smiles: The SMILES string to convert.
|
|
60
|
+
:type smiles: str
|
|
61
|
+
:return: RDKit Mol object corresponding to the SMILES.
|
|
62
|
+
:rtype: Chem.Mol
|
|
63
|
+
:raises ValueError: If the SMILES string is invalid.
|
|
64
|
+
"""
|
|
65
|
+
mol = Chem.MolFromSmiles(smiles)
|
|
66
|
+
if mol is None:
|
|
67
|
+
raise ValueError(f"Invalid SMILES string: {smiles!r}")
|
|
68
|
+
return mol
|
|
69
|
+
|
|
70
|
+
@staticmethod
|
|
71
|
+
def get_maccs_keys(mol: Chem.Mol) -> Any:
|
|
72
|
+
"""Generate the MACCS keys fingerprint for a molecule.
|
|
73
|
+
|
|
74
|
+
:param mol: RDKit Mol object.
|
|
75
|
+
:type mol: Chem.Mol
|
|
76
|
+
:return: MACCS keys fingerprint bit vector.
|
|
77
|
+
:rtype: ExplicitBitVect
|
|
78
|
+
"""
|
|
79
|
+
return MACCSkeys.GenMACCSKeys(mol)
|
|
80
|
+
|
|
81
|
+
@staticmethod
|
|
82
|
+
def get_avalon_fp(mol: Chem.Mol, nBits: int = 1024) -> Any:
|
|
83
|
+
"""Generate the Avalon fingerprint for a molecule.
|
|
84
|
+
|
|
85
|
+
:param mol: RDKit Mol object.
|
|
86
|
+
:type mol: Chem.Mol
|
|
87
|
+
:param nBits: Length of the fingerprint vector.
|
|
88
|
+
:type nBits: int
|
|
89
|
+
:return: Avalon fingerprint bit vector.
|
|
90
|
+
:rtype: ExplicitBitVect
|
|
91
|
+
"""
|
|
92
|
+
return fpAvalon.GetAvalonFP(mol, nBits)
|
|
93
|
+
|
|
94
|
+
@staticmethod
|
|
95
|
+
def get_ecfp(
|
|
96
|
+
mol: Chem.Mol, radius: int, nBits: int = 2048, useFeatures: bool = False
|
|
97
|
+
) -> Any:
|
|
98
|
+
"""Generate a Morgan fingerprint (ECFP or FCFP) for a molecule.
|
|
99
|
+
|
|
100
|
+
:param mol: RDKit Mol object.
|
|
101
|
+
:type mol: Chem.Mol
|
|
102
|
+
:param radius: Radius for the Morgan algorithm.
|
|
103
|
+
:type radius: int
|
|
104
|
+
:param nBits: Length of the fingerprint vector.
|
|
105
|
+
:type nBits: int
|
|
106
|
+
:param useFeatures: If True, generate a Feature‑Class
|
|
107
|
+
fingerprint (FCFP).
|
|
108
|
+
:type useFeatures: bool
|
|
109
|
+
:return: Morgan fingerprint bit vector.
|
|
110
|
+
:rtype: ExplicitBitVect
|
|
111
|
+
"""
|
|
112
|
+
return AllChem.GetMorganFingerprintAsBitVect(
|
|
113
|
+
mol, radius, nBits=nBits, useFeatures=useFeatures
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
@staticmethod
|
|
117
|
+
def get_rdk_fp(
|
|
118
|
+
mol: Chem.Mol, maxPath: int, fpSize: int = 2048, nBitsPerHash: int = 2
|
|
119
|
+
) -> Any:
|
|
120
|
+
"""Generate an RDKit topological fingerprint for a molecule.
|
|
121
|
+
|
|
122
|
+
:param mol: RDKit Mol object.
|
|
123
|
+
:type mol: Chem.Mol
|
|
124
|
+
:param maxPath: Maximum path length (bonds) to include.
|
|
125
|
+
:type maxPath: int
|
|
126
|
+
:param fpSize: Length of the fingerprint vector.
|
|
127
|
+
:type fpSize: int
|
|
128
|
+
:param nBitsPerHash: Bits per hash for path hashing.
|
|
129
|
+
:type nBitsPerHash: int
|
|
130
|
+
:return: RDKit topological fingerprint bit vector.
|
|
131
|
+
:rtype: ExplicitBitVect
|
|
132
|
+
"""
|
|
133
|
+
return Chem.RDKFingerprint(
|
|
134
|
+
mol, maxPath=maxPath, fpSize=fpSize, nBitsPerHash=nBitsPerHash
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
@staticmethod
|
|
138
|
+
def mol_to_ap(mol: Chem.Mol) -> Any:
|
|
139
|
+
"""Generate an Atom Pair fingerprint for a molecule.
|
|
140
|
+
|
|
141
|
+
:param mol: RDKit Mol object.
|
|
142
|
+
:type mol: Chem.Mol
|
|
143
|
+
:return: Atom Pair fingerprint as an integer vector.
|
|
144
|
+
:rtype: ExplicitBitVect
|
|
145
|
+
"""
|
|
146
|
+
return Pairs.GetAtomPairFingerprint(mol)
|
|
147
|
+
|
|
148
|
+
@staticmethod
|
|
149
|
+
def mol_to_torsion(mol: Chem.Mol) -> Any:
|
|
150
|
+
"""Generate a Topological Torsion fingerprint for a molecule.
|
|
151
|
+
|
|
152
|
+
:param mol: RDKit Mol object.
|
|
153
|
+
:type mol: Chem.Mol
|
|
154
|
+
:return: Torsion fingerprint as an integer vector.
|
|
155
|
+
:rtype: ExplicitBitVect
|
|
156
|
+
"""
|
|
157
|
+
return Torsions.GetTopologicalTorsionFingerprintAsIntVect(mol)
|
|
158
|
+
|
|
159
|
+
@staticmethod
|
|
160
|
+
def mol_to_pharm2d(mol: Chem.Mol) -> Any:
|
|
161
|
+
"""Generate a 2D Pharmacophore fingerprint for a molecule.
|
|
162
|
+
|
|
163
|
+
:param mol: RDKit Mol object.
|
|
164
|
+
:type mol: Chem.Mol
|
|
165
|
+
:return: 2D pharmacophore fingerprint bit vector.
|
|
166
|
+
:rtype: ExplicitBitVect
|
|
167
|
+
"""
|
|
168
|
+
return Generate.Gen2DFingerprint(mol, Gobbi_Pharm2D.factory)
|
|
169
|
+
|
|
170
|
+
@classmethod
|
|
171
|
+
def featurize_smiles(
|
|
172
|
+
cls,
|
|
173
|
+
smiles: str,
|
|
174
|
+
fingerprint_type: str,
|
|
175
|
+
convert_to_array: bool = True,
|
|
176
|
+
**kwargs: Any,
|
|
177
|
+
) -> Any:
|
|
178
|
+
"""Featurize a SMILES string into a chosen fingerprint, optionally
|
|
179
|
+
converting to a NumPy array.
|
|
180
|
+
|
|
181
|
+
:param smiles: The SMILES string to featurize.
|
|
182
|
+
:type smiles: str
|
|
183
|
+
:param fingerprint_type: One of 'maccs', 'avalon', 'ecfp#', 'fcfp#',
|
|
184
|
+
'rdk#', 'ap', 'torsion', 'pharm2d'.
|
|
185
|
+
:type fingerprint_type: str
|
|
186
|
+
:param convert_to_array: If True, convert the result to a NumPy array.
|
|
187
|
+
:type convert_to_array: bool
|
|
188
|
+
:param kwargs: Additional parameters passed to the chosen method:
|
|
189
|
+
- `nBits` for Avalon/ECFP/FCFP
|
|
190
|
+
- `radius` for ECFP/FCFP
|
|
191
|
+
- `maxPath`, `fpSize`, `nBitsPerHash` for RDKit FP
|
|
192
|
+
:type kwargs: dict
|
|
193
|
+
:return: Fingerprint as a NumPy array (if `convert_to_array`) or RDKit bit vector.
|
|
194
|
+
:rtype: np.ndarray or ExplicitBitVect
|
|
195
|
+
:raises ValueError: If `fingerprint_type` is unsupported.
|
|
196
|
+
"""
|
|
197
|
+
mol = cls.smiles_to_mol(smiles)
|
|
198
|
+
|
|
199
|
+
ft = fingerprint_type.lower()
|
|
200
|
+
if ft == "maccs":
|
|
201
|
+
fp = cls.get_maccs_keys(mol)
|
|
202
|
+
elif ft == "avalon":
|
|
203
|
+
fp = cls.get_avalon_fp(mol, nBits=kwargs.get("nBits", 1024))
|
|
204
|
+
elif ft.startswith("ecfp") or ft.startswith("fcfp"):
|
|
205
|
+
radius = int(ft[4])
|
|
206
|
+
use_features = ft.startswith("fcfp")
|
|
207
|
+
fp = cls.get_ecfp(
|
|
208
|
+
mol,
|
|
209
|
+
radius,
|
|
210
|
+
nBits=kwargs.get("nBits", 2048),
|
|
211
|
+
useFeatures=use_features,
|
|
212
|
+
)
|
|
213
|
+
elif ft.startswith("rdk"):
|
|
214
|
+
max_path = int(ft[3])
|
|
215
|
+
fp = cls.get_rdk_fp(
|
|
216
|
+
mol,
|
|
217
|
+
maxPath=max_path,
|
|
218
|
+
fpSize=kwargs.get("fpSize", 2048),
|
|
219
|
+
nBitsPerHash=kwargs.get("nBitsPerHash", 2),
|
|
220
|
+
)
|
|
221
|
+
elif ft == "ap":
|
|
222
|
+
fp = cls.mol_to_ap(mol)
|
|
223
|
+
elif ft == "torsion":
|
|
224
|
+
fp = cls.mol_to_torsion(mol)
|
|
225
|
+
elif ft == "pharm2d":
|
|
226
|
+
fp = cls.mol_to_pharm2d(mol)
|
|
227
|
+
else:
|
|
228
|
+
raise ValueError(f"Unsupported fingerprint type: {fingerprint_type!r}")
|
|
229
|
+
|
|
230
|
+
if convert_to_array:
|
|
231
|
+
if ft == "pharm2d":
|
|
232
|
+
bitstr = fp.ToBitString()
|
|
233
|
+
return np.array([int(b) for b in bitstr], dtype=np.int8)
|
|
234
|
+
arr = np.zeros((fp.GetNumBits(),), dtype=np.int8)
|
|
235
|
+
DataStructs.ConvertToNumpyArray(fp, arr)
|
|
236
|
+
return arr
|
|
237
|
+
|
|
238
|
+
return fp
|
|
239
|
+
|
|
240
|
+
def __str__(self) -> str:
|
|
241
|
+
"""Short description of the featurizer.
|
|
242
|
+
|
|
243
|
+
:return: Class name.
|
|
244
|
+
:rtype: str
|
|
245
|
+
"""
|
|
246
|
+
return "<SmilesFeaturizer>"
|
|
247
|
+
|
|
248
|
+
def help(self) -> None:
|
|
249
|
+
"""Print supported fingerprint types and usage summary.
|
|
250
|
+
|
|
251
|
+
:return: None
|
|
252
|
+
:rtype: NoneType
|
|
253
|
+
"""
|
|
254
|
+
print("SmilesFeaturizer supports the following fingerprint types:")
|
|
255
|
+
print(" - maccs, avalon, ecfp#, fcfp#, rdk#, ap, torsion, pharm2d")
|
|
256
|
+
print(
|
|
257
|
+
"Usage: SmilesFeaturizer.featurize_smiles(smiles, fingerprint_type, **kwargs)"
|
|
258
|
+
)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""transformation_fp.py
|
|
2
|
+
=======================
|
|
3
|
+
Compute reaction‐level fingerprints by combining molecular fingerprints
|
|
4
|
+
of reactants and products, with optional absolute mode and bit‐vector conversion.
|
|
5
|
+
|
|
6
|
+
Quick start
|
|
7
|
+
-----------
|
|
8
|
+
>>> from synkit.Chem.Fingerprint.transformation_fp import TransformationFP
|
|
9
|
+
>>> arr = TransformationFP().fit('CCO>>CC=O', symbols='>>', fp_type='ecfp4', abs=True)
|
|
10
|
+
>>> bv = TransformationFP().fit('CCO>>CC=O', symbols='>>', fp_type='ecfp4', abs=True, return_array=False)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
from typing import Any, Union
|
|
15
|
+
|
|
16
|
+
import numpy as np
|
|
17
|
+
from rdkit.DataStructs import cDataStructs
|
|
18
|
+
|
|
19
|
+
from synkit.Chem.Fingerprint.smiles_featurizer import SmilesFeaturizer
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TransformationFP:
|
|
23
|
+
"""Calculate reaction fingerprints by featurizing individual molecules and
|
|
24
|
+
combining them via vector subtraction.
|
|
25
|
+
|
|
26
|
+
:cvar None: Stateless utility class.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self) -> None:
|
|
30
|
+
"""Initialize TransformationFP.
|
|
31
|
+
|
|
32
|
+
This class has no instance state; all methods are static or
|
|
33
|
+
class‐level.
|
|
34
|
+
"""
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def convert_arr2vec(arr: np.ndarray) -> cDataStructs.ExplicitBitVect:
|
|
39
|
+
"""Convert a non-negative NumPy array into an RDKit bit vector.
|
|
40
|
+
|
|
41
|
+
:param arr: Array of non-negative fingerprint values.
|
|
42
|
+
:type arr: np.ndarray
|
|
43
|
+
:return: RDKit bit vector with positive values encoded as 1.
|
|
44
|
+
:rtype: cDataStructs.ExplicitBitVect
|
|
45
|
+
:raises ValueError: If the array contains negative or non-finite values.
|
|
46
|
+
"""
|
|
47
|
+
flat = np.asarray(arr).flatten()
|
|
48
|
+
if not np.isfinite(flat).all() or (flat < 0).any():
|
|
49
|
+
raise ValueError("Bit-vector output requires non-negative finite values.")
|
|
50
|
+
bitstr = "".join("1" if x else "0" for x in flat)
|
|
51
|
+
return cDataStructs.CreateFromBitString(bitstr)
|
|
52
|
+
|
|
53
|
+
def fit(
|
|
54
|
+
self,
|
|
55
|
+
reaction_smiles: str,
|
|
56
|
+
symbols: str,
|
|
57
|
+
fp_type: str,
|
|
58
|
+
abs: bool,
|
|
59
|
+
return_array: bool = True,
|
|
60
|
+
**kwargs: Any,
|
|
61
|
+
) -> Union[np.ndarray, cDataStructs.ExplicitBitVect]:
|
|
62
|
+
"""Generate a reaction fingerprint by subtracting reactant from product
|
|
63
|
+
fingerprints.
|
|
64
|
+
|
|
65
|
+
:param reaction_smiles: Reaction SMILES, reactant and product separated by `symbols`.
|
|
66
|
+
:type reaction_smiles: str
|
|
67
|
+
:param symbols: Delimiter between reactants and products in the SMILES string.
|
|
68
|
+
:type symbols: str
|
|
69
|
+
:param fp_type: Fingerprint type to use for individual molecules (e.g., 'ecfp4').
|
|
70
|
+
:type fp_type: str
|
|
71
|
+
:param abs: If True, take absolute value of the difference vector.
|
|
72
|
+
:type abs: bool
|
|
73
|
+
:param return_array: If True, return a NumPy array; otherwise convert to an RDKit bit vector.
|
|
74
|
+
:type return_array: bool
|
|
75
|
+
:param kwargs: Additional keyword arguments passed to `SmilesFeaturizer.featurize_smiles`.
|
|
76
|
+
:type kwargs: Any
|
|
77
|
+
:return: Reaction fingerprint as a NumPy array or RDKit bit vector.
|
|
78
|
+
:rtype: Union[np.ndarray, cDataStructs.ExplicitBitVect]
|
|
79
|
+
:raises ValueError: If `reaction_smiles` is not correctly formatted.
|
|
80
|
+
"""
|
|
81
|
+
if symbols not in reaction_smiles:
|
|
82
|
+
raise ValueError(f"Reaction SMILES must contain separator '{symbols}'")
|
|
83
|
+
react_part, prod_part = reaction_smiles.split(symbols)
|
|
84
|
+
|
|
85
|
+
def sum_fps(parts: list[str]) -> np.ndarray:
|
|
86
|
+
total = None
|
|
87
|
+
for smi in parts:
|
|
88
|
+
vec = SmilesFeaturizer.featurize_smiles(smi, fp_type, **kwargs)
|
|
89
|
+
if total is None:
|
|
90
|
+
total = vec.copy() if isinstance(vec, np.ndarray) else vec
|
|
91
|
+
else:
|
|
92
|
+
total = total + vec # type: ignore
|
|
93
|
+
return total # type: ignore
|
|
94
|
+
|
|
95
|
+
react_vec = sum_fps(react_part.split("."))
|
|
96
|
+
prod_vec = sum_fps(prod_part.split("."))
|
|
97
|
+
|
|
98
|
+
diff = prod_vec - react_vec # type: ignore
|
|
99
|
+
if abs:
|
|
100
|
+
diff = np.abs(diff)
|
|
101
|
+
|
|
102
|
+
if return_array:
|
|
103
|
+
return diff # type: ignore
|
|
104
|
+
return TransformationFP.convert_arr2vec(diff) # type: ignore
|
|
105
|
+
|
|
106
|
+
def help(self) -> None:
|
|
107
|
+
"""Print usage summary for the TransformationFP class.
|
|
108
|
+
|
|
109
|
+
:return: None
|
|
110
|
+
:rtype: NoneType
|
|
111
|
+
"""
|
|
112
|
+
print("TransformationFP: compute reaction fingerprints via vector subtraction.")
|
|
113
|
+
print(
|
|
114
|
+
" fit(reaction_smiles, symbols, fp_type, abs, return_array=True, **kwargs)"
|
|
115
|
+
)
|
|
116
|
+
print(" reaction_smiles: 'R1.R2>>P1.P2' SMILES string")
|
|
117
|
+
print(" symbols: separator between reactants and products (e.g. '>>')")
|
|
118
|
+
print(
|
|
119
|
+
" fp_type: one of 'maccs', 'avalon', 'ecfp#', 'fcfp#', 'rdk#', 'ap', 'torsion', 'pharm2d'"
|
|
120
|
+
)
|
|
121
|
+
print(" abs: take absolute difference (True/False)")
|
|
122
|
+
print(" return_array: return NumPy array (True) or RDKit bit vector (False)")
|
|
123
|
+
print(" convert_arr2vec(arr: np.ndarray) -> ExplicitBitVect")
|
|
124
|
+
print("Example:")
|
|
125
|
+
print(" tfp = TransformationFP()")
|
|
126
|
+
print(" arr = tfp.fit('CCO>>CC=O', '>>', 'ecfp4', abs=True)")
|
|
127
|
+
print(
|
|
128
|
+
" bv = tfp.fit('CCO>>CC=O', '>>', 'ecfp4', abs=True, return_array=False)"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
def __str__(self) -> str:
|
|
132
|
+
"""Short description of the transformer.
|
|
133
|
+
|
|
134
|
+
:return: Class name.
|
|
135
|
+
:rtype: str
|
|
136
|
+
"""
|
|
137
|
+
return "<TransformationFP>"
|
|
138
|
+
|
|
139
|
+
__repr__ = __str__
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
Mapper source layout
|
|
2
|
+
====================
|
|
3
|
+
|
|
4
|
+
Public entry points are exported from ``synkit.Chem.Mapper``. The selected
|
|
5
|
+
native mapper uses PABS with SLAP starting mappings. Use the main documentation for the
|
|
6
|
+
`user guide <../../../doc/mapper.rst>`_ and
|
|
7
|
+
`implementation notes <../../../doc/mapper/implementation.rst>`_.
|
|
8
|
+
|
|
9
|
+
::
|
|
10
|
+
|
|
11
|
+
Mapper/
|
|
12
|
+
__init__.py Public exports
|
|
13
|
+
mapper.py Method selection and common results
|
|
14
|
+
reaction_search.py Reaction preparation and output
|
|
15
|
+
_compat.py Historical import and command aliases
|
|
16
|
+
chem/ Chemistry conversion
|
|
17
|
+
graph/ Graph models and symmetry helpers
|
|
18
|
+
io/ Mapping serialization
|
|
19
|
+
solvers/
|
|
20
|
+
slap/ Python heuristic
|
|
21
|
+
exact/ Python exact methods and C++ graph bindings
|
|
22
|
+
native/ Shared C++ bindings and builds
|
|
23
|
+
cpp/ C++ sources, headers, CMake and examples
|
|
24
|
+
reporting/ Enumeration analysis and spectra
|
|
25
|
+
validation/ Reference and mapping checks
|
|
26
|
+
adapters/ Prediction seeds and executable templates
|
|
27
|
+
|
|
28
|
+
All solver implementations live under ``solvers/``. Native source and bindings
|
|
29
|
+
stay together in ``solvers/native/``. The user guide and implementation notes live in ``doc/mapper/``.
|
|
30
|
+
|
|
31
|
+
Platform wheels bundle the shared C++ library. Source checkouts use an explicit
|
|
32
|
+
build::
|
|
33
|
+
|
|
34
|
+
from synkit.Chem.Mapper import Mapper, map_reaction_implicit
|
|
35
|
+
from synkit.Chem.Mapper.solvers.native.build import build_mapper_native
|
|
36
|
+
|
|
37
|
+
library = build_mapper_native("build/mapper-core")
|
|
38
|
+
result = map_reaction_implicit("CCO>>COC", library_path=library)
|
|
39
|
+
mapper = Mapper("native", solver="pabs", library_path=library)
|
|
40
|
+
|
|
41
|
+
The old ``exact``, ``slap`` and ``_native`` import paths remain aliases to the
|
|
42
|
+
same implementations. New code uses the ``solvers`` paths. The historical
|
|
43
|
+
``synkit.Chem.Reaction.Mapper`` namespace is also supported.
|