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,266 @@
|
|
|
1
|
+
"""Thin prepared-graph adapter for deterministic weighted SLAP in C++."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import ctypes as ct
|
|
6
|
+
import math
|
|
7
|
+
import time
|
|
8
|
+
from collections import Counter
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from functools import lru_cache
|
|
11
|
+
from numbers import Integral, Real
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
16
|
+
from ..slap.lap import _adjacency_and_elements
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class _Statistics(ct.Structure):
|
|
20
|
+
_fields_ = (
|
|
21
|
+
[
|
|
22
|
+
(name, ct.c_int64)
|
|
23
|
+
for name in (
|
|
24
|
+
"states",
|
|
25
|
+
"lap_calls",
|
|
26
|
+
"fingerprints",
|
|
27
|
+
"candidates",
|
|
28
|
+
"best_proxy2",
|
|
29
|
+
)
|
|
30
|
+
]
|
|
31
|
+
+ [(name, ct.c_int32) for name in ("completed", "reason")]
|
|
32
|
+
+ [(name, ct.c_double) for name in ("elapsed_seconds", "callback_seconds")]
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
_INT = ct.POINTER(ct.c_int32)
|
|
37
|
+
_LONG = ct.POINTER(ct.c_int64)
|
|
38
|
+
_CALLBACK = ct.CFUNCTYPE(ct.c_int, _INT, ct.c_int64, ct.c_void_p)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@lru_cache(maxsize=4)
|
|
42
|
+
def _load(path):
|
|
43
|
+
library = ct.CDLL(str(Path(path).resolve()))
|
|
44
|
+
if library.synkit_mapper_abi() != 1:
|
|
45
|
+
raise RuntimeError(
|
|
46
|
+
"Unsupported native mapper ABI; rebuild with build_mapper_native"
|
|
47
|
+
)
|
|
48
|
+
library.synkit_mapper_error.restype = ct.c_char_p
|
|
49
|
+
library.synkit_slap_solve.argtypes = [
|
|
50
|
+
ct.c_int,
|
|
51
|
+
_LONG,
|
|
52
|
+
_LONG,
|
|
53
|
+
_INT,
|
|
54
|
+
_INT,
|
|
55
|
+
_INT,
|
|
56
|
+
ct.c_int,
|
|
57
|
+
ct.c_double,
|
|
58
|
+
ct.c_int64,
|
|
59
|
+
ct.c_int64,
|
|
60
|
+
_CALLBACK,
|
|
61
|
+
ct.c_void_p,
|
|
62
|
+
ct.POINTER(_Statistics),
|
|
63
|
+
]
|
|
64
|
+
library.synkit_slap_solve.restype = ct.c_int
|
|
65
|
+
return library
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@dataclass(frozen=True)
|
|
69
|
+
class NativeSlapResult:
|
|
70
|
+
"""Reached heuristic candidates; finished SLAP is not exact enumeration."""
|
|
71
|
+
|
|
72
|
+
mappings: list[list[int]]
|
|
73
|
+
distances: list[float]
|
|
74
|
+
selected_mapping_count: int
|
|
75
|
+
heuristic_finished: bool
|
|
76
|
+
truncation_reason: str | None
|
|
77
|
+
elapsed_seconds: float
|
|
78
|
+
backend_statistics: dict
|
|
79
|
+
backend: str = "slap_cpp"
|
|
80
|
+
scope: str = "heuristic_candidates"
|
|
81
|
+
minimum_cost: None = None
|
|
82
|
+
optimality_proven: bool = False
|
|
83
|
+
complete: bool = False
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def selected_labeled_mapping_count(self):
|
|
87
|
+
return self.selected_mapping_count
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# Array ownership and output callbacks must span the complete native solve.
|
|
91
|
+
def solve_slap( # noqa: C901
|
|
92
|
+
lgp,
|
|
93
|
+
*,
|
|
94
|
+
library_path,
|
|
95
|
+
binary=False,
|
|
96
|
+
max_lap_fingerprints=10_000,
|
|
97
|
+
time_limit_seconds=None,
|
|
98
|
+
max_states=None,
|
|
99
|
+
max_mappings=None,
|
|
100
|
+
collect_mappings=True,
|
|
101
|
+
mapping_callback=None,
|
|
102
|
+
):
|
|
103
|
+
"""Run SLAP refinement, LAP/fingerprint exploration and splitting in C++.
|
|
104
|
+
|
|
105
|
+
This deterministic weighted variant preserves half-integer chemical weights.
|
|
106
|
+
It does not reproduce Python hash labels, LAP tie order, or historical
|
|
107
|
+
fractional-cost truncation. All algorithmic decisions and final rescoring
|
|
108
|
+
occur in C++; Python only prepares arrays and handles output callbacks.
|
|
109
|
+
The caller can use ordinary reaction parsing/classification via Mapper.
|
|
110
|
+
"""
|
|
111
|
+
started = time.perf_counter()
|
|
112
|
+
if len(lgp) != 2:
|
|
113
|
+
raise ValueError("SLAP requires two endpoint graphs")
|
|
114
|
+
if not isinstance(binary, bool) or not isinstance(collect_mappings, bool):
|
|
115
|
+
raise TypeError("binary and collect_mappings must be boolean")
|
|
116
|
+
for name, value in (
|
|
117
|
+
("max_lap_fingerprints", max_lap_fingerprints),
|
|
118
|
+
("max_states", max_states),
|
|
119
|
+
("max_mappings", max_mappings),
|
|
120
|
+
):
|
|
121
|
+
if value is None and name != "max_lap_fingerprints":
|
|
122
|
+
continue
|
|
123
|
+
if (
|
|
124
|
+
isinstance(value, bool)
|
|
125
|
+
or not isinstance(value, Integral)
|
|
126
|
+
or not 1 <= value < 2**63
|
|
127
|
+
):
|
|
128
|
+
raise ValueError(
|
|
129
|
+
f"{name} must be a positive integer"
|
|
130
|
+
+ (" or None" if name != "max_lap_fingerprints" else "")
|
|
131
|
+
)
|
|
132
|
+
if max_lap_fingerprints >= 2**31:
|
|
133
|
+
raise ValueError("max_lap_fingerprints exceeds the C ABI integer range")
|
|
134
|
+
if time_limit_seconds is not None and (
|
|
135
|
+
isinstance(time_limit_seconds, bool)
|
|
136
|
+
or not isinstance(time_limit_seconds, Real)
|
|
137
|
+
or not math.isfinite(time_limit_seconds)
|
|
138
|
+
or time_limit_seconds < 0
|
|
139
|
+
):
|
|
140
|
+
raise ValueError("time_limit_seconds must be finite and nonnegative")
|
|
141
|
+
if mapping_callback is not None and not callable(mapping_callback):
|
|
142
|
+
raise TypeError("mapping_callback must be callable")
|
|
143
|
+
matrices, elements = zip(*(_adjacency_and_elements(g, binary) for g in lgp))
|
|
144
|
+
if any(g.graph[i].get(i, 0) for g in lgp for i in range(len(g.labels))):
|
|
145
|
+
raise ValueError("Native SLAP requires loop-free graphs")
|
|
146
|
+
a, b = matrices
|
|
147
|
+
labels = [list(graph.labels) for graph in lgp]
|
|
148
|
+
n = len(labels[0])
|
|
149
|
+
if not 1 <= n <= 512 or a.shape != (n, n) or b.shape != (n, n):
|
|
150
|
+
raise ValueError(
|
|
151
|
+
"Native SLAP requires compatible endpoints with 1..512 vertices"
|
|
152
|
+
)
|
|
153
|
+
if Counter(labels[0]) != Counter(labels[1]) or Counter(elements[0]) != Counter(
|
|
154
|
+
elements[1]
|
|
155
|
+
):
|
|
156
|
+
raise ValueError("SLAP endpoints must have equal atom-type inventories")
|
|
157
|
+
encoded_matrices = []
|
|
158
|
+
for matrix in matrices:
|
|
159
|
+
if (
|
|
160
|
+
not np.isfinite(matrix).all()
|
|
161
|
+
or np.any(matrix < 0)
|
|
162
|
+
or np.any(matrix > 500000)
|
|
163
|
+
or not np.array_equal(matrix, matrix.T)
|
|
164
|
+
or np.any(np.diag(matrix))
|
|
165
|
+
or not np.allclose(matrix * 2, np.rint(matrix * 2), atol=1e-9, rtol=0)
|
|
166
|
+
):
|
|
167
|
+
raise ValueError(
|
|
168
|
+
"Native SLAP requires symmetric loop-free nonnegative half-integer weights"
|
|
169
|
+
)
|
|
170
|
+
encoded_matrices.append(
|
|
171
|
+
np.ascontiguousarray(np.rint(matrix * 2), dtype=np.int64)
|
|
172
|
+
)
|
|
173
|
+
registry = {}
|
|
174
|
+
encoded_labels = [
|
|
175
|
+
np.asarray(
|
|
176
|
+
[
|
|
177
|
+
registry.setdefault((x, element), len(registry))
|
|
178
|
+
for x, element in zip(side, atoms)
|
|
179
|
+
],
|
|
180
|
+
dtype=np.int32,
|
|
181
|
+
)
|
|
182
|
+
for side, atoms in zip(labels, elements)
|
|
183
|
+
]
|
|
184
|
+
if Counter(encoded_labels[0]) != Counter(encoded_labels[1]):
|
|
185
|
+
raise ValueError(
|
|
186
|
+
"Initial SLAP partitions have incompatible atom-type inventories"
|
|
187
|
+
)
|
|
188
|
+
# Preserve the Python matcher's special original-label rule. Reencoded
|
|
189
|
+
# numeric type 1 must not accidentally activate it for another atom type.
|
|
190
|
+
stop_flags = np.asarray([int(value == 1) for value in labels[0]], dtype=np.int32)
|
|
191
|
+
mappings, distances, errors = [], [], []
|
|
192
|
+
|
|
193
|
+
def receive(pointer, cost2, _userdata):
|
|
194
|
+
try:
|
|
195
|
+
mapping = list(pointer[:n])
|
|
196
|
+
if sorted(mapping) != list(range(n)) or any(
|
|
197
|
+
labels[0][i] != labels[1][j] or elements[0][i] != elements[1][j]
|
|
198
|
+
for i, j in enumerate(mapping)
|
|
199
|
+
):
|
|
200
|
+
raise RuntimeError(
|
|
201
|
+
"Native SLAP returned an incompatible atom bijection"
|
|
202
|
+
)
|
|
203
|
+
cost = cost2 / 2
|
|
204
|
+
if collect_mappings:
|
|
205
|
+
mappings.append(mapping)
|
|
206
|
+
distances.append(cost)
|
|
207
|
+
if mapping_callback is not None:
|
|
208
|
+
mapping_callback(mapping, cost)
|
|
209
|
+
return 0
|
|
210
|
+
except BaseException as error: # noqa: BLE001 -- Never cross the C callback boundary.
|
|
211
|
+
errors.append(error)
|
|
212
|
+
return 1
|
|
213
|
+
|
|
214
|
+
callback = _CALLBACK(receive)
|
|
215
|
+
library = _load(str(Path(library_path).resolve()))
|
|
216
|
+
seconds = (
|
|
217
|
+
-1.0
|
|
218
|
+
if time_limit_seconds is None
|
|
219
|
+
else max(0, time_limit_seconds - (time.perf_counter() - started))
|
|
220
|
+
)
|
|
221
|
+
stats = _Statistics()
|
|
222
|
+
status = library.synkit_slap_solve(
|
|
223
|
+
n,
|
|
224
|
+
*(array.ctypes.data_as(_LONG) for array in encoded_matrices),
|
|
225
|
+
*(array.ctypes.data_as(_INT) for array in encoded_labels),
|
|
226
|
+
stop_flags.ctypes.data_as(_INT),
|
|
227
|
+
int(max_lap_fingerprints),
|
|
228
|
+
seconds,
|
|
229
|
+
-1 if max_states is None else int(max_states),
|
|
230
|
+
-1 if max_mappings is None else int(max_mappings),
|
|
231
|
+
callback,
|
|
232
|
+
None,
|
|
233
|
+
ct.byref(stats),
|
|
234
|
+
)
|
|
235
|
+
if errors:
|
|
236
|
+
raise errors[0]
|
|
237
|
+
if status:
|
|
238
|
+
raise RuntimeError(library.synkit_mapper_error().decode())
|
|
239
|
+
reasons = {
|
|
240
|
+
0: None,
|
|
241
|
+
1: "time_limit",
|
|
242
|
+
2: "max_states",
|
|
243
|
+
3: "max_mappings",
|
|
244
|
+
4: "callback",
|
|
245
|
+
}
|
|
246
|
+
statistics = {name: getattr(stats, name) for name, _ in stats._fields_}
|
|
247
|
+
statistics.update(
|
|
248
|
+
variant="deterministic_weighted_slap_v1",
|
|
249
|
+
cost_scale=2,
|
|
250
|
+
implementation="cpp_sequential_lap_fingerprints_refinement",
|
|
251
|
+
library_path=str(Path(library_path).resolve()),
|
|
252
|
+
max_lap_fingerprints=int(max_lap_fingerprints),
|
|
253
|
+
symmetry_policy="heuristic_stable_wl_split_representatives",
|
|
254
|
+
)
|
|
255
|
+
return NativeSlapResult(
|
|
256
|
+
mappings,
|
|
257
|
+
distances,
|
|
258
|
+
stats.candidates,
|
|
259
|
+
bool(stats.completed),
|
|
260
|
+
reasons[stats.reason],
|
|
261
|
+
time.perf_counter() - started,
|
|
262
|
+
statistics,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
__all__ = ["NativeSlapResult", "solve_slap"]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""Thin prepared-graph and reaction adapters for optional native solver engines.
|
|
2
|
+
|
|
3
|
+
The common core loads prebuilt libraries explicitly. No engine is compiled on
|
|
4
|
+
import, and an unavailable requested C++ backend never falls back to Python.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from .core import enumerate_core_mappings, map_reaction_core
|
|
10
|
+
|
|
11
|
+
SOLVERS = frozenset({"cp_sat", "scip", "maxsat", "kmilp"})
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _backend(solver):
|
|
15
|
+
if solver not in SOLVERS:
|
|
16
|
+
raise ValueError("solver must be 'cp_sat', 'scip', 'maxsat', or 'kmilp'")
|
|
17
|
+
return solver
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def enumerate_solver_mappings(lgp, *, library_path, solver="cp_sat", **options):
|
|
21
|
+
"""Run a full-space or explicit-kernel engine through the doubled-CD ABI.
|
|
22
|
+
|
|
23
|
+
CP-SAT enumerates the objective-free satisfaction model after minimum
|
|
24
|
+
proof. SCIP and Open-WBO enumerate projected assignments with no-goods.
|
|
25
|
+
Native class construction is requested separately from raw enumeration.
|
|
26
|
+
"""
|
|
27
|
+
return enumerate_core_mappings(
|
|
28
|
+
lgp, library_path=library_path, backend=_backend(solver), **options
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def map_reaction_solver(reaction, *, library_path, solver="cp_sat", **options):
|
|
33
|
+
"""Use the common chemistry frontend with an explicitly selected engine."""
|
|
34
|
+
return map_reaction_core(
|
|
35
|
+
reaction, library_path=library_path, backend=_backend(solver), **options
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def enumerate_kernel_milp_mappings(lgp, *, library_path, allowed_domains, **options):
|
|
40
|
+
"""Enumerate only the explicitly supplied compatible assignment kernel."""
|
|
41
|
+
if allowed_domains is None:
|
|
42
|
+
raise ValueError("KMILP requires explicit allowed_domains")
|
|
43
|
+
return enumerate_core_mappings(
|
|
44
|
+
lgp,
|
|
45
|
+
library_path=library_path,
|
|
46
|
+
backend="kmilp",
|
|
47
|
+
allowed_domains=allowed_domains,
|
|
48
|
+
**options,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def map_reaction_kernel_milp(reaction, *, library_path, allowed_domains, **options):
|
|
53
|
+
"""Map within explicit domains using native classification by default.
|
|
54
|
+
|
|
55
|
+
Set native_classification=False to select reference Python classification.
|
|
56
|
+
The proof and enumeration scope remains the supplied kernel.
|
|
57
|
+
"""
|
|
58
|
+
if allowed_domains is None:
|
|
59
|
+
raise ValueError("KMILP requires explicit allowed_domains")
|
|
60
|
+
options.setdefault("native_classification", True)
|
|
61
|
+
return map_reaction_core(
|
|
62
|
+
reaction,
|
|
63
|
+
library_path=library_path,
|
|
64
|
+
backend="kmilp",
|
|
65
|
+
allowed_domains=allowed_domains,
|
|
66
|
+
**options,
|
|
67
|
+
)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Preserve supplied geometry and assign complete modern CIP descriptors."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
from rdkit import Chem
|
|
6
|
+
from rdkit.Chem import rdCIPLabeler
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def assign_stereo(mol):
|
|
10
|
+
"""Assign true CIP labels without legacy cleanup of supplied chiral tags.
|
|
11
|
+
|
|
12
|
+
Highly symmetric recursion is bounded and raises explicitly rather than
|
|
13
|
+
returning a silently incomplete stereo palette. No H atoms are created.
|
|
14
|
+
"""
|
|
15
|
+
for obj in list(mol.GetAtoms()) + list(mol.GetBonds()):
|
|
16
|
+
if obj.HasProp("_CIPCode"):
|
|
17
|
+
obj.ClearProp("_CIPCode")
|
|
18
|
+
rdCIPLabeler.AssignCIPLabels(mol, maxRecursiveIterations=1000000)
|
|
19
|
+
return mol
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def stereo_smiles(mol, *, canonical=True):
|
|
23
|
+
"""Serialize existing stereo without RDKit's lossy legacy cleanup pass."""
|
|
24
|
+
parameters = Chem.SmilesWriteParams()
|
|
25
|
+
parameters.canonical = canonical
|
|
26
|
+
parameters.doIsomericSmiles = True
|
|
27
|
+
parameters.cleanStereo = False
|
|
28
|
+
return Chem.MolToSmiles(mol, parameters)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def endpoint_identity_key(mol):
|
|
32
|
+
"""Canonical colored-graph identity, avoiding stereo-SMILES rank ambiguity.
|
|
33
|
+
|
|
34
|
+
Modern CIP is encoded as an ordinary node color. Bond state is encoded by
|
|
35
|
+
colored auxiliary vertices; these are identity-code gadgets, not H atoms or
|
|
36
|
+
chemical participants. The original palette accompanies the graph code.
|
|
37
|
+
"""
|
|
38
|
+
assign_stereo(mol)
|
|
39
|
+
node_tokens = [
|
|
40
|
+
json.dumps(
|
|
41
|
+
(
|
|
42
|
+
"a",
|
|
43
|
+
a.GetAtomicNum(),
|
|
44
|
+
a.GetIsotope(),
|
|
45
|
+
a.GetFormalCharge(),
|
|
46
|
+
a.GetNumRadicalElectrons(),
|
|
47
|
+
a.GetTotalNumHs(),
|
|
48
|
+
a.GetIsAromatic(),
|
|
49
|
+
a.GetProp("_CIPCode") if a.HasProp("_CIPCode") else "",
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
for a in mol.GetAtoms()
|
|
53
|
+
]
|
|
54
|
+
edge_tokens = [
|
|
55
|
+
json.dumps(("b", str(b.GetBondType()), str(b.GetStereo())))
|
|
56
|
+
for b in mol.GetBonds()
|
|
57
|
+
]
|
|
58
|
+
directed = {Chem.BondType.DATIVE, Chem.BondType.DATIVEL, Chem.BondType.DATIVER}
|
|
59
|
+
tokens = sorted(set(node_tokens + edge_tokens + ['"tail"', '"head"']))
|
|
60
|
+
colors = {token: i + 1 for i, token in enumerate(tokens)}
|
|
61
|
+
graph = Chem.RWMol()
|
|
62
|
+
|
|
63
|
+
def add(token):
|
|
64
|
+
atom = Chem.Atom(0)
|
|
65
|
+
atom.SetNoImplicit(True)
|
|
66
|
+
atom.SetIsotope(colors[token])
|
|
67
|
+
return graph.AddAtom(atom)
|
|
68
|
+
|
|
69
|
+
for token in node_tokens:
|
|
70
|
+
add(token)
|
|
71
|
+
for bond, token in zip(mol.GetBonds(), edge_tokens):
|
|
72
|
+
i, j = bond.GetBeginAtomIdx(), bond.GetEndAtomIdx()
|
|
73
|
+
middle = add(token)
|
|
74
|
+
if bond.GetBondType() in directed:
|
|
75
|
+
tail, head = add('"tail"'), add('"head"')
|
|
76
|
+
graph.AddBond(i, tail, Chem.BondType.SINGLE)
|
|
77
|
+
graph.AddBond(tail, middle, Chem.BondType.SINGLE)
|
|
78
|
+
graph.AddBond(middle, head, Chem.BondType.SINGLE)
|
|
79
|
+
graph.AddBond(head, j, Chem.BondType.SINGLE)
|
|
80
|
+
else:
|
|
81
|
+
graph.AddBond(i, middle, Chem.BondType.SINGLE)
|
|
82
|
+
graph.AddBond(middle, j, Chem.BondType.SINGLE)
|
|
83
|
+
return json.dumps(
|
|
84
|
+
(tokens, Chem.MolToSmiles(graph, canonical=True, isomericSmiles=True)),
|
|
85
|
+
separators=(",", ":"),
|
|
86
|
+
)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Native exhaustive DFS and binary edit-support enumeration adapters."""
|
|
2
|
+
|
|
3
|
+
from .core import enumerate_core_mappings, map_reaction_core
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def enumerate_dfs_mappings(graphs, *, library_path, **options):
|
|
7
|
+
"""Exhaustive compatible permutation traversal with no assignment bound."""
|
|
8
|
+
return enumerate_core_mappings(
|
|
9
|
+
graphs, library_path=library_path, backend="dfs", **options
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def enumerate_edit_mappings(graphs, *, library_path, **options):
|
|
14
|
+
"""Enumerate binary edge-flip supports then exact typed graph isomorphisms.
|
|
15
|
+
|
|
16
|
+
This backend supports only binary bond presence. Supplying ``binary=True``
|
|
17
|
+
explicitly converts a weighted input to that separate objective; requesting
|
|
18
|
+
weighted EDIT without conversion returns unsupported from the native core.
|
|
19
|
+
"""
|
|
20
|
+
return enumerate_core_mappings(
|
|
21
|
+
graphs, library_path=library_path, backend="edit", **options
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def map_reaction_dfs(reaction, *, library_path, **options):
|
|
26
|
+
return map_reaction_core(
|
|
27
|
+
reaction, library_path=library_path, backend="dfs", **options
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def map_reaction_edit(reaction, *, library_path, **options):
|
|
32
|
+
return map_reaction_core(
|
|
33
|
+
reaction, library_path=library_path, backend="edit", **options
|
|
34
|
+
)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""Opt-in canonical construction traversal and its measured symmetry work."""
|
|
2
|
+
|
|
3
|
+
import ctypes as ct
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class _Profile(ct.Structure):
|
|
8
|
+
_fields_ = [
|
|
9
|
+
(name, ct.c_int64)
|
|
10
|
+
for name in (
|
|
11
|
+
"discovery_nodes",
|
|
12
|
+
"subgroup_order",
|
|
13
|
+
"canonical_calls",
|
|
14
|
+
"augmentations",
|
|
15
|
+
"canonical_rejections",
|
|
16
|
+
"bound_rejections",
|
|
17
|
+
)
|
|
18
|
+
] + [
|
|
19
|
+
("identity_fallback_r", ct.c_int32),
|
|
20
|
+
("identity_fallback_p", ct.c_int32),
|
|
21
|
+
("discovery_seconds", ct.c_double),
|
|
22
|
+
("canonical_seconds", ct.c_double),
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class _ProfileV2(ct.Structure):
|
|
27
|
+
_fields_ = (
|
|
28
|
+
[("base", _Profile)]
|
|
29
|
+
+ [
|
|
30
|
+
(name, ct.c_int64)
|
|
31
|
+
for name in (
|
|
32
|
+
"twin_blocks_r",
|
|
33
|
+
"twin_blocks_p",
|
|
34
|
+
"quotient_order_r",
|
|
35
|
+
"quotient_order_p",
|
|
36
|
+
"bound_calls",
|
|
37
|
+
"seed_cost2",
|
|
38
|
+
)
|
|
39
|
+
]
|
|
40
|
+
+ [("bound_seconds", ct.c_double), ("seed_seconds", ct.c_double)]
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def cpabs_profile(library_path):
|
|
45
|
+
"""Read same-thread diagnostics from the latest cPABS run in this library."""
|
|
46
|
+
library = ct.CDLL(str(Path(library_path).resolve()))
|
|
47
|
+
function = library.synkit_mapper_cpabs_profile
|
|
48
|
+
function.argtypes = [ct.POINTER(_Profile)]
|
|
49
|
+
function.restype = None
|
|
50
|
+
value = _Profile()
|
|
51
|
+
function(ct.byref(value))
|
|
52
|
+
result = {name: getattr(value, name) for name, _ in _Profile._fields_}
|
|
53
|
+
if hasattr(library, "synkit_mapper_cpabs_profile_v2"):
|
|
54
|
+
function = library.synkit_mapper_cpabs_profile_v2
|
|
55
|
+
function.argtypes = [ct.POINTER(_ProfileV2)]
|
|
56
|
+
function.restype = None
|
|
57
|
+
detail = _ProfileV2()
|
|
58
|
+
function(ct.byref(detail))
|
|
59
|
+
result.update(
|
|
60
|
+
{
|
|
61
|
+
name: getattr(detail, name)
|
|
62
|
+
for name, _ in _ProfileV2._fields_
|
|
63
|
+
if name != "base"
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
return result
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def enumerate_cpabs_mappings(lgp, *, library_path, **kwargs):
|
|
70
|
+
"""Run the complete canonical-parent traversal through the shared adapter.
|
|
71
|
+
|
|
72
|
+
Symmetry pruning is explicitly enabled with ``symmetry=True``. The method
|
|
73
|
+
changes the extension tree to unordered partial matchings; it does not add
|
|
74
|
+
a canonical deletion filter to fixed/adaptive source-row PABS. Exact twin
|
|
75
|
+
factors remain active even when quotient-group discovery is capped.
|
|
76
|
+
Raw output enumerates subgroup orbits and requires class deduplication.
|
|
77
|
+
"""
|
|
78
|
+
from .core import enumerate_core_mappings
|
|
79
|
+
|
|
80
|
+
return enumerate_core_mappings(
|
|
81
|
+
lgp, library_path=library_path, backend="cpabs", **kwargs
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def map_reaction_cpabs(reaction, *, library_path, **kwargs):
|
|
86
|
+
"""Use the shared chemistry frontend with the explicit native variant."""
|
|
87
|
+
from .core import map_reaction_core
|
|
88
|
+
|
|
89
|
+
return map_reaction_core(
|
|
90
|
+
reaction, backend="cpabs", library_path=library_path, **kwargs
|
|
91
|
+
)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Sequential linear-assignment (SLAP) matching and LAP-based utilities.
|
|
3
|
+
|
|
4
|
+
LAP means linear assignment problem: match reactant atoms to product atoms
|
|
5
|
+
using a matrix of pair costs. SLAP combines successive LAP decisions with
|
|
6
|
+
WL graph-label refinement to construct heuristic graph mappings. It is the
|
|
7
|
+
default solver used by ``AAMapper.map_smiles``. The utility functions here
|
|
8
|
+
also serve exact solvers; importing a LAP helper does not select the SLAP
|
|
9
|
+
matching workflow.
|
|
10
|
+
|
|
11
|
+
Submodules
|
|
12
|
+
----------
|
|
13
|
+
sequential
|
|
14
|
+
:class:`GraphMatcher`: iterative WL-label refinement with LAP branching.
|
|
15
|
+
lap
|
|
16
|
+
LAP utilities, :func:`chemical_distance`, :func:`dual_lap_lower_bound`,
|
|
17
|
+
and :func:`recover_mapping`.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from .sequential import GraphMatcher
|
|
21
|
+
from .lap import solve_lap, recover_mapping, chemical_distance, dual_lap_lower_bound
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"GraphMatcher",
|
|
25
|
+
"solve_lap",
|
|
26
|
+
"recover_mapping",
|
|
27
|
+
"chemical_distance",
|
|
28
|
+
"dual_lap_lower_bound",
|
|
29
|
+
]
|