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,500 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections import deque
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Dict, Iterable, List, Mapping, Optional, Set, Tuple
|
|
6
|
+
|
|
7
|
+
from ._adapter import tokenize_syncrn_incidence
|
|
8
|
+
from .realizability import PathwayRealizability
|
|
9
|
+
|
|
10
|
+
Multiset = Dict[str, int]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class PathFinderConfig:
|
|
15
|
+
"""
|
|
16
|
+
Configuration for qualitative pathway search.
|
|
17
|
+
|
|
18
|
+
This configuration controls the breadth-first search over qualitative
|
|
19
|
+
set-semantics states.
|
|
20
|
+
|
|
21
|
+
:param max_depth:
|
|
22
|
+
Maximum number of reaction firings allowed in a candidate pathway.
|
|
23
|
+
:type max_depth: int
|
|
24
|
+
:param max_paths:
|
|
25
|
+
Maximum number of pathway candidates to return.
|
|
26
|
+
:type max_paths: int
|
|
27
|
+
:param stop_after_first:
|
|
28
|
+
Whether to stop the search immediately after the first accepted
|
|
29
|
+
candidate is found.
|
|
30
|
+
:type stop_after_first: bool
|
|
31
|
+
:param deduplicate_by_flow:
|
|
32
|
+
Whether to deduplicate candidates by their reaction-count flow vector
|
|
33
|
+
rather than retaining multiple sequences with the same aggregate flow.
|
|
34
|
+
:type deduplicate_by_flow: bool
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
max_depth: int = 12
|
|
38
|
+
max_paths: int = 20
|
|
39
|
+
stop_after_first: bool = False
|
|
40
|
+
deduplicate_by_flow: bool = True
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class PathwayCandidate:
|
|
45
|
+
"""
|
|
46
|
+
One qualitative pathway candidate returned by :class:`PathwayFinder`.
|
|
47
|
+
|
|
48
|
+
A candidate stores both the ordered reaction sequence used during
|
|
49
|
+
qualitative search and the corresponding aggregated reaction-count flow.
|
|
50
|
+
|
|
51
|
+
:param reactions: Ordered list of reaction ids in the candidate sequence.
|
|
52
|
+
:type reactions: List[str]
|
|
53
|
+
:param flow:
|
|
54
|
+
Aggregated reaction firing counts derived from ``reactions``.
|
|
55
|
+
:type flow: Dict[str, int]
|
|
56
|
+
:param reached_species:
|
|
57
|
+
Sorted list of species reachable after firing the candidate sequence in
|
|
58
|
+
qualitative set semantics.
|
|
59
|
+
:type reached_species: List[str]
|
|
60
|
+
:param depth: Length of the reaction sequence.
|
|
61
|
+
:type depth: int
|
|
62
|
+
:param realizable:
|
|
63
|
+
Optional exact realizability verdict computed afterwards from Petri-net
|
|
64
|
+
semantics.
|
|
65
|
+
:type realizable: Optional[bool]
|
|
66
|
+
:param certificate:
|
|
67
|
+
Optional firing certificate returned by exact realizability checking.
|
|
68
|
+
:type certificate: Optional[List[str]]
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
reactions: List[str]
|
|
72
|
+
flow: Dict[str, int]
|
|
73
|
+
reached_species: List[str]
|
|
74
|
+
depth: int
|
|
75
|
+
realizable: Optional[bool] = None
|
|
76
|
+
certificate: Optional[List[str]] = None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class PathwayFinder:
|
|
80
|
+
"""
|
|
81
|
+
Qualitative source-to-target pathway search for SynCRN-like inputs.
|
|
82
|
+
|
|
83
|
+
This class searches in set semantics: a reaction is usable once all its
|
|
84
|
+
reactant species are present in the current available set, and firing it
|
|
85
|
+
adds its product species to that set.
|
|
86
|
+
|
|
87
|
+
Species are not consumed during the qualitative search. Exact
|
|
88
|
+
stoichiometric and token-based validation can be applied afterwards using
|
|
89
|
+
:meth:`validate_candidates`.
|
|
90
|
+
|
|
91
|
+
This is the *network* path finder and the one to use for CRN work. The
|
|
92
|
+
unrelated :class:`synkit.Synthesis.MSR.path_finder.PathFinder` searches
|
|
93
|
+
synthesis routes through rounds of reaction SMILES and knows nothing about
|
|
94
|
+
stoichiometry or markings.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
def __init__(self, config: Optional[PathFinderConfig] = None) -> None:
|
|
98
|
+
"""
|
|
99
|
+
Initialize an empty pathway finder.
|
|
100
|
+
|
|
101
|
+
:param config:
|
|
102
|
+
Optional search configuration. If omitted, default configuration is
|
|
103
|
+
used.
|
|
104
|
+
:type config: Optional[PathFinderConfig]
|
|
105
|
+
"""
|
|
106
|
+
self.vertices: Set[str] = set()
|
|
107
|
+
self.edges: Dict[str, Tuple[Multiset, Multiset]] = {}
|
|
108
|
+
self.species_token_to_id: Dict[str, str] = {}
|
|
109
|
+
self.reaction_token_to_id: Dict[str, str] = {}
|
|
110
|
+
self.species_id_to_token: Dict[str, str] = {}
|
|
111
|
+
self.reaction_id_to_token: Dict[str, str] = {}
|
|
112
|
+
self._config = config or PathFinderConfig()
|
|
113
|
+
|
|
114
|
+
# ------------------------------------------------------------------
|
|
115
|
+
# loading
|
|
116
|
+
# ------------------------------------------------------------------
|
|
117
|
+
|
|
118
|
+
def load_hypergraph(
|
|
119
|
+
self,
|
|
120
|
+
vertices: Iterable[str],
|
|
121
|
+
edges: Mapping[str, Tuple[Mapping[str, int], Mapping[str, int]]],
|
|
122
|
+
) -> "PathwayFinder":
|
|
123
|
+
"""Load a qualitative reaction hypergraph directly.
|
|
124
|
+
|
|
125
|
+
The hypergraph is represented by a set of species vertices and a mapping
|
|
126
|
+
from reaction ids to ``(tail, head)`` multisets, where ``tail`` is the
|
|
127
|
+
reactant side and ``head`` is the product side.
|
|
128
|
+
|
|
129
|
+
:param vertices: Species identifiers in the hypergraph.
|
|
130
|
+
:type vertices: Iterable[str]
|
|
131
|
+
:param edges:
|
|
132
|
+
Mapping from reaction id to a pair ``(tail, head)`` of multisets.
|
|
133
|
+
Coefficients less than or equal to zero are ignored.
|
|
134
|
+
:type edges: Mapping[str, Tuple[Mapping[str, int], Mapping[str, int]]]
|
|
135
|
+
:return: The current finder instance.
|
|
136
|
+
:rtype: PathwayFinder
|
|
137
|
+
"""
|
|
138
|
+
self.vertices = {str(v) for v in vertices}
|
|
139
|
+
self.edges = {
|
|
140
|
+
str(eid): (
|
|
141
|
+
{str(s): int(v) for s, v in tail.items() if int(v) > 0},
|
|
142
|
+
{str(s): int(v) for s, v in head.items() if int(v) > 0},
|
|
143
|
+
)
|
|
144
|
+
for eid, (tail, head) in edges.items()
|
|
145
|
+
}
|
|
146
|
+
self.species_token_to_id = {v: v for v in self.vertices}
|
|
147
|
+
self.reaction_token_to_id = {eid: eid for eid in self.edges}
|
|
148
|
+
self.species_id_to_token = {v: v for v in self.vertices}
|
|
149
|
+
self.reaction_id_to_token = {eid: eid for eid in self.edges}
|
|
150
|
+
return self
|
|
151
|
+
|
|
152
|
+
def load_syncrn(
|
|
153
|
+
self,
|
|
154
|
+
crn: object,
|
|
155
|
+
*,
|
|
156
|
+
species: str = "label",
|
|
157
|
+
reaction: str = "id",
|
|
158
|
+
) -> "PathwayFinder":
|
|
159
|
+
"""Load a SynCRN-like object through its incidence representation.
|
|
160
|
+
|
|
161
|
+
The CRN is tokenized into species and reaction identifiers suitable for
|
|
162
|
+
qualitative search.
|
|
163
|
+
|
|
164
|
+
:param crn: SynCRN-like object to load.
|
|
165
|
+
:type crn: object
|
|
166
|
+
:param species:
|
|
167
|
+
Species naming mode passed to the tokenizer, for example
|
|
168
|
+
``"label"`` or ``"id"``.
|
|
169
|
+
:type species: str
|
|
170
|
+
:param reaction:
|
|
171
|
+
Reaction naming mode passed to the tokenizer, for example
|
|
172
|
+
``"id"`` or another supported tokenization key.
|
|
173
|
+
:type reaction: str
|
|
174
|
+
:return: The current finder instance.
|
|
175
|
+
:rtype: PathwayFinder
|
|
176
|
+
"""
|
|
177
|
+
vertices, edges, species_token_to_id, reaction_token_to_id, _ = (
|
|
178
|
+
tokenize_syncrn_incidence(
|
|
179
|
+
crn,
|
|
180
|
+
species=species,
|
|
181
|
+
reaction=reaction,
|
|
182
|
+
)
|
|
183
|
+
)
|
|
184
|
+
self.load_hypergraph(vertices, edges)
|
|
185
|
+
self.species_token_to_id = species_token_to_id
|
|
186
|
+
self.reaction_token_to_id = reaction_token_to_id
|
|
187
|
+
self.species_id_to_token = {
|
|
188
|
+
sid: tok for tok, sid in species_token_to_id.items()
|
|
189
|
+
}
|
|
190
|
+
self.reaction_id_to_token = {
|
|
191
|
+
rid: tok for tok, rid in reaction_token_to_id.items()
|
|
192
|
+
}
|
|
193
|
+
return self
|
|
194
|
+
|
|
195
|
+
# ------------------------------------------------------------------
|
|
196
|
+
# helpers
|
|
197
|
+
# ------------------------------------------------------------------
|
|
198
|
+
|
|
199
|
+
@staticmethod
|
|
200
|
+
def _clean_species(items: Iterable[str]) -> Set[str]:
|
|
201
|
+
"""Normalize a species iterable into a set of string identifiers.
|
|
202
|
+
|
|
203
|
+
:param items: Input species collection.
|
|
204
|
+
:type items: Iterable[str]
|
|
205
|
+
:return: Normalized species-id set.
|
|
206
|
+
:rtype: Set[str]
|
|
207
|
+
"""
|
|
208
|
+
return {str(x) for x in items}
|
|
209
|
+
|
|
210
|
+
def _enabled_reactions(self, available: Set[str]) -> List[str]:
|
|
211
|
+
"""Return reactions enabled under qualitative set semantics.
|
|
212
|
+
|
|
213
|
+
A reaction is enabled when all species appearing on its reactant side
|
|
214
|
+
are already present in ``available``.
|
|
215
|
+
|
|
216
|
+
:param available: Currently available species set.
|
|
217
|
+
:type available: Set[str]
|
|
218
|
+
:return: Sorted list of enabled reaction ids.
|
|
219
|
+
:rtype: List[str]
|
|
220
|
+
"""
|
|
221
|
+
enabled: List[str] = []
|
|
222
|
+
for eid, (tail, _) in self.edges.items():
|
|
223
|
+
if set(tail.keys()).issubset(available):
|
|
224
|
+
enabled.append(eid)
|
|
225
|
+
return sorted(enabled)
|
|
226
|
+
|
|
227
|
+
@staticmethod
|
|
228
|
+
def _flow_from_sequence(seq: List[str]) -> Dict[str, int]:
|
|
229
|
+
"""Convert a reaction sequence into an aggregated flow vector.
|
|
230
|
+
|
|
231
|
+
:param seq: Ordered reaction sequence.
|
|
232
|
+
:type seq: List[str]
|
|
233
|
+
:return: Mapping from reaction id to firing count.
|
|
234
|
+
:rtype: Dict[str, int]
|
|
235
|
+
"""
|
|
236
|
+
flow: Dict[str, int] = {}
|
|
237
|
+
for tid in seq:
|
|
238
|
+
flow[tid] = flow.get(tid, 0) + 1
|
|
239
|
+
return flow
|
|
240
|
+
|
|
241
|
+
# ------------------------------------------------------------------
|
|
242
|
+
# search
|
|
243
|
+
# ------------------------------------------------------------------
|
|
244
|
+
|
|
245
|
+
def find_paths_set(
|
|
246
|
+
self,
|
|
247
|
+
*,
|
|
248
|
+
source_species: Iterable[str],
|
|
249
|
+
target_species: Iterable[str],
|
|
250
|
+
max_depth: Optional[int] = None,
|
|
251
|
+
max_paths: Optional[int] = None,
|
|
252
|
+
stop_after_first: Optional[bool] = None,
|
|
253
|
+
deduplicate_by_flow: Optional[bool] = None,
|
|
254
|
+
) -> List[PathwayCandidate]:
|
|
255
|
+
"""Find qualitative source-to-target pathways using set semantics.
|
|
256
|
+
|
|
257
|
+
The search is performed by breadth-first expansion over reachable
|
|
258
|
+
species sets. At each step, enabled reactions add their product species
|
|
259
|
+
to the current set without consuming reactants.
|
|
260
|
+
|
|
261
|
+
:param source_species:
|
|
262
|
+
Initial source species assumed to be present.
|
|
263
|
+
:type source_species: Iterable[str]
|
|
264
|
+
:param target_species:
|
|
265
|
+
Target species that must all be contained in the reached set.
|
|
266
|
+
:type target_species: Iterable[str]
|
|
267
|
+
:param max_depth:
|
|
268
|
+
Optional override for maximum search depth. If ``None``, the value
|
|
269
|
+
from the configuration is used.
|
|
270
|
+
:type max_depth: Optional[int]
|
|
271
|
+
:param max_paths:
|
|
272
|
+
Optional override for maximum number of returned candidates. If
|
|
273
|
+
``None``, the value from the configuration is used.
|
|
274
|
+
:type max_paths: Optional[int]
|
|
275
|
+
:param stop_after_first:
|
|
276
|
+
Optional override controlling whether to stop after the first
|
|
277
|
+
accepted candidate.
|
|
278
|
+
:type stop_after_first: Optional[bool]
|
|
279
|
+
:param deduplicate_by_flow:
|
|
280
|
+
Optional override controlling whether candidates are deduplicated by
|
|
281
|
+
aggregate flow.
|
|
282
|
+
:type deduplicate_by_flow: Optional[bool]
|
|
283
|
+
:return:
|
|
284
|
+
List of qualitative pathway candidates satisfying the target
|
|
285
|
+
condition.
|
|
286
|
+
:rtype: List[PathwayCandidate]
|
|
287
|
+
:raises RuntimeError:
|
|
288
|
+
If no network has been loaded.
|
|
289
|
+
:raises ValueError:
|
|
290
|
+
If ``target_species`` is empty.
|
|
291
|
+
"""
|
|
292
|
+
if not self.edges:
|
|
293
|
+
raise RuntimeError(
|
|
294
|
+
"No network loaded; call load_syncrn() or load_hypergraph()."
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
max_depth = self._config.max_depth if max_depth is None else max_depth
|
|
298
|
+
max_paths = self._config.max_paths if max_paths is None else max_paths
|
|
299
|
+
stop_after_first = (
|
|
300
|
+
self._config.stop_after_first
|
|
301
|
+
if stop_after_first is None
|
|
302
|
+
else stop_after_first
|
|
303
|
+
)
|
|
304
|
+
deduplicate_by_flow = (
|
|
305
|
+
self._config.deduplicate_by_flow
|
|
306
|
+
if deduplicate_by_flow is None
|
|
307
|
+
else deduplicate_by_flow
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
source = self._clean_species(source_species)
|
|
311
|
+
target = self._clean_species(target_species)
|
|
312
|
+
if not target:
|
|
313
|
+
raise ValueError("target_species must not be empty")
|
|
314
|
+
|
|
315
|
+
results: List[PathwayCandidate] = []
|
|
316
|
+
seen_flow_keys: Set[Tuple[Tuple[str, int], ...]] = set()
|
|
317
|
+
best_depth_by_state: Dict[Tuple[str, ...], int] = {tuple(sorted(source)): 0}
|
|
318
|
+
|
|
319
|
+
q: deque[Tuple[Set[str], List[str]]] = deque([(set(source), [])])
|
|
320
|
+
|
|
321
|
+
while q and len(results) < max_paths:
|
|
322
|
+
available, seq = q.popleft()
|
|
323
|
+
depth = len(seq)
|
|
324
|
+
|
|
325
|
+
if target.issubset(available):
|
|
326
|
+
flow = self._flow_from_sequence(seq)
|
|
327
|
+
flow_key = tuple(sorted(flow.items()))
|
|
328
|
+
if (not deduplicate_by_flow) or (flow_key not in seen_flow_keys):
|
|
329
|
+
results.append(
|
|
330
|
+
PathwayCandidate(
|
|
331
|
+
reactions=list(seq),
|
|
332
|
+
flow=flow,
|
|
333
|
+
reached_species=sorted(available),
|
|
334
|
+
depth=depth,
|
|
335
|
+
)
|
|
336
|
+
)
|
|
337
|
+
seen_flow_keys.add(flow_key)
|
|
338
|
+
if stop_after_first:
|
|
339
|
+
break
|
|
340
|
+
continue
|
|
341
|
+
|
|
342
|
+
if depth >= max_depth:
|
|
343
|
+
continue
|
|
344
|
+
|
|
345
|
+
for eid in self._enabled_reactions(available):
|
|
346
|
+
_, head = self.edges[eid]
|
|
347
|
+
produced = set(head.keys())
|
|
348
|
+
if not produced - available:
|
|
349
|
+
continue
|
|
350
|
+
new_available = set(available) | produced
|
|
351
|
+
state_key = tuple(sorted(new_available))
|
|
352
|
+
new_depth = depth + 1
|
|
353
|
+
old_best = best_depth_by_state.get(state_key)
|
|
354
|
+
if old_best is not None and new_depth > old_best:
|
|
355
|
+
continue
|
|
356
|
+
best_depth_by_state[state_key] = new_depth
|
|
357
|
+
q.append((new_available, seq + [eid]))
|
|
358
|
+
|
|
359
|
+
return results
|
|
360
|
+
|
|
361
|
+
def validate_candidates(
|
|
362
|
+
self,
|
|
363
|
+
crn: object,
|
|
364
|
+
candidates: List[PathwayCandidate],
|
|
365
|
+
*,
|
|
366
|
+
initial_marking: Mapping[str, int],
|
|
367
|
+
species: str = "label",
|
|
368
|
+
reaction: str = "id",
|
|
369
|
+
) -> List[PathwayCandidate]:
|
|
370
|
+
"""Validate qualitative candidates by exact Petri-net realizability.
|
|
371
|
+
|
|
372
|
+
For each candidate, the aggregated reaction-count flow is checked using
|
|
373
|
+
:class:`PathwayRealizability`. The returned candidates preserve the
|
|
374
|
+
original qualitative information and add realizability metadata.
|
|
375
|
+
|
|
376
|
+
:param crn: SynCRN-like object used for exact validation.
|
|
377
|
+
:type crn: object
|
|
378
|
+
:param candidates: Qualitative candidates to validate.
|
|
379
|
+
:type candidates: List[PathwayCandidate]
|
|
380
|
+
:param initial_marking:
|
|
381
|
+
Initial place marking used for exact realizability checking.
|
|
382
|
+
:type initial_marking: Mapping[str, int]
|
|
383
|
+
:param species:
|
|
384
|
+
Species naming mode passed through to
|
|
385
|
+
:meth:`PathwayRealizability.load_syncrn_and_flow`.
|
|
386
|
+
:type species: str
|
|
387
|
+
:param reaction:
|
|
388
|
+
Reaction naming mode passed through to
|
|
389
|
+
:meth:`PathwayRealizability.load_syncrn_and_flow`.
|
|
390
|
+
:type reaction: str
|
|
391
|
+
:return:
|
|
392
|
+
New list of candidates augmented with realizability verdicts and
|
|
393
|
+
certificates.
|
|
394
|
+
:rtype: List[PathwayCandidate]
|
|
395
|
+
"""
|
|
396
|
+
out: List[PathwayCandidate] = []
|
|
397
|
+
for cand in candidates:
|
|
398
|
+
pr = PathwayRealizability().load_syncrn_and_flow(
|
|
399
|
+
crn,
|
|
400
|
+
flow=cand.flow,
|
|
401
|
+
initial_marking=initial_marking,
|
|
402
|
+
species=species,
|
|
403
|
+
reaction=reaction,
|
|
404
|
+
)
|
|
405
|
+
pr.build_petri_net_from_flow()
|
|
406
|
+
ok, cert = pr.is_realizable()
|
|
407
|
+
out.append(
|
|
408
|
+
PathwayCandidate(
|
|
409
|
+
reactions=list(cand.reactions),
|
|
410
|
+
flow=dict(cand.flow),
|
|
411
|
+
reached_species=list(cand.reached_species),
|
|
412
|
+
depth=cand.depth,
|
|
413
|
+
realizable=ok,
|
|
414
|
+
certificate=None if cert is None else list(cert),
|
|
415
|
+
)
|
|
416
|
+
)
|
|
417
|
+
return out
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def run_pathfinder_from_syncrn(
|
|
421
|
+
crn: object,
|
|
422
|
+
*,
|
|
423
|
+
source_species: Iterable[str],
|
|
424
|
+
target_species: Iterable[str],
|
|
425
|
+
initial_marking: Optional[Mapping[str, int]] = None,
|
|
426
|
+
species: str = "label",
|
|
427
|
+
reaction: str = "id",
|
|
428
|
+
max_depth: int = 12,
|
|
429
|
+
max_paths: int = 20,
|
|
430
|
+
validate: bool = False,
|
|
431
|
+
verbose: bool = True,
|
|
432
|
+
) -> List[PathwayCandidate]:
|
|
433
|
+
"""Convenience harness for qualitative pathway search on a SynCRN object.
|
|
434
|
+
|
|
435
|
+
This helper constructs a :class:`PathwayFinder`, loads the CRN, runs
|
|
436
|
+
qualitative search, and optionally validates the returned candidates by
|
|
437
|
+
exact realizability.
|
|
438
|
+
|
|
439
|
+
:param crn: SynCRN-like object to analyze.
|
|
440
|
+
:type crn: object
|
|
441
|
+
:param source_species:
|
|
442
|
+
Initial source species assumed to be present.
|
|
443
|
+
:type source_species: Iterable[str]
|
|
444
|
+
:param target_species:
|
|
445
|
+
Target species that must all be reachable.
|
|
446
|
+
:type target_species: Iterable[str]
|
|
447
|
+
:param initial_marking:
|
|
448
|
+
Optional initial marking used only when ``validate=True``.
|
|
449
|
+
:type initial_marking: Optional[Mapping[str, int]]
|
|
450
|
+
:param species:
|
|
451
|
+
Species naming mode used when tokenizing the CRN.
|
|
452
|
+
:type species: str
|
|
453
|
+
:param reaction:
|
|
454
|
+
Reaction naming mode used when tokenizing the CRN.
|
|
455
|
+
:type reaction: str
|
|
456
|
+
:param max_depth: Maximum qualitative search depth.
|
|
457
|
+
:type max_depth: int
|
|
458
|
+
:param max_paths: Maximum number of pathway candidates to return.
|
|
459
|
+
:type max_paths: int
|
|
460
|
+
:param validate:
|
|
461
|
+
Whether to validate candidates by exact Petri-net realizability.
|
|
462
|
+
:type validate: bool
|
|
463
|
+
:param verbose:
|
|
464
|
+
Whether to print a simple textual summary of the returned candidates.
|
|
465
|
+
:type verbose: bool
|
|
466
|
+
:return:
|
|
467
|
+
List of qualitative pathway candidates, optionally enriched with exact
|
|
468
|
+
realizability results.
|
|
469
|
+
:rtype: List[PathwayCandidate]
|
|
470
|
+
:raises ValueError:
|
|
471
|
+
If ``validate=True`` but ``initial_marking`` is not provided.
|
|
472
|
+
"""
|
|
473
|
+
finder = PathwayFinder(PathFinderConfig(max_depth=max_depth, max_paths=max_paths))
|
|
474
|
+
finder.load_syncrn(crn, species=species, reaction=reaction)
|
|
475
|
+
candidates = finder.find_paths_set(
|
|
476
|
+
source_species=source_species,
|
|
477
|
+
target_species=target_species,
|
|
478
|
+
max_depth=max_depth,
|
|
479
|
+
max_paths=max_paths,
|
|
480
|
+
)
|
|
481
|
+
if validate:
|
|
482
|
+
if initial_marking is None:
|
|
483
|
+
raise ValueError("initial_marking is required when validate=True")
|
|
484
|
+
candidates = finder.validate_candidates(
|
|
485
|
+
crn,
|
|
486
|
+
candidates,
|
|
487
|
+
initial_marking=initial_marking,
|
|
488
|
+
species=species,
|
|
489
|
+
reaction=reaction,
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
if verbose:
|
|
493
|
+
for i, cand in enumerate(candidates, start=1):
|
|
494
|
+
print(
|
|
495
|
+
f"Path {i}: depth={cand.depth}, reactions={cand.reactions}, flow={cand.flow}"
|
|
496
|
+
)
|
|
497
|
+
if cand.realizable is not None:
|
|
498
|
+
print(f" realizable={cand.realizable}, certificate={cand.certificate}")
|
|
499
|
+
|
|
500
|
+
return candidates
|