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,412 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from time import perf_counter
|
|
4
|
+
from typing import Any, Optional, Tuple
|
|
5
|
+
|
|
6
|
+
import networkx as nx
|
|
7
|
+
from networkx.algorithms.isomorphism import DiGraphMatcher
|
|
8
|
+
|
|
9
|
+
from ._common import (
|
|
10
|
+
IsomorphismResult,
|
|
11
|
+
SymmetryConfig,
|
|
12
|
+
build_fast_signature,
|
|
13
|
+
edge_matcher,
|
|
14
|
+
node_matcher,
|
|
15
|
+
)
|
|
16
|
+
from .wl_canon import WLCanonicalizer
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CRNIsomorphism:
|
|
20
|
+
"""Pairwise graph isomorphism and subgraph isomorphism for CRN graphs.
|
|
21
|
+
|
|
22
|
+
This class wraps a CRN graph representation together with the node and edge
|
|
23
|
+
matchers required for exact VF2-style isomorphism checks. It also provides a
|
|
24
|
+
fast invariant-based rejection step using graph signatures derived from node
|
|
25
|
+
tokens, edge tokens, degree histograms, and WL color histograms.
|
|
26
|
+
|
|
27
|
+
:param source:
|
|
28
|
+
Input source accepted by :class:`WLCanonicalizer`, such as a CRN-like
|
|
29
|
+
object or a NetworkX graph.
|
|
30
|
+
:type source: Any
|
|
31
|
+
|
|
32
|
+
:param include_rule:
|
|
33
|
+
Whether rule/reaction nodes should be included in the internal graph
|
|
34
|
+
representation.
|
|
35
|
+
:type include_rule: bool
|
|
36
|
+
|
|
37
|
+
:param include_stoich:
|
|
38
|
+
Whether stoichiometric information should be included in the internal
|
|
39
|
+
graph representation.
|
|
40
|
+
:type include_stoich: bool
|
|
41
|
+
|
|
42
|
+
:param wl_iters:
|
|
43
|
+
Maximum number of Weisfeiler-Lehman refinement iterations.
|
|
44
|
+
:type wl_iters: int
|
|
45
|
+
|
|
46
|
+
:param wl_digest_size:
|
|
47
|
+
Digest size used by the WL canonicalizer.
|
|
48
|
+
:type wl_digest_size: int
|
|
49
|
+
|
|
50
|
+
:param config:
|
|
51
|
+
Symmetry configuration controlling semantic versus topological matching.
|
|
52
|
+
If ``None``, :meth:`SymmetryConfig.semantic` is used.
|
|
53
|
+
:type config: Optional[SymmetryConfig]
|
|
54
|
+
|
|
55
|
+
.. rubric:: Examples
|
|
56
|
+
|
|
57
|
+
.. code-block:: python
|
|
58
|
+
|
|
59
|
+
from synkit.CRN.Sym.iso import CRNIsomorphism
|
|
60
|
+
|
|
61
|
+
iso_a = CRNIsomorphism(crn_a)
|
|
62
|
+
iso_b = CRNIsomorphism(crn_b)
|
|
63
|
+
|
|
64
|
+
result = iso_a.isomorphic_to(iso_b)
|
|
65
|
+
print(result.isomorphic)
|
|
66
|
+
print(result.mapping)
|
|
67
|
+
|
|
68
|
+
sub = iso_a.subgraph_isomorphic_to(iso_b)
|
|
69
|
+
print(sub.isomorphic)
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def __init__(
|
|
73
|
+
self,
|
|
74
|
+
source: Any,
|
|
75
|
+
*,
|
|
76
|
+
include_rule: bool = True,
|
|
77
|
+
include_stoich: bool = True,
|
|
78
|
+
wl_iters: int = 20,
|
|
79
|
+
wl_digest_size: int = 16,
|
|
80
|
+
config: Optional[SymmetryConfig] = None,
|
|
81
|
+
) -> None:
|
|
82
|
+
"""
|
|
83
|
+
Initialize the CRN isomorphism wrapper.
|
|
84
|
+
|
|
85
|
+
:param source:
|
|
86
|
+
Input CRN-like object or NetworkX graph.
|
|
87
|
+
:type source: Any
|
|
88
|
+
|
|
89
|
+
:param include_rule:
|
|
90
|
+
Whether rule/reaction nodes are included.
|
|
91
|
+
:type include_rule: bool
|
|
92
|
+
|
|
93
|
+
:param include_stoich:
|
|
94
|
+
Whether stoichiometric information should be included.
|
|
95
|
+
:type include_stoich: bool
|
|
96
|
+
|
|
97
|
+
:param wl_iters:
|
|
98
|
+
Maximum number of WL refinement iterations.
|
|
99
|
+
:type wl_iters: int
|
|
100
|
+
|
|
101
|
+
:param wl_digest_size:
|
|
102
|
+
Digest size used internally by WL hashing.
|
|
103
|
+
:type wl_digest_size: int
|
|
104
|
+
|
|
105
|
+
:param config:
|
|
106
|
+
Optional symmetry configuration. If omitted, semantic mode is used.
|
|
107
|
+
:type config: Optional[SymmetryConfig]
|
|
108
|
+
"""
|
|
109
|
+
self.config = config or SymmetryConfig.semantic()
|
|
110
|
+
self.wl = self._build_wl(
|
|
111
|
+
source,
|
|
112
|
+
include_rule=include_rule,
|
|
113
|
+
include_stoich=include_stoich,
|
|
114
|
+
wl_iters=wl_iters,
|
|
115
|
+
wl_digest_size=wl_digest_size,
|
|
116
|
+
config=self.config,
|
|
117
|
+
)
|
|
118
|
+
self._node_match = node_matcher(self.config)
|
|
119
|
+
self._edge_match = edge_matcher(self.config)
|
|
120
|
+
|
|
121
|
+
@staticmethod
|
|
122
|
+
def _build_wl(
|
|
123
|
+
source: Any,
|
|
124
|
+
*,
|
|
125
|
+
include_rule: bool,
|
|
126
|
+
include_stoich: bool,
|
|
127
|
+
wl_iters: int,
|
|
128
|
+
wl_digest_size: int,
|
|
129
|
+
config: SymmetryConfig,
|
|
130
|
+
) -> WLCanonicalizer:
|
|
131
|
+
"""Construct the internal WL canonicalizer.
|
|
132
|
+
|
|
133
|
+
:param source:
|
|
134
|
+
Input CRN-like object or graph.
|
|
135
|
+
:type source: Any
|
|
136
|
+
|
|
137
|
+
:param include_rule:
|
|
138
|
+
Whether rule/reaction nodes are included.
|
|
139
|
+
:type include_rule: bool
|
|
140
|
+
|
|
141
|
+
:param include_stoich:
|
|
142
|
+
Whether stoichiometric information should be included.
|
|
143
|
+
:type include_stoich: bool
|
|
144
|
+
|
|
145
|
+
:param wl_iters:
|
|
146
|
+
Maximum number of WL iterations.
|
|
147
|
+
:type wl_iters: int
|
|
148
|
+
|
|
149
|
+
:param wl_digest_size:
|
|
150
|
+
Digest size used for WL hashing.
|
|
151
|
+
:type wl_digest_size: int
|
|
152
|
+
|
|
153
|
+
:param config:
|
|
154
|
+
Symmetry configuration.
|
|
155
|
+
:type config: SymmetryConfig
|
|
156
|
+
|
|
157
|
+
:return:
|
|
158
|
+
Initialized WL canonicalizer.
|
|
159
|
+
:rtype: WLCanonicalizer
|
|
160
|
+
"""
|
|
161
|
+
return WLCanonicalizer(
|
|
162
|
+
source,
|
|
163
|
+
include_rule=include_rule,
|
|
164
|
+
include_stoich=include_stoich,
|
|
165
|
+
n_iter=wl_iters,
|
|
166
|
+
digest_size=wl_digest_size,
|
|
167
|
+
config=config,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def G(self) -> nx.DiGraph:
|
|
172
|
+
"""Return the internal directed graph.
|
|
173
|
+
|
|
174
|
+
:return:
|
|
175
|
+
Internal directed graph used for isomorphism analysis.
|
|
176
|
+
:rtype: nx.DiGraph
|
|
177
|
+
"""
|
|
178
|
+
return self.wl.G
|
|
179
|
+
|
|
180
|
+
@property
|
|
181
|
+
def graph_type(self) -> str:
|
|
182
|
+
"""Return the graph type label.
|
|
183
|
+
|
|
184
|
+
:return:
|
|
185
|
+
Graph type string.
|
|
186
|
+
:rtype: str
|
|
187
|
+
"""
|
|
188
|
+
return self.wl.graph_type
|
|
189
|
+
|
|
190
|
+
def _signature(self) -> Tuple[Any, ...]:
|
|
191
|
+
"""Build a fast invariant signature for cheap rejection.
|
|
192
|
+
|
|
193
|
+
:return:
|
|
194
|
+
Signature tuple combining graph size, token histograms, degree
|
|
195
|
+
histograms, and WL color histograms.
|
|
196
|
+
:rtype: Tuple[Any, ...]
|
|
197
|
+
"""
|
|
198
|
+
return build_fast_signature(
|
|
199
|
+
self.G,
|
|
200
|
+
self.graph_type,
|
|
201
|
+
self.config,
|
|
202
|
+
wl_color_hist=self.wl._run().color_hist,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
def _make_matcher(
|
|
206
|
+
self, other_graph: nx.DiGraph, this_graph: nx.DiGraph
|
|
207
|
+
) -> DiGraphMatcher:
|
|
208
|
+
"""Build a directed graph matcher for exact isomorphism checks.
|
|
209
|
+
|
|
210
|
+
:param other_graph:
|
|
211
|
+
First graph supplied to :class:`DiGraphMatcher`.
|
|
212
|
+
:type other_graph: nx.DiGraph
|
|
213
|
+
|
|
214
|
+
:param this_graph:
|
|
215
|
+
Second graph supplied to :class:`DiGraphMatcher`.
|
|
216
|
+
:type this_graph: nx.DiGraph
|
|
217
|
+
|
|
218
|
+
:return:
|
|
219
|
+
Configured directed graph matcher.
|
|
220
|
+
:rtype: DiGraphMatcher
|
|
221
|
+
"""
|
|
222
|
+
return DiGraphMatcher(
|
|
223
|
+
other_graph,
|
|
224
|
+
this_graph,
|
|
225
|
+
node_match=self._node_match,
|
|
226
|
+
edge_match=self._edge_match,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
@staticmethod
|
|
230
|
+
def _result(
|
|
231
|
+
isomorphic: bool,
|
|
232
|
+
mapping: Optional[dict[Any, Any]],
|
|
233
|
+
start: float,
|
|
234
|
+
rejected_by_invariants: bool,
|
|
235
|
+
mode: str,
|
|
236
|
+
) -> IsomorphismResult:
|
|
237
|
+
"""Build an :class:`IsomorphismResult`.
|
|
238
|
+
|
|
239
|
+
:param isomorphic:
|
|
240
|
+
Whether the compared graphs are isomorphic.
|
|
241
|
+
:type isomorphic: bool
|
|
242
|
+
|
|
243
|
+
:param mapping:
|
|
244
|
+
Witness mapping, if available.
|
|
245
|
+
:type mapping: Optional[dict[Any, Any]]
|
|
246
|
+
|
|
247
|
+
:param start:
|
|
248
|
+
Start time from :func:`perf_counter`.
|
|
249
|
+
:type start: float
|
|
250
|
+
|
|
251
|
+
:param rejected_by_invariants:
|
|
252
|
+
Whether the comparison was rejected before exact matching.
|
|
253
|
+
:type rejected_by_invariants: bool
|
|
254
|
+
|
|
255
|
+
:param mode:
|
|
256
|
+
Matching mode label.
|
|
257
|
+
:type mode: str
|
|
258
|
+
|
|
259
|
+
:return:
|
|
260
|
+
Isomorphism result object.
|
|
261
|
+
:rtype: IsomorphismResult
|
|
262
|
+
"""
|
|
263
|
+
return IsomorphismResult(
|
|
264
|
+
isomorphic=isomorphic,
|
|
265
|
+
mapping=mapping,
|
|
266
|
+
elapsed_seconds=perf_counter() - start,
|
|
267
|
+
rejected_by_invariants=rejected_by_invariants,
|
|
268
|
+
mode=mode,
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
def isomorphic_to(self, other: "CRNIsomorphism") -> IsomorphismResult:
|
|
272
|
+
"""Test graph isomorphism against another CRN isomorphism wrapper.
|
|
273
|
+
|
|
274
|
+
A fast signature check is applied first. If signatures disagree, the
|
|
275
|
+
graphs are rejected immediately without invoking the exact VF2 matcher.
|
|
276
|
+
|
|
277
|
+
:param other:
|
|
278
|
+
Other graph wrapper to compare against.
|
|
279
|
+
:type other: CRNIsomorphism
|
|
280
|
+
|
|
281
|
+
:return:
|
|
282
|
+
Exact isomorphism result.
|
|
283
|
+
:rtype: IsomorphismResult
|
|
284
|
+
|
|
285
|
+
.. rubric:: Examples
|
|
286
|
+
|
|
287
|
+
.. code-block:: python
|
|
288
|
+
|
|
289
|
+
iso_a = CRNIsomorphism(crn_a)
|
|
290
|
+
iso_b = CRNIsomorphism(crn_b)
|
|
291
|
+
result = iso_a.isomorphic_to(iso_b)
|
|
292
|
+
print(result.isomorphic)
|
|
293
|
+
"""
|
|
294
|
+
start = perf_counter()
|
|
295
|
+
if (
|
|
296
|
+
self.graph_type != other.graph_type
|
|
297
|
+
or self._signature() != other._signature()
|
|
298
|
+
):
|
|
299
|
+
return self._result(False, None, start, True, "vf2")
|
|
300
|
+
|
|
301
|
+
gm = self._make_matcher(self.G, other.G)
|
|
302
|
+
ok = gm.is_isomorphic()
|
|
303
|
+
return self._result(
|
|
304
|
+
ok,
|
|
305
|
+
dict(gm.mapping) if ok else None,
|
|
306
|
+
start,
|
|
307
|
+
False,
|
|
308
|
+
"vf2",
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
def subgraph_isomorphic_to(self, host: "CRNIsomorphism") -> IsomorphismResult:
|
|
312
|
+
"""Test whether this graph is subgraph-isomorphic to a host graph.
|
|
313
|
+
|
|
314
|
+
This method checks whether ``self`` can be embedded into ``host`` using
|
|
315
|
+
directed VF2 subgraph matching.
|
|
316
|
+
|
|
317
|
+
:param host:
|
|
318
|
+
Host graph wrapper.
|
|
319
|
+
:type host: CRNIsomorphism
|
|
320
|
+
|
|
321
|
+
:return:
|
|
322
|
+
Subgraph isomorphism result.
|
|
323
|
+
:rtype: IsomorphismResult
|
|
324
|
+
|
|
325
|
+
.. rubric:: Examples
|
|
326
|
+
|
|
327
|
+
.. code-block:: python
|
|
328
|
+
|
|
329
|
+
pattern = CRNIsomorphism(pattern_crn)
|
|
330
|
+
host = CRNIsomorphism(host_crn)
|
|
331
|
+
result = pattern.subgraph_isomorphic_to(host)
|
|
332
|
+
print(result.isomorphic)
|
|
333
|
+
"""
|
|
334
|
+
start = perf_counter()
|
|
335
|
+
if self.graph_type != host.graph_type:
|
|
336
|
+
return self._result(False, None, start, True, "vf2-subgraph")
|
|
337
|
+
|
|
338
|
+
gm = self._make_matcher(host.G, self.G)
|
|
339
|
+
ok = gm.subgraph_is_isomorphic()
|
|
340
|
+
return self._result(
|
|
341
|
+
ok,
|
|
342
|
+
dict(gm.mapping) if ok else None,
|
|
343
|
+
start,
|
|
344
|
+
False,
|
|
345
|
+
"vf2-subgraph",
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def are_isomorphic(a: Any, b: Any, **kwargs: Any) -> bool:
|
|
350
|
+
"""Convenience wrapper for pairwise graph isomorphism.
|
|
351
|
+
|
|
352
|
+
:param a:
|
|
353
|
+
First graph-like source.
|
|
354
|
+
:type a: Any
|
|
355
|
+
|
|
356
|
+
:param b:
|
|
357
|
+
Second graph-like source.
|
|
358
|
+
:type b: Any
|
|
359
|
+
|
|
360
|
+
:param kwargs:
|
|
361
|
+
Additional keyword arguments forwarded to :class:`CRNIsomorphism`.
|
|
362
|
+
:type kwargs: Any
|
|
363
|
+
|
|
364
|
+
:return:
|
|
365
|
+
``True`` if the two inputs are isomorphic.
|
|
366
|
+
:rtype: bool
|
|
367
|
+
|
|
368
|
+
.. rubric:: Examples
|
|
369
|
+
|
|
370
|
+
.. code-block:: python
|
|
371
|
+
|
|
372
|
+
ok = are_isomorphic(crn_a, crn_b, include_rule=True)
|
|
373
|
+
print(ok)
|
|
374
|
+
"""
|
|
375
|
+
return (
|
|
376
|
+
CRNIsomorphism(a, **kwargs)
|
|
377
|
+
.isomorphic_to(CRNIsomorphism(b, **kwargs))
|
|
378
|
+
.isomorphic
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def are_subhypergraph_isomorphic(pattern: Any, host: Any, **kwargs: Any) -> bool:
|
|
383
|
+
"""Convenience wrapper for subgraph isomorphism.
|
|
384
|
+
|
|
385
|
+
:param pattern:
|
|
386
|
+
Pattern graph-like source.
|
|
387
|
+
:type pattern: Any
|
|
388
|
+
|
|
389
|
+
:param host:
|
|
390
|
+
Host graph-like source.
|
|
391
|
+
:type host: Any
|
|
392
|
+
|
|
393
|
+
:param kwargs:
|
|
394
|
+
Additional keyword arguments forwarded to :class:`CRNIsomorphism`.
|
|
395
|
+
:type kwargs: Any
|
|
396
|
+
|
|
397
|
+
:return:
|
|
398
|
+
``True`` if ``pattern`` is subgraph-isomorphic to ``host``.
|
|
399
|
+
:rtype: bool
|
|
400
|
+
|
|
401
|
+
.. rubric:: Examples
|
|
402
|
+
|
|
403
|
+
.. code-block:: python
|
|
404
|
+
|
|
405
|
+
ok = are_subhypergraph_isomorphic(pattern_crn, host_crn)
|
|
406
|
+
print(ok)
|
|
407
|
+
"""
|
|
408
|
+
return (
|
|
409
|
+
CRNIsomorphism(pattern, **kwargs)
|
|
410
|
+
.subgraph_isomorphic_to(CRNIsomorphism(host, **kwargs))
|
|
411
|
+
.isomorphic
|
|
412
|
+
)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Optional
|
|
4
|
+
|
|
5
|
+
from ._common import SymmetryConfig
|
|
6
|
+
from .automorphism import CRNAutomorphism
|
|
7
|
+
from .canon import CRNCanonicalizer
|
|
8
|
+
from .isomorphism import CRNIsomorphism
|
|
9
|
+
from .wl_canon import WLCanonicalizer
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CRNSymmetry:
|
|
13
|
+
"""Unified façade for WL, automorphism, canonicalization, and isomorphism."""
|
|
14
|
+
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
source: Any,
|
|
18
|
+
*,
|
|
19
|
+
include_rule: bool = True,
|
|
20
|
+
include_stoich: bool = True,
|
|
21
|
+
wl_iters: int = 20,
|
|
22
|
+
wl_digest_size: int = 16,
|
|
23
|
+
config: Optional[SymmetryConfig] = None,
|
|
24
|
+
) -> None:
|
|
25
|
+
self.config = config or SymmetryConfig.topological()
|
|
26
|
+
self.kwargs = dict(
|
|
27
|
+
include_rule=include_rule,
|
|
28
|
+
include_stoich=include_stoich,
|
|
29
|
+
wl_iters=wl_iters,
|
|
30
|
+
wl_digest_size=wl_digest_size,
|
|
31
|
+
config=self.config,
|
|
32
|
+
)
|
|
33
|
+
self.wl = WLCanonicalizer(
|
|
34
|
+
source,
|
|
35
|
+
n_iter=wl_iters,
|
|
36
|
+
digest_size=wl_digest_size,
|
|
37
|
+
include_rule=include_rule,
|
|
38
|
+
include_stoich=include_stoich,
|
|
39
|
+
config=self.config,
|
|
40
|
+
)
|
|
41
|
+
self.automorphism = CRNAutomorphism(source, **self.kwargs)
|
|
42
|
+
self.canonicalizer = CRNCanonicalizer(source, **self.kwargs)
|
|
43
|
+
self.isomorphism = CRNIsomorphism(source, **self.kwargs)
|
|
44
|
+
|
|
45
|
+
def wl_orbits(self):
|
|
46
|
+
return self.wl.orbits()
|
|
47
|
+
|
|
48
|
+
def orbits(self, **kwargs: Any):
|
|
49
|
+
return self.automorphism.orbits(**kwargs)
|
|
50
|
+
|
|
51
|
+
def has_nontrivial_automorphism(self, **kwargs: Any):
|
|
52
|
+
return self.automorphism.has_nontrivial_automorphism(**kwargs)
|
|
53
|
+
|
|
54
|
+
def automorphism_summary(self, **kwargs: Any):
|
|
55
|
+
return self.automorphism.summary(**kwargs)
|
|
56
|
+
|
|
57
|
+
def canonical_result(self, **kwargs: Any):
|
|
58
|
+
return self.canonicalizer.canonical_result(**kwargs)
|
|
59
|
+
|
|
60
|
+
def canonical_graph(self, **kwargs: Any):
|
|
61
|
+
return self.canonicalizer.canonical_graph(**kwargs)
|