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,472 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, Iterator, List, Optional, Set, Tuple
|
|
4
|
+
|
|
5
|
+
import networkx as nx
|
|
6
|
+
|
|
7
|
+
from ._common import AutomorphismResult, SymmetryConfig
|
|
8
|
+
from ._ir import IRCanonicalEngine
|
|
9
|
+
from .canon import CRNCanonicalizer
|
|
10
|
+
from .wl_canon import WLCanonicalizer
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CRNAutomorphism:
|
|
14
|
+
"""Exact automorphism analysis for a chemical reaction network graph.
|
|
15
|
+
|
|
16
|
+
This class provides a convenient public interface for exact automorphism
|
|
17
|
+
queries, orbit extraction, and quick nontrivial-symmetry checks. When
|
|
18
|
+
possible, it reuses an existing exact canonicalization engine so that
|
|
19
|
+
canonicalization and automorphism queries share the same cached search.
|
|
20
|
+
|
|
21
|
+
:param source:
|
|
22
|
+
Input source. This may be:
|
|
23
|
+
- a CRN-like object
|
|
24
|
+
- a NetworkX graph
|
|
25
|
+
- an existing :class:`CRNCanonicalizer`
|
|
26
|
+
- an existing :class:`IRCanonicalEngine`
|
|
27
|
+
:type source: Any
|
|
28
|
+
|
|
29
|
+
:param include_rule:
|
|
30
|
+
Whether rule/reaction nodes should be included when constructing the
|
|
31
|
+
internal graph representation.
|
|
32
|
+
:type include_rule: bool
|
|
33
|
+
|
|
34
|
+
:param include_stoich:
|
|
35
|
+
Whether stoichiometric information should be included in the internal
|
|
36
|
+
representation.
|
|
37
|
+
:type include_stoich: bool
|
|
38
|
+
|
|
39
|
+
:param wl_iters:
|
|
40
|
+
Maximum number of Weisfeiler-Lehman refinement iterations.
|
|
41
|
+
:type wl_iters: int
|
|
42
|
+
|
|
43
|
+
:param wl_digest_size:
|
|
44
|
+
Digest size used by the WL canonicalizer.
|
|
45
|
+
:type wl_digest_size: int
|
|
46
|
+
|
|
47
|
+
:param config:
|
|
48
|
+
Symmetry configuration controlling semantic versus topological matching.
|
|
49
|
+
If ``None``, :meth:`SymmetryConfig.semantic` is used.
|
|
50
|
+
:type config: Optional[SymmetryConfig]
|
|
51
|
+
|
|
52
|
+
.. rubric:: Notes
|
|
53
|
+
|
|
54
|
+
For best performance, construct a :class:`CRNCanonicalizer` first and pass
|
|
55
|
+
it here so canonicalization and automorphism queries reuse the same cached
|
|
56
|
+
exact search engine.
|
|
57
|
+
|
|
58
|
+
.. rubric:: Examples
|
|
59
|
+
|
|
60
|
+
.. code-block:: python
|
|
61
|
+
|
|
62
|
+
from synkit.CRN.Sym.auto import CRNAutomorphism
|
|
63
|
+
|
|
64
|
+
auto = CRNAutomorphism(crn)
|
|
65
|
+
print(auto.has_nontrivial_automorphism())
|
|
66
|
+
print(auto.orbits())
|
|
67
|
+
|
|
68
|
+
summary = auto.summary(max_count=50, timeout_sec=10.0)
|
|
69
|
+
print(summary.automorphism_count)
|
|
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 automorphism analyzer.
|
|
84
|
+
|
|
85
|
+
:param source:
|
|
86
|
+
Input source, canonicalizer, or exact IR engine.
|
|
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 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
|
+
Symmetry configuration. If omitted, semantic mode is used.
|
|
107
|
+
:type config: Optional[SymmetryConfig]
|
|
108
|
+
"""
|
|
109
|
+
self._native_source = source
|
|
110
|
+
self._native_options = (include_rule, include_stoich)
|
|
111
|
+
self.config, self.wl, self._engine = self._build_components(
|
|
112
|
+
source,
|
|
113
|
+
include_rule=include_rule,
|
|
114
|
+
include_stoich=include_stoich,
|
|
115
|
+
wl_iters=wl_iters,
|
|
116
|
+
wl_digest_size=wl_digest_size,
|
|
117
|
+
config=config,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
@staticmethod
|
|
121
|
+
def _build_from_canonicalizer(
|
|
122
|
+
source: CRNCanonicalizer,
|
|
123
|
+
) -> Tuple[SymmetryConfig, WLCanonicalizer, IRCanonicalEngine]:
|
|
124
|
+
"""Reuse components from an existing canonicalizer.
|
|
125
|
+
|
|
126
|
+
:param source:
|
|
127
|
+
Canonicalizer instance.
|
|
128
|
+
:type source: CRNCanonicalizer
|
|
129
|
+
|
|
130
|
+
:return:
|
|
131
|
+
Tuple ``(config, wl, engine)``.
|
|
132
|
+
:rtype: Tuple[SymmetryConfig, WLCanonicalizer, IRCanonicalEngine]
|
|
133
|
+
"""
|
|
134
|
+
return source.config, source.wl, source.engine
|
|
135
|
+
|
|
136
|
+
@staticmethod
|
|
137
|
+
def _build_from_engine(
|
|
138
|
+
source: IRCanonicalEngine,
|
|
139
|
+
) -> Tuple[SymmetryConfig, WLCanonicalizer, IRCanonicalEngine]:
|
|
140
|
+
"""Reuse components from an existing exact IR engine.
|
|
141
|
+
|
|
142
|
+
:param source:
|
|
143
|
+
Exact IR engine.
|
|
144
|
+
:type source: IRCanonicalEngine
|
|
145
|
+
|
|
146
|
+
:return:
|
|
147
|
+
Tuple ``(config, wl, engine)``.
|
|
148
|
+
:rtype: Tuple[SymmetryConfig, WLCanonicalizer, IRCanonicalEngine]
|
|
149
|
+
"""
|
|
150
|
+
return source.config, source.wl, source
|
|
151
|
+
|
|
152
|
+
@staticmethod
|
|
153
|
+
def _build_fresh(
|
|
154
|
+
source: Any,
|
|
155
|
+
*,
|
|
156
|
+
include_rule: bool,
|
|
157
|
+
include_stoich: bool,
|
|
158
|
+
wl_iters: int,
|
|
159
|
+
wl_digest_size: int,
|
|
160
|
+
config: Optional[SymmetryConfig],
|
|
161
|
+
) -> Tuple[SymmetryConfig, WLCanonicalizer, IRCanonicalEngine]:
|
|
162
|
+
"""Build fresh WL and exact IR components from a raw source object.
|
|
163
|
+
|
|
164
|
+
:param source:
|
|
165
|
+
Input source object.
|
|
166
|
+
:type source: Any
|
|
167
|
+
|
|
168
|
+
:param include_rule:
|
|
169
|
+
Whether rule/reaction nodes are included.
|
|
170
|
+
:type include_rule: bool
|
|
171
|
+
|
|
172
|
+
:param include_stoich:
|
|
173
|
+
Whether stoichiometric information should be included.
|
|
174
|
+
:type include_stoich: bool
|
|
175
|
+
|
|
176
|
+
:param wl_iters:
|
|
177
|
+
Maximum number of WL iterations.
|
|
178
|
+
:type wl_iters: int
|
|
179
|
+
|
|
180
|
+
:param wl_digest_size:
|
|
181
|
+
Digest size for WL hashing.
|
|
182
|
+
:type wl_digest_size: int
|
|
183
|
+
|
|
184
|
+
:param config:
|
|
185
|
+
Optional symmetry configuration.
|
|
186
|
+
:type config: Optional[SymmetryConfig]
|
|
187
|
+
|
|
188
|
+
:return:
|
|
189
|
+
Tuple ``(config, wl, engine)``.
|
|
190
|
+
:rtype: Tuple[SymmetryConfig, WLCanonicalizer, IRCanonicalEngine]
|
|
191
|
+
"""
|
|
192
|
+
cfg = config or SymmetryConfig.topological()
|
|
193
|
+
wl = WLCanonicalizer(
|
|
194
|
+
source,
|
|
195
|
+
include_rule=include_rule,
|
|
196
|
+
include_stoich=include_stoich,
|
|
197
|
+
n_iter=wl_iters,
|
|
198
|
+
digest_size=wl_digest_size,
|
|
199
|
+
config=cfg,
|
|
200
|
+
)
|
|
201
|
+
engine = IRCanonicalEngine(
|
|
202
|
+
source,
|
|
203
|
+
include_rule=include_rule,
|
|
204
|
+
include_stoich=include_stoich,
|
|
205
|
+
wl_iters=wl_iters,
|
|
206
|
+
wl_digest_size=wl_digest_size,
|
|
207
|
+
config=cfg,
|
|
208
|
+
)
|
|
209
|
+
return cfg, wl, engine
|
|
210
|
+
|
|
211
|
+
@classmethod
|
|
212
|
+
def _build_components(
|
|
213
|
+
cls,
|
|
214
|
+
source: Any,
|
|
215
|
+
*,
|
|
216
|
+
include_rule: bool,
|
|
217
|
+
include_stoich: bool,
|
|
218
|
+
wl_iters: int,
|
|
219
|
+
wl_digest_size: int,
|
|
220
|
+
config: Optional[SymmetryConfig],
|
|
221
|
+
) -> Tuple[SymmetryConfig, WLCanonicalizer, IRCanonicalEngine]:
|
|
222
|
+
"""Build or reuse the internal symmetry-analysis components.
|
|
223
|
+
|
|
224
|
+
:param source:
|
|
225
|
+
Input source, canonicalizer, or engine.
|
|
226
|
+
:type source: Any
|
|
227
|
+
|
|
228
|
+
:param include_rule:
|
|
229
|
+
Whether rule/reaction nodes are included.
|
|
230
|
+
:type include_rule: bool
|
|
231
|
+
|
|
232
|
+
:param include_stoich:
|
|
233
|
+
Whether stoichiometric information should be included.
|
|
234
|
+
:type include_stoich: bool
|
|
235
|
+
|
|
236
|
+
:param wl_iters:
|
|
237
|
+
Maximum number of WL iterations.
|
|
238
|
+
:type wl_iters: int
|
|
239
|
+
|
|
240
|
+
:param wl_digest_size:
|
|
241
|
+
Digest size for WL hashing.
|
|
242
|
+
:type wl_digest_size: int
|
|
243
|
+
|
|
244
|
+
:param config:
|
|
245
|
+
Optional symmetry configuration.
|
|
246
|
+
:type config: Optional[SymmetryConfig]
|
|
247
|
+
|
|
248
|
+
:return:
|
|
249
|
+
Tuple ``(config, wl, engine)``.
|
|
250
|
+
:rtype: Tuple[SymmetryConfig, WLCanonicalizer, IRCanonicalEngine]
|
|
251
|
+
"""
|
|
252
|
+
if isinstance(source, CRNCanonicalizer):
|
|
253
|
+
return cls._build_from_canonicalizer(source)
|
|
254
|
+
if isinstance(source, IRCanonicalEngine):
|
|
255
|
+
return cls._build_from_engine(source)
|
|
256
|
+
return cls._build_fresh(
|
|
257
|
+
source,
|
|
258
|
+
include_rule=include_rule,
|
|
259
|
+
include_stoich=include_stoich,
|
|
260
|
+
wl_iters=wl_iters,
|
|
261
|
+
wl_digest_size=wl_digest_size,
|
|
262
|
+
config=config,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
@property
|
|
266
|
+
def G(self) -> nx.DiGraph:
|
|
267
|
+
"""Return the internal directed graph used for analysis.
|
|
268
|
+
|
|
269
|
+
:return:
|
|
270
|
+
Internal directed graph.
|
|
271
|
+
:rtype: nx.DiGraph
|
|
272
|
+
"""
|
|
273
|
+
return self._engine.G
|
|
274
|
+
|
|
275
|
+
@property
|
|
276
|
+
def graph_type(self) -> str:
|
|
277
|
+
"""Return the graph type label.
|
|
278
|
+
|
|
279
|
+
:return:
|
|
280
|
+
Graph type string.
|
|
281
|
+
:rtype: str
|
|
282
|
+
"""
|
|
283
|
+
return self._engine.graph_type
|
|
284
|
+
|
|
285
|
+
def automorphisms_iter(
|
|
286
|
+
self,
|
|
287
|
+
*,
|
|
288
|
+
max_count: Optional[int] = None,
|
|
289
|
+
timeout_sec: Optional[float] = None,
|
|
290
|
+
) -> Iterator[Dict[Any, Any]]:
|
|
291
|
+
"""Iterate over sampled automorphism mappings.
|
|
292
|
+
|
|
293
|
+
This method delegates to the exact IR engine and yields the sampled
|
|
294
|
+
automorphism mappings that were collected during the search.
|
|
295
|
+
|
|
296
|
+
:param max_count:
|
|
297
|
+
Optional maximum number of mappings to collect.
|
|
298
|
+
:type max_count: Optional[int]
|
|
299
|
+
|
|
300
|
+
:param timeout_sec:
|
|
301
|
+
Optional timeout in seconds.
|
|
302
|
+
:type timeout_sec: Optional[float]
|
|
303
|
+
|
|
304
|
+
:yield:
|
|
305
|
+
Automorphism mappings as ``node -> node`` dictionaries.
|
|
306
|
+
:rtype: Iterator[Dict[Any, Any]]
|
|
307
|
+
|
|
308
|
+
.. rubric:: Examples
|
|
309
|
+
|
|
310
|
+
.. code-block:: python
|
|
311
|
+
|
|
312
|
+
auto = CRNAutomorphism(crn)
|
|
313
|
+
for mapping in auto.automorphisms_iter(max_count=5):
|
|
314
|
+
print(mapping)
|
|
315
|
+
"""
|
|
316
|
+
res = self._engine.run(max_count=max_count, timeout_sec=timeout_sec)
|
|
317
|
+
for m in res.sample_mappings:
|
|
318
|
+
yield dict(m)
|
|
319
|
+
|
|
320
|
+
def has_nontrivial_automorphism(
|
|
321
|
+
self, *, timeout_sec: Optional[float] = 5.0
|
|
322
|
+
) -> bool:
|
|
323
|
+
"""Check whether the graph has a nontrivial automorphism.
|
|
324
|
+
|
|
325
|
+
A fast WL-based orbit test is used first. If WL leaves no ambiguous
|
|
326
|
+
cells, the graph is treated as having no nontrivial automorphism.
|
|
327
|
+
Otherwise, an exact search is run and stopped after two equivalent
|
|
328
|
+
automorphisms are found.
|
|
329
|
+
|
|
330
|
+
:param timeout_sec:
|
|
331
|
+
Optional timeout in seconds for the exact fallback check.
|
|
332
|
+
:type timeout_sec: Optional[float]
|
|
333
|
+
|
|
334
|
+
:return:
|
|
335
|
+
``True`` if a nontrivial automorphism exists.
|
|
336
|
+
:rtype: bool
|
|
337
|
+
"""
|
|
338
|
+
if all(len(cell) == 1 for cell in self.wl.orbits()):
|
|
339
|
+
return False
|
|
340
|
+
res = self._engine.run(
|
|
341
|
+
max_count=2, timeout_sec=timeout_sec, stop_after_two=True
|
|
342
|
+
)
|
|
343
|
+
return res.automorphism_count > 1
|
|
344
|
+
|
|
345
|
+
def summary(
|
|
346
|
+
self,
|
|
347
|
+
*,
|
|
348
|
+
max_count: int = 100,
|
|
349
|
+
timeout_sec: Optional[float] = 5.0,
|
|
350
|
+
) -> AutomorphismResult:
|
|
351
|
+
"""Compute an automorphism summary.
|
|
352
|
+
|
|
353
|
+
:param max_count:
|
|
354
|
+
Maximum number of sampled mappings to retain.
|
|
355
|
+
:type max_count: int
|
|
356
|
+
|
|
357
|
+
:param timeout_sec:
|
|
358
|
+
Optional timeout in seconds.
|
|
359
|
+
:type timeout_sec: Optional[float]
|
|
360
|
+
|
|
361
|
+
:return:
|
|
362
|
+
Automorphism summary result.
|
|
363
|
+
:rtype: AutomorphismResult
|
|
364
|
+
"""
|
|
365
|
+
from ..backend import resolve_backend
|
|
366
|
+
|
|
367
|
+
backend, library = resolve_backend()
|
|
368
|
+
if backend == "cpp":
|
|
369
|
+
from ..native_analysis import graph_symmetry, NativeSearchLimit
|
|
370
|
+
from time import monotonic
|
|
371
|
+
|
|
372
|
+
if self.config != SymmetryConfig.topological() or not all(
|
|
373
|
+
self._native_options
|
|
374
|
+
):
|
|
375
|
+
raise NotImplementedError(
|
|
376
|
+
"Native automorphisms currently require topological semantics"
|
|
377
|
+
)
|
|
378
|
+
started = monotonic()
|
|
379
|
+
result = graph_symmetry(
|
|
380
|
+
self._native_source,
|
|
381
|
+
library_path=library,
|
|
382
|
+
time_limit=30.0 if timeout_sec is None else timeout_sec,
|
|
383
|
+
max_count=max_count,
|
|
384
|
+
)
|
|
385
|
+
if not result.complete:
|
|
386
|
+
raise NativeSearchLimit(result)
|
|
387
|
+
return AutomorphismResult(
|
|
388
|
+
graph_type="native_topological",
|
|
389
|
+
automorphism_count=result.value["automorphism_count"],
|
|
390
|
+
sample_mappings=[],
|
|
391
|
+
orbits=[set(group) for group in result.value["orbits"]],
|
|
392
|
+
elapsed_seconds=monotonic() - started,
|
|
393
|
+
stopped_early=False,
|
|
394
|
+
)
|
|
395
|
+
return self._engine.automorphism_result(
|
|
396
|
+
max_count=max_count, timeout_sec=timeout_sec
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
def orbits(
|
|
400
|
+
self,
|
|
401
|
+
*,
|
|
402
|
+
max_count: int = 1000,
|
|
403
|
+
timeout_sec: Optional[float] = 5.0,
|
|
404
|
+
) -> List[Set[Any]]:
|
|
405
|
+
"""Compute orbit classes from sampled automorphisms.
|
|
406
|
+
|
|
407
|
+
:param max_count:
|
|
408
|
+
Maximum number of sampled mappings to retain.
|
|
409
|
+
:type max_count: int
|
|
410
|
+
|
|
411
|
+
:param timeout_sec:
|
|
412
|
+
Optional timeout in seconds.
|
|
413
|
+
:type timeout_sec: Optional[float]
|
|
414
|
+
|
|
415
|
+
:return:
|
|
416
|
+
Orbit partition induced by the sampled automorphisms.
|
|
417
|
+
:rtype: List[Set[Any]]
|
|
418
|
+
"""
|
|
419
|
+
return self.summary(max_count=max_count, timeout_sec=timeout_sec).orbits
|
|
420
|
+
|
|
421
|
+
def wl_orbits(self) -> List[Set[Any]]:
|
|
422
|
+
"""Return approximate WL color-class orbits.
|
|
423
|
+
|
|
424
|
+
These are faster but weaker than exact automorphism orbits.
|
|
425
|
+
|
|
426
|
+
:return:
|
|
427
|
+
WL-based orbit partition.
|
|
428
|
+
:rtype: List[Set[Any]]
|
|
429
|
+
"""
|
|
430
|
+
return self.wl.orbits()
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def detect_automorphisms(
|
|
434
|
+
source: Any,
|
|
435
|
+
*,
|
|
436
|
+
max_count: int = 100,
|
|
437
|
+
timeout_sec: Optional[float] = 5.0,
|
|
438
|
+
**kwargs: Any,
|
|
439
|
+
) -> AutomorphismResult:
|
|
440
|
+
"""Convenience wrapper for automorphism detection.
|
|
441
|
+
|
|
442
|
+
:param source:
|
|
443
|
+
Input source, canonicalizer, or engine.
|
|
444
|
+
:type source: Any
|
|
445
|
+
|
|
446
|
+
:param max_count:
|
|
447
|
+
Maximum number of sampled mappings to retain.
|
|
448
|
+
:type max_count: int
|
|
449
|
+
|
|
450
|
+
:param timeout_sec:
|
|
451
|
+
Optional timeout in seconds.
|
|
452
|
+
:type timeout_sec: Optional[float]
|
|
453
|
+
|
|
454
|
+
:param kwargs:
|
|
455
|
+
Additional keyword arguments forwarded to :class:`CRNAutomorphism`.
|
|
456
|
+
:type kwargs: Any
|
|
457
|
+
|
|
458
|
+
:return:
|
|
459
|
+
Automorphism summary result.
|
|
460
|
+
:rtype: AutomorphismResult
|
|
461
|
+
|
|
462
|
+
.. rubric:: Examples
|
|
463
|
+
|
|
464
|
+
.. code-block:: python
|
|
465
|
+
|
|
466
|
+
result = detect_automorphisms(crn, max_count=50, timeout_sec=10.0)
|
|
467
|
+
print(result.automorphism_count)
|
|
468
|
+
print(result.orbits)
|
|
469
|
+
"""
|
|
470
|
+
return CRNAutomorphism(source, **kwargs).summary(
|
|
471
|
+
max_count=max_count, timeout_sec=timeout_sec
|
|
472
|
+
)
|