synkit 1.6.1b1__tar.gz → 1.6.2__tar.gz
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-1.6.2/.gitignore +116 -0
- synkit-1.6.2/PKG-INFO +183 -0
- synkit-1.6.2/README.md +143 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/pyproject.toml +16 -4
- synkit-1.6.2/synkit/CRN/Benchmark/__init__.py +105 -0
- synkit-1.6.2/synkit/CRN/Benchmark/crosschecks.py +377 -0
- synkit-1.6.2/synkit/CRN/Benchmark/data/kegg_modules.json +175 -0
- synkit-1.6.2/synkit/CRN/Benchmark/kegg.py +606 -0
- synkit-1.6.2/synkit/CRN/Benchmark/networks.py +459 -0
- synkit-1.6.2/synkit/CRN/Benchmark/scaling.py +541 -0
- synkit-1.6.2/synkit/CRN/Benchmark/validate.py +414 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/abstract.py +52 -65
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/builder.py +80 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/worker.py +1 -1
- synkit-1.6.2/synkit/CRN/IO/__init__.py +36 -0
- synkit-1.6.2/synkit/CRN/IO/sbml.py +881 -0
- synkit-1.6.2/synkit/CRN/Pathway/__init__.py +66 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Pathway/_adapter.py +24 -33
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Pathway/pathfinder.py +21 -24
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Pathway/reachability.py +52 -69
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Pathway/realizability.py +92 -130
- synkit-1.6.2/synkit/CRN/Petrinet/__init__.py +91 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Petrinet/analyzer.py +53 -73
- synkit-1.6.2/synkit/CRN/Petrinet/minimal_semiflows.py +388 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Petrinet/net.py +95 -133
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Petrinet/persistence.py +4 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Petrinet/semiflows.py +169 -77
- synkit-1.6.2/synkit/CRN/Petrinet/siphon_search.py +402 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Petrinet/structure.py +58 -54
- synkit-1.6.2/synkit/CRN/Props/__init__.py +126 -0
- synkit-1.6.2/synkit/CRN/Props/deficiency.py +933 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Props/dynamics.py +59 -74
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Props/helper.py +35 -3
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Props/stoich.py +201 -78
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Props/thermo.py +24 -32
- synkit-1.6.2/synkit/CRN/Query/__init__.py +62 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Query/kegg_api.py +11 -14
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Query/kegg_extract.py +63 -79
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Query/kegg_impute.py +35 -44
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Query/kegg_parse.py +53 -73
- synkit-1.6.2/synkit/CRN/Query/to_syncrn.py +294 -0
- synkit-1.6.2/synkit/CRN/Structure/_graph_io.py +704 -0
- synkit-1.6.2/synkit/CRN/Structure/_matrices.py +88 -0
- synkit-1.6.2/synkit/CRN/Structure/_parse.py +544 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Structure/reaction.py +14 -21
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Structure/rule.py +4 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Structure/species.py +2 -3
- synkit-1.6.2/synkit/CRN/Structure/syncrn.py +929 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Symmetry/_common.py +76 -91
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Symmetry/_ir.py +41 -60
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Symmetry/automorphism.py +33 -46
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Symmetry/canon.py +43 -58
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Symmetry/isomorphism.py +31 -42
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Symmetry/wl_canon.py +95 -124
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Visualize/layout.py +52 -65
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Visualize/validation.py +33 -11
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Visualize/vis.py +71 -106
- synkit-1.6.2/synkit/CRN/__init__.py +197 -0
- synkit-1.6.2/synkit/CRN/kinds.py +137 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Cluster/butina.py +6 -5
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Fingerprint/fp_calculator.py +4 -4
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Fingerprint/smiles_featurizer.py +11 -11
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Fingerprint/transformation_fp.py +4 -4
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/_chirality_loci.py +2 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/_helical_loci.py +3 -8
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/_stereo_axis_evidence.py +6 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/_stereo_element_detection.py +1 -4
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/_stereo_orientation_constraints.py +22 -41
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/_tetrahedral_carriers.py +3 -11
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/atom_features.py +12 -18
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/chirality.py +7 -22
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/cip_assignment.py +3 -11
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/cip_ranking.py +14 -19
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/coordinate_stereo.py +12 -37
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/descriptors.py +32 -44
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/graph_annotator.py +3 -4
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/standardize.py +83 -123
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/stereo_perception.py +8 -29
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/valence.py +14 -18
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/aam_validator.py +5 -5
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/chem/its.py +14 -24
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/exact/branching.py +21 -29
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/exact/certificate.py +18 -26
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/exact/enumerate.py +17 -20
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/exact/exhaustive.py +14 -22
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/exact/kernel.py +35 -44
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/exact/milp.py +17 -23
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/graph/automorphism.py +8 -11
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/graph/blockcut.py +12 -18
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/graph/refine.py +25 -35
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/io/idxmapstr.py +9 -14
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/slap/lap.py +22 -36
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/balance_check.py +6 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/canon_rsmi.py +6 -8
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/cleaning.py +3 -11
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/deionize.py +6 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/explicit_h_audit.py +5 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/fix_aam.py +3 -3
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/neutralize.py +7 -7
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/radical_wildcard.py +8 -9
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/standardize.py +8 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/tautomerize.py +5 -5
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/utils.py +18 -18
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Data/gen_partial_aam.py +3 -3
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Canon/canon_algs.py +39 -65
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Canon/canon_graph.py +34 -42
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Canon/exact.py +5 -8
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Canon/exact_refinement.py +15 -43
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Context/hier_context.py +63 -50
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Context/radius_expand.py +72 -62
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/Descriptors/topology.py +14 -11
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +13 -22
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/graph_descriptors.py +77 -69
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/graph_fps.py +16 -15
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/graph_signature.py +28 -26
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/hash_fps.py +36 -31
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/morgan_fps.py +18 -15
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/path_fps.py +17 -15
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/wl_hash.py +8 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Fusion/candidate.py +118 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Fusion/constructor.py +21 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Fusion/identity.py +1 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Fusion/interface.py +113 -25
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Fusion/search.py +1 -1
- synkit-1.6.2/synkit/Graph/Hyrogen/__init__.py +6 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Hyrogen/_misc.py +64 -81
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Hyrogen/hcomplete.py +385 -404
- synkit-1.6.2/synkit/Graph/Hyrogen/hcomplete_legacy.py +368 -0
- synkit-1.6.2/synkit/Graph/Hyrogen/hcompletion_algorithms.py +713 -0
- synkit-1.6.2/synkit/Graph/Hyrogen/hextend.py +570 -0
- synkit-1.6.2/synkit/Graph/Hyrogen/hextend_legacy.py +215 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/its_builder.py +9 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/its_construction.py +68 -39
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/its_decompose.py +26 -29
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/its_destruction.py +29 -22
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/its_expand.py +16 -15
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/its_relabel.py +7 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/its_reverter.py +21 -30
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/normalize_aam.py +27 -24
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/partial_its.py +6 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/rc_extractor.py +48 -38
- synkit-1.6.2/synkit/Graph/ITS/stereo.py +74 -0
- synkit-1.6.2/synkit/Graph/MTG/__init__.py +58 -0
- synkit-1.6.2/synkit/Graph/MTG/history.py +661 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/MTG/mcs_matcher.py +16 -18
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/MTG/mtg_explore.py +4 -4
- synkit-1.6.2/synkit/Graph/MTG/process.py +562 -0
- synkit-1.6.2/synkit/Graph/MTG/series_parallel.py +107 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/MTG/utils.py +24 -25
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/approx_mcs.py +106 -134
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/auto_est.py +96 -139
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/automorphism.py +58 -51
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/batch_cluster.py +54 -45
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/dedup_matches.py +42 -37
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/graph_cluster.py +45 -41
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/graph_matcher.py +92 -76
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/graph_morphism.py +130 -85
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/mcs_matcher.py +104 -148
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/multi_turbo_iso.py +23 -19
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/orbit.py +67 -103
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/partial_matcher.py +146 -207
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/sing.py +91 -63
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/subgraph_matcher.py +332 -139
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/turbo_iso.py +81 -18
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/wl_sel.py +93 -68
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Mech/conversion.py +55 -81
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Mech/conversion_debug.py +3 -3
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Mech/lwg_editor.py +10 -7
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Mech/lwg_ops.py +7 -7
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Morphism/__init__.py +22 -0
- synkit-1.6.2/synkit/Graph/Morphism/llg.py +918 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/__init__.py +72 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/changes.py +220 -8
- synkit-1.6.2/synkit/Graph/Stereo/composition.py +391 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/configured.py +2 -4
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/couplings.py +23 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/enumeration.py +2 -7
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/global_stereo.py +7 -15
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/identity.py +2 -5
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/matching.py +72 -7
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/pairwise.py +1 -2
- synkit-1.6.2/synkit/Graph/Stereo/reaction_interchange.py +266 -0
- synkit-1.6.2/synkit/Graph/Stereo/semantics.py +296 -0
- synkit-1.6.2/synkit/Graph/Stereo/wire.py +339 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Wildcard/fuse_graph.py +19 -19
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Wildcard/graph_wc.py +25 -36
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Wildcard/its_merge.py +29 -41
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Wildcard/radwc.py +10 -13
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Wildcard/wc_matcher.py +44 -60
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Wildcard/wildcard.py +15 -20
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/syn_graph.py +32 -30
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/utils.py +33 -48
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/chem_converter.py +67 -11
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/combinatorial/gml_to_graph.py +39 -70
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/combinatorial/graph_to_gml.py +25 -36
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/combinatorial/graph_to_smarts.py +19 -22
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/combinatorial/smarts_expander.py +10 -15
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/combinatorial/smarts_generalizer.py +3 -4
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/combinatorial/smarts_to_graph.py +22 -26
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/data_io.py +10 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/data_process.py +12 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/debug.py +2 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/gml_to_nx.py +4 -5
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/graph_to_mol.py +2 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/mol_to_graph.py +16 -16
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/mol_to_graph_chemistry.py +16 -16
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/nx_to_gml.py +5 -5
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/smiles_to_id.py +23 -18
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/__init__.py +10 -1
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/benchmark.py +1 -1
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/equivalence.py +75 -1
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/evidence.py +1 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/interchange.py +31 -14
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/model.py +301 -0
- synkit-1.6.2/synkit/Mechanism/neighbor_stereo.py +312 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/replay.py +416 -16
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/schema.py +58 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/stereo_state.py +68 -0
- synkit-1.6.2/synkit/Rule/Apply/__init__.py +35 -0
- synkit-1.6.2/synkit/Rule/Apply/dpo.py +965 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/Apply/rule_matcher.py +8 -8
- synkit-1.6.2/synkit/Rule/Compose/__init__.py +106 -0
- synkit-1.6.2/synkit/Rule/Compose/composition.py +848 -0
- synkit-1.6.2/synkit/Rule/Compose/laws.py +397 -0
- synkit-1.6.2/synkit/Rule/Compose/search.py +748 -0
- synkit-1.6.2/synkit/Rule/Compose/synrule.py +170 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/Modify/implict_rule.py +13 -22
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/Modify/longest_path.py +8 -8
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/Modify/molecule_rule.py +23 -20
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/Modify/prune_templates.py +18 -15
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/Modify/rule_utils.py +10 -9
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/generic_stereo.py +116 -3
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/syn_rule.py +99 -53
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Synthesis/MSR/path_finder.py +38 -15
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Synthesis/Metrics/_base.py +13 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Synthesis/Metrics/_plot.py +29 -21
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Synthesis/Metrics/_ranking.py +57 -51
- synkit-1.6.2/synkit/Synthesis/RBL/__init__.py +80 -0
- synkit-1.6.2/synkit/Synthesis/RBL/engine.py +1249 -0
- synkit-1.6.2/synkit/Synthesis/RBL/matching.py +652 -0
- synkit-1.6.2/synkit/Synthesis/RBL/overlap.py +336 -0
- synkit-1.6.2/synkit/Synthesis/RBL/pipeline.py +371 -0
- synkit-1.6.2/synkit/Synthesis/RBL/policy.py +139 -0
- synkit-1.6.2/synkit/Synthesis/RBL/proof.py +370 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/rbl_reaction.py → synkit-1.6.2/synkit/Synthesis/RBL/reaction.py +205 -44
- synkit-1.6.2/synkit/Synthesis/RBL/state.py +169 -0
- synkit-1.6.2/synkit/Synthesis/RBL/validation.py +1060 -0
- synkit-1.6.2/synkit/Synthesis/Reactor/__init__.py +60 -0
- synkit-1.6.2/synkit/Synthesis/Reactor/core/__init__.py +1 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/syn_reactor.py → synkit-1.6.2/synkit/Synthesis/Reactor/core/engine.py +220 -191
- synkit-1.6.2/synkit/Synthesis/Reactor/core/product.py +621 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/graph_rewrite.py → synkit-1.6.2/synkit/Synthesis/Reactor/core/rewrite.py +202 -42
- {synkit-1.6.1b1/synkit/Synthesis/Reactor → synkit-1.6.2/synkit/Synthesis/Reactor/core}/strategy.py +7 -14
- synkit-1.6.2/synkit/Synthesis/Reactor/matching/__init__.py +1 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/reactor_matching.py → synkit-1.6.2/synkit/Synthesis/Reactor/matching/mixin.py +124 -154
- synkit-1.6.2/synkit/Synthesis/Reactor/matching/policy.py +345 -0
- synkit-1.6.2/synkit/Synthesis/Reactor/matching/symmetry.py +309 -0
- synkit-1.6.2/synkit/Synthesis/Reactor/output/__init__.py +1 -0
- synkit-1.6.2/synkit/Synthesis/Reactor/output/deduplication.py +703 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/serialization_policy.py → synkit-1.6.2/synkit/Synthesis/Reactor/output/policy.py +1 -2
- {synkit-1.6.1b1/synkit/Synthesis/Reactor → synkit-1.6.2/synkit/Synthesis/Reactor/output}/serialization.py +123 -25
- synkit-1.6.2/synkit/Synthesis/Reactor/output/structural.py +893 -0
- synkit-1.6.2/synkit/Synthesis/Reactor/stereo/__init__.py +1 -0
- synkit-1.6.2/synkit/Synthesis/Reactor/stereo/assignment.py +35 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/reactor_stereo.py → synkit-1.6.2/synkit/Synthesis/Reactor/stereo/mixin.py +238 -5
- synkit-1.6.2/synkit/Synthesis/Reactor/variants/__init__.py +1 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/imba_engine.py → synkit-1.6.2/synkit/Synthesis/Reactor/variants/imbalanced.py +10 -13
- synkit-1.6.1b1/synkit/Synthesis/Reactor/partial_engine.py → synkit-1.6.2/synkit/Synthesis/Reactor/variants/partial.py +2 -2
- synkit-1.6.2/synkit/Synthesis/Reactor/workflow/__init__.py +1 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/batch_reactor.py → synkit-1.6.2/synkit/Synthesis/Reactor/workflow/batch.py +146 -33
- {synkit-1.6.1b1/synkit/Synthesis/Reactor → synkit-1.6.2/synkit/Synthesis/Reactor/workflow}/benchmark.py +7 -12
- {synkit-1.6.1b1/synkit/Synthesis/Reactor → synkit-1.6.2/synkit/Synthesis/Reactor/workflow}/rule_filter.py +17 -10
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Synthesis/reactor_utils.py +51 -54
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Utils/utils.py +49 -55
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/__init__.py +4 -2
- synkit-1.6.2/synkit/Vis/crn/__init__.py +40 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/models.py +4 -4
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/visualizer.py +32 -61
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/graph_visualizer.py +13 -20
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/its/__init__.py +2 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/its/drawer.py +3 -3
- synkit-1.6.2/synkit/Vis/its_drawer.py +35 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/molecule/__init__.py +2 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/molecule/drawer.py +4 -6
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/molecule/reaction.py +1 -1
- synkit-1.6.2/synkit/Vis/molecule_drawer.py +33 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/mtg/__init__.py +2 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/mtg/drawer.py +2 -2
- synkit-1.6.2/synkit/Vis/mtg_drawer.py +34 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/pdf_writer.py +29 -24
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/reaction/__init__.py +2 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/reaction/rxn.py +7 -7
- synkit-1.6.2/synkit/Vis/reaction_drawer.py +41 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/space/__init__.py +2 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/space/embedding.py +19 -17
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/vis_synedu/rxn_vis.py +28 -33
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/visual_drawer.py +1 -1
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/visual_model.py +2 -2
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/version.py +1 -1
- synkit-1.6.1b1/.gitignore +0 -98
- synkit-1.6.1b1/PKG-INFO +0 -210
- synkit-1.6.1b1/README.md +0 -171
- synkit-1.6.1b1/synkit/CRN/Construct/DAG/syncrn.py +0 -919
- synkit-1.6.1b1/synkit/CRN/Pathway/__init__.py +0 -27
- synkit-1.6.1b1/synkit/CRN/Petrinet/__init__.py +0 -47
- synkit-1.6.1b1/synkit/CRN/Props/__init__.py +0 -85
- synkit-1.6.1b1/synkit/CRN/Structure/syncrn.py +0 -1886
- synkit-1.6.1b1/synkit/CRN/Visualize/crn_vis.py +0 -199
- synkit-1.6.1b1/synkit/CRN/__init__.py +0 -81
- synkit-1.6.1b1/synkit/CRN/dev_crn/Structure/__init__.py +0 -35
- synkit-1.6.1b1/synkit/CRN/dev_crn/Structure/backend.py +0 -87
- synkit-1.6.1b1/synkit/CRN/dev_crn/Structure/conversion.py +0 -935
- synkit-1.6.1b1/synkit/CRN/dev_crn/Structure/hyperedge.py +0 -71
- synkit-1.6.1b1/synkit/CRN/dev_crn/Structure/hypergraph.py +0 -602
- synkit-1.6.1b1/synkit/CRN/dev_crn/Structure/rxn.py +0 -482
- synkit-1.6.1b1/synkit/CRN/dev_crn/Symmetry/automorphism.py +0 -380
- synkit-1.6.1b1/synkit/CRN/dev_crn/Symmetry/canon.py +0 -438
- synkit-1.6.1b1/synkit/CRN/dev_crn/Symmetry/wl_canon.py +0 -387
- synkit-1.6.1b1/synkit/CRN/dev_crn/__init__.py +0 -83
- synkit-1.6.1b1/synkit/CRN/dev_crn/configs/loader.py +0 -203
- synkit-1.6.1b1/synkit/CRN/dev_crn/configs/models.py +0 -299
- synkit-1.6.1b1/synkit/CRN/dev_crn/constants.py +0 -47
- synkit-1.6.1b1/synkit/CRN/dev_crn/crn_formula.py +0 -455
- synkit-1.6.1b1/synkit/CRN/dev_crn/deficiency.py +0 -872
- synkit-1.6.1b1/synkit/CRN/dev_crn/enumerator.py +0 -289
- synkit-1.6.1b1/synkit/CRN/dev_crn/exceptions.py +0 -97
- synkit-1.6.1b1/synkit/CRN/dev_crn/explorer.py +0 -249
- synkit-1.6.1b1/synkit/CRN/dev_crn/helpers.py +0 -87
- synkit-1.6.1b1/synkit/CRN/dev_crn/injectivity.py +0 -692
- synkit-1.6.1b1/synkit/CRN/dev_crn/motif.py +0 -371
- synkit-1.6.1b1/synkit/CRN/dev_crn/network.py +0 -272
- synkit-1.6.1b1/synkit/CRN/dev_crn/pathway.py +0 -119
- synkit-1.6.1b1/synkit/CRN/dev_crn/properties.py +0 -310
- synkit-1.6.1b1/synkit/CRN/dev_crn/reaction.py +0 -173
- synkit-1.6.1b1/synkit/CRN/dev_crn/utils.py +0 -118
- synkit-1.6.1b1/synkit/CRN/dev_crn/viz.py +0 -494
- synkit-1.6.1b1/synkit/Graph/Hyrogen/hextend.py +0 -305
- synkit-1.6.1b1/synkit/Graph/Wildcard/__init__.py +0 -0
- synkit-1.6.1b1/synkit/Rule/Apply/__init__.py +0 -0
- synkit-1.6.1b1/synkit/Rule/Compose/__init__.py +0 -0
- synkit-1.6.1b1/synkit/Rule/Modify/__init__.py +0 -0
- synkit-1.6.1b1/synkit/Synthesis/MSR/__init__.py +0 -0
- synkit-1.6.1b1/synkit/Synthesis/Metrics/__init__.py +0 -0
- synkit-1.6.1b1/synkit/Synthesis/Reactor/__init__.py +0 -29
- synkit-1.6.1b1/synkit/Synthesis/Reactor/assignment.py +0 -16
- synkit-1.6.1b1/synkit/Synthesis/Reactor/deduplication.py +0 -361
- synkit-1.6.1b1/synkit/Synthesis/Reactor/fusion_validation.py +0 -557
- synkit-1.6.1b1/synkit/Synthesis/Reactor/product_state.py +0 -397
- synkit-1.6.1b1/synkit/Synthesis/Reactor/rbl_engine.py +0 -1345
- synkit-1.6.1b1/synkit/Synthesis/Reactor/rbl_matching.py +0 -338
- synkit-1.6.1b1/synkit/Synthesis/Reactor/rbl_policy.py +0 -81
- synkit-1.6.1b1/synkit/Synthesis/__init__.py +0 -0
- synkit-1.6.1b1/synkit/Utils/__init__.py +0 -0
- synkit-1.6.1b1/synkit/Vis/crn/__init__.py +0 -5
- synkit-1.6.1b1/synkit/Vis/crn/visualizer.py +0 -981
- synkit-1.6.1b1/synkit/Vis/its_drawer.py +0 -615
- synkit-1.6.1b1/synkit/Vis/molecule_drawer.py +0 -565
- synkit-1.6.1b1/synkit/Vis/mtg_drawer.py +0 -769
- synkit-1.6.1b1/synkit/Vis/reaction_drawer.py +0 -285
- {synkit-1.6.1b1 → synkit-1.6.2}/LICENSE +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/arity.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/derivation.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/flattener.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/keys.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/mixtures.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/smiles.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/state.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Construct/strategy.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Structure/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Symmetry/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Symmetry/symmetry.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Visualize/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Visualize/labels.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/CRN/Visualize/palette.py +0 -0
- {synkit-1.6.1b1/synkit/CRN/Construct/DAG → synkit-1.6.2/synkit/Chem/Cluster}/__init__.py +0 -0
- {synkit-1.6.1b1/synkit/CRN/Query → synkit-1.6.2/synkit/Chem/Fingerprint}/__init__.py +0 -0
- {synkit-1.6.1b1/synkit/CRN/dev_crn/Symmetry → synkit-1.6.2/synkit/Chem/Molecule}/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/_chirality_types.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/derived_stereo_naming.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/formula.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/global_stereo.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Molecule/stereo_evidence.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/chem/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/chem/aam.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/chem/smiles.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/exact/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/exact/enumeration_result.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/graph/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/graph/labeled_graph.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/graph/synkit_adapter.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/io/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/slap/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/Mapper/slap/sequential.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/Reaction/aam_validator.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Chem/__init__.py +0 -0
- {synkit-1.6.1b1/synkit/CRN/dev_crn/configs → synkit-1.6.2/synkit/Data}/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Data/aldol.json.gz +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Data/paracetamol.json.gz +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Canon/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Canon/nauty.py +0 -0
- {synkit-1.6.1b1/synkit/Chem/Cluster → synkit-1.6.2/synkit/Graph/Context}/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/FG/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/FG/api.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/FG/audit.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/FG/catalog.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/FG/detector.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/FG/model.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/FG/recognizers.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/FG/ring_system.py +0 -0
- {synkit-1.6.1b1/synkit/Chem → synkit-1.6.2/synkit/Graph/Feature}/Fingerprint/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Feature/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Fusion/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/ITS/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/MTG/mtg.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Matcher/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Mech/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Mech/electron_accounting.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Morphism/constraints.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Morphism/morphism.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Morphism/stereo.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Morphism/stereo_morphism.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Morphism/stereo_morphism_helpers.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Morphism/stereo_morphism_types.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/_descriptor_core.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/_descriptor_serialization.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/canonical.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/descriptors.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/extended_descriptors.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/global_configured.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/interchange.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/legacy.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/orbits.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/outcomes.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/rdkit_adapter.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/Stereo/supports.py +0 -0
- {synkit-1.6.1b1/synkit/Chem/Molecule → synkit-1.6.2/synkit/Graph/Wildcard}/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Graph/canon_graph.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/combinatorial/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/IO/conversion.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/adapters.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/audit.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/compatibility.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/drawing.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/electron_models.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/radical_data.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Mechanism/symbols.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/Compose/_identity.py +0 -0
- {synkit-1.6.1b1/synkit/Data → synkit-1.6.2/synkit/Rule/Modify}/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/Modify/strip_rule.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Rule/stereo_identity.py +0 -0
- {synkit-1.6.1b1/synkit/Graph/Context → synkit-1.6.2/synkit/Synthesis/MSR}/__init__.py +0 -0
- {synkit-1.6.1b1/synkit/Graph/Feature/Fingerprint → synkit-1.6.2/synkit/Synthesis/Metrics}/__init__.py +0 -0
- /synkit-1.6.1b1/synkit/Synthesis/Reactor/post_syn.py → /synkit-1.6.2/synkit/Synthesis/Reactor/workflow/postprocess.py +0 -0
- {synkit-1.6.1b1/synkit/Graph/Hyrogen → synkit-1.6.2/synkit/Synthesis}/__init__.py +0 -0
- {synkit-1.6.1b1/synkit/Graph/MTG → synkit-1.6.2/synkit/Utils}/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/arrows.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/chem.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/constants.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/layout.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/mapping.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/render.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/epd/utils.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/reaction/rule.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/space/chemical.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/vis_synedu/Vis/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/vis_synedu/Vis/dpo.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/Vis/vis_synedu/vis.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/__init__.py +0 -0
- {synkit-1.6.1b1 → synkit-1.6.2}/synkit/examples.py +0 -0
synkit-1.6.2/.gitignore
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Python bytecode, environments, and tool caches
|
|
2
|
+
**/__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.coverage
|
|
5
|
+
.mypy_cache/
|
|
6
|
+
.pytest_cache/
|
|
7
|
+
.ruff_cache/
|
|
8
|
+
.tox/
|
|
9
|
+
.venv/
|
|
10
|
+
venv/
|
|
11
|
+
*cachedir
|
|
12
|
+
*/catboost_info/
|
|
13
|
+
|
|
14
|
+
# Build and generated documentation output
|
|
15
|
+
/build/
|
|
16
|
+
/dist/
|
|
17
|
+
/docs/
|
|
18
|
+
*.egg-info/
|
|
19
|
+
|
|
20
|
+
# Generated logs, reports, notebooks, and data files
|
|
21
|
+
*.log
|
|
22
|
+
*.pdf
|
|
23
|
+
*.rdf
|
|
24
|
+
*.ipynb
|
|
25
|
+
*.csv
|
|
26
|
+
*.json
|
|
27
|
+
*.json.gz
|
|
28
|
+
*.pkl.gz
|
|
29
|
+
*.txt
|
|
30
|
+
|
|
31
|
+
# Package resources and repository evidence retained despite the broad rules
|
|
32
|
+
!LICENSES/*.txt
|
|
33
|
+
!synkit/CRN/Benchmark/data/kegg_modules.json
|
|
34
|
+
!Data/Conformance/stereomolgraph_graph_conformance.json
|
|
35
|
+
!Data/Mech/polar.json
|
|
36
|
+
!Data/Mech/radical.json
|
|
37
|
+
!Data/Mech/stereo.json
|
|
38
|
+
!Data/Schema/
|
|
39
|
+
!Data/Schema/attribute_propagation_v1_5.json
|
|
40
|
+
!/tools/python_file_size_baseline.json
|
|
41
|
+
!Test/Synthesis/Reactor/fixtures/small_rewrite_conformance.json
|
|
42
|
+
|
|
43
|
+
# Lewis benchmark inputs and reviewed evidence
|
|
44
|
+
!Experiment/Lewis/Data/all.csv
|
|
45
|
+
!Experiment/Lewis/Data/benchmark.json.gz
|
|
46
|
+
!Experiment/Lewis/Data/combinatorial_all.csv
|
|
47
|
+
!Experiment/Lewis/Data/hydrogen.pkl.gz
|
|
48
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/electrocyclic_machinery.json
|
|
49
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/polar.json
|
|
50
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/radical.json
|
|
51
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/stereo.json
|
|
52
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/stereo_branch_coverage.json
|
|
53
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/stereo_couplings.json
|
|
54
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/evidence/mechanismbench_evidence.json
|
|
55
|
+
!Experiment/Lewis/mech_path/Data/reconstruction_audit/polar-failures.csv
|
|
56
|
+
!Experiment/Lewis/mech_path/Data/reconstruction_audit/radical-arrow-review.csv
|
|
57
|
+
!Experiment/Lewis/mech_path/Data/reconstruction_audit/radical-failures.csv
|
|
58
|
+
!Experiment/Lewis/rule_replay/Data/bidirectional-replay/results.json
|
|
59
|
+
!Experiment/Lewis/rule_replay/Data/relative-lone-pair/results.json
|
|
60
|
+
|
|
61
|
+
# Stereo benchmark inputs and reproducible reports
|
|
62
|
+
!Experiment/Stereo/Data/**/*.csv
|
|
63
|
+
!Experiment/Stereo/Data/**/*.json
|
|
64
|
+
!Experiment/Stereo/Data/manifest.json
|
|
65
|
+
!Experiment/Stereo/Data/Perception/full_detection_report.json
|
|
66
|
+
!Experiment/Stereo/Data/Perception/perception_conformance_cases.json
|
|
67
|
+
|
|
68
|
+
# Large or reproducible data products
|
|
69
|
+
/Data/Benchmark/*
|
|
70
|
+
!/Data/Benchmark/mech/
|
|
71
|
+
/Data/Benchmark/mech/*
|
|
72
|
+
!/Data/Benchmark/mech/README.md
|
|
73
|
+
!/Data/Benchmark/mech/polar-failures.csv
|
|
74
|
+
!/Data/Benchmark/mech/radical-failures.csv
|
|
75
|
+
!/Data/Benchmark/partial_expand/
|
|
76
|
+
!/Data/Benchmark/partial_expand/**
|
|
77
|
+
/Data/Benchmark/partial_expand/results/
|
|
78
|
+
!/Data/Benchmark/Stereo/
|
|
79
|
+
!/Data/Benchmark/Stereo/**
|
|
80
|
+
/Data/Fragment/*
|
|
81
|
+
/Data/Study/CRN/case_formose/*
|
|
82
|
+
/Data/USPTO/*
|
|
83
|
+
/Experiment/Lewis/Runs/
|
|
84
|
+
|
|
85
|
+
# Generated FLOWER intermediates and long-run evidence
|
|
86
|
+
/Experiment/Lewis/FLOWER/batches/
|
|
87
|
+
/Experiment/Lewis/FLOWER/full_reactions/
|
|
88
|
+
/Experiment/Lewis/FLOWER/replay-debug/
|
|
89
|
+
/Experiment/Lewis/FLOWER/replay-results*/
|
|
90
|
+
/Experiment/Lewis/FLOWER/replay-runs/
|
|
91
|
+
!Experiment/Lewis/FLOWER/full-reaction-batches/manifest.json
|
|
92
|
+
!Experiment/Lewis/FLOWER/full-reaction-replay-summary.json
|
|
93
|
+
|
|
94
|
+
# Resumable local benchmark state
|
|
95
|
+
/Experiment/RBL/*checkpoint*.jsonl
|
|
96
|
+
|
|
97
|
+
# Development and scratch paths
|
|
98
|
+
/Test/Conformance/
|
|
99
|
+
/crn/
|
|
100
|
+
/debug/
|
|
101
|
+
/dev/
|
|
102
|
+
/paper/*
|
|
103
|
+
/sprint/
|
|
104
|
+
/synkit/Graph/dev/
|
|
105
|
+
|
|
106
|
+
# Local one-off scripts and prompts
|
|
107
|
+
.gitignore
|
|
108
|
+
measure_candidate_stages.py
|
|
109
|
+
request.md
|
|
110
|
+
run.sh
|
|
111
|
+
run_rdcanon.py
|
|
112
|
+
run_valid_bug_cases.py
|
|
113
|
+
test_partial.py
|
|
114
|
+
test_run.py
|
|
115
|
+
test_syn.py
|
|
116
|
+
test_syn_reactor.py
|
synkit-1.6.2/PKG-INFO
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synkit
|
|
3
|
+
Version: 1.6.2
|
|
4
|
+
Summary: Utility for reaction modeling using graph grammar
|
|
5
|
+
Project-URL: homepage, https://github.com/TieuLongPhan/SynKit
|
|
6
|
+
Project-URL: source, https://github.com/TieuLongPhan/SynKit
|
|
7
|
+
Project-URL: issues, https://github.com/TieuLongPhan/SynKit/issues
|
|
8
|
+
Project-URL: documentation, https://tieulongphan.github.io/SynKit/
|
|
9
|
+
Author-email: Tieu Long Phan <tieu@bioinf.uni-leipzig.de>
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Requires-Python: >=3.11
|
|
16
|
+
Requires-Dist: networkx>=3.3
|
|
17
|
+
Requires-Dist: numpy>=2.2.0
|
|
18
|
+
Requires-Dist: pandas>=1.5.3
|
|
19
|
+
Requires-Dist: rdkit>=2025.3.1
|
|
20
|
+
Requires-Dist: regex>=2024.11.6
|
|
21
|
+
Requires-Dist: requests>=2.32.3
|
|
22
|
+
Requires-Dist: scikit-learn>=1.4.0
|
|
23
|
+
Requires-Dist: scipy>=1.14.0
|
|
24
|
+
Requires-Dist: seaborn>=0.13.2
|
|
25
|
+
Provides-Extra: all
|
|
26
|
+
Requires-Dist: numpy>=2.2.0; extra == 'all'
|
|
27
|
+
Requires-Dist: sympy>=1.13.1; extra == 'all'
|
|
28
|
+
Requires-Dist: torch>=2.2.0; extra == 'all'
|
|
29
|
+
Provides-Extra: docs
|
|
30
|
+
Requires-Dist: graphviz; extra == 'docs'
|
|
31
|
+
Requires-Dist: myst-parser; extra == 'docs'
|
|
32
|
+
Requires-Dist: pydata-sphinx-theme; extra == 'docs'
|
|
33
|
+
Requires-Dist: sphinx-copybutton; extra == 'docs'
|
|
34
|
+
Requires-Dist: sphinx-design; extra == 'docs'
|
|
35
|
+
Requires-Dist: sphinx-rtd-theme; extra == 'docs'
|
|
36
|
+
Requires-Dist: sphinx-togglebutton; extra == 'docs'
|
|
37
|
+
Requires-Dist: sphinx>=6.0; extra == 'docs'
|
|
38
|
+
Requires-Dist: sphinxcontrib-bibtex; extra == 'docs'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# SynKit
|
|
42
|
+
|
|
43
|
+
[](https://pypi.org/project/synkit/)
|
|
44
|
+
[](https://anaconda.org/tieulongphan/synkit)
|
|
45
|
+
[](https://hub.docker.com/r/tieulongphan/synkit)
|
|
46
|
+
[](https://hub.docker.com/r/tieulongphan/synkit)
|
|
47
|
+
[](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
|
|
48
|
+
[](https://github.com/tieulongphan/synkit/releases)
|
|
49
|
+
[](https://github.com/tieulongphan/synkit/commits)
|
|
50
|
+
[](https://doi.org/10.5281/zenodo.15269901)
|
|
51
|
+
[](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml)
|
|
52
|
+
[](https://github.com/tieulongphan/synkit/stargazers)
|
|
53
|
+
|
|
54
|
+
**Graph-native reaction informatics and executable electron-flow models**
|
|
55
|
+
|
|
56
|
+
SynKit is a Python toolkit for atom-mapped reactions, chemical graph
|
|
57
|
+
transformations, Lewis-labelled graphs, and explicitly supplied reaction
|
|
58
|
+
mechanisms. It connects reaction representation, rule extraction, graph
|
|
59
|
+
rewriting, stereochemistry, and mechanism verification through a common
|
|
60
|
+
attributed-graph model.
|
|
61
|
+
|
|
62
|
+
SynKit verifies mechanisms supplied by the user; it does not claim to predict
|
|
63
|
+
the kinetically or thermodynamically preferred mechanism.
|
|
64
|
+
|
|
65
|
+

|
|
66
|
+
|
|
67
|
+
## Highlights
|
|
68
|
+
|
|
69
|
+
- Convert mapped reaction SMILES into ITS and reaction-centre graphs.
|
|
70
|
+
- Extract and apply attributed graph-transformation rules.
|
|
71
|
+
- Represent lone pairs, radicals, and separate sigma and pi occupancies with
|
|
72
|
+
Lewis-labelled graphs.
|
|
73
|
+
- Execute curved-arrow and atomically coupled fishhook events.
|
|
74
|
+
- Preserve tetrahedral, axial, and extended stereochemical information.
|
|
75
|
+
- Build and analyse mechanism trajectory graphs and chemical reaction
|
|
76
|
+
networks.
|
|
77
|
+
|
|
78
|
+
## Installation
|
|
79
|
+
|
|
80
|
+
SynKit requires Python 3.11 or later.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
python -m pip install synkit
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Install the optional dependencies with:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
python -m pip install "synkit[all]"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Alternatively, use the published container:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
docker pull tieulongphan/synkit:latest
|
|
96
|
+
docker run --rm tieulongphan/synkit:latest \
|
|
97
|
+
python -c "import synkit; print(synkit.__version__)"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Quick start
|
|
101
|
+
|
|
102
|
+
This self-contained example converts an atom-mapped substitution into an
|
|
103
|
+
imaginary transition-state graph and reports its changed bonds:
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
from synkit.IO import rsmi_to_its
|
|
107
|
+
|
|
108
|
+
reaction = "[CH3:1][Br:2].[OH-:3]>>[CH3:1][OH:3].[Br-:2]"
|
|
109
|
+
its = rsmi_to_its(reaction, core=False, format="tuple")
|
|
110
|
+
|
|
111
|
+
changed_bonds = [
|
|
112
|
+
(source, target, data["order"])
|
|
113
|
+
for source, target, data in its.edges(data=True)
|
|
114
|
+
if data["order"][0] != data["order"][1]
|
|
115
|
+
]
|
|
116
|
+
print(changed_bonds)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
The output records the broken C-Br bond as `(1.0, 0.0)` and the formed C-O
|
|
120
|
+
bond as `(0.0, 1.0)`. Continue with the
|
|
121
|
+
[graph](https://tieulongphan.github.io/SynKit/graph.html),
|
|
122
|
+
[rule](https://tieulongphan.github.io/SynKit/rule.html), and
|
|
123
|
+
[synthesis](https://tieulongphan.github.io/SynKit/synthesis.html) guides.
|
|
124
|
+
|
|
125
|
+
## Supplied-mechanism verification
|
|
126
|
+
|
|
127
|
+
SynKit can parse typed electron-flow annotations, replay their elementary
|
|
128
|
+
steps, and return a verification certificate and mechanism trajectory graph.
|
|
129
|
+
Canonical electron loci distinguish lone pairs, sigma bonds, pi bonds, and
|
|
130
|
+
radical electrons. Curved arrows carry two electrons; fishhooks carry one;
|
|
131
|
+
coupled radical events commit atomically from a common pre-state.
|
|
132
|
+
|
|
133
|
+
See the
|
|
134
|
+
[mechanism documentation](https://tieulongphan.github.io/SynKit/mechanism.html)
|
|
135
|
+
for the supported interchange formats, verification policies, and complete
|
|
136
|
+
examples.
|
|
137
|
+
|
|
138
|
+
## Documentation
|
|
139
|
+
|
|
140
|
+
- [Documentation](https://tieulongphan.github.io/SynKit/)
|
|
141
|
+
- [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
|
|
142
|
+
- [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
|
|
143
|
+
- [Changelog](doc/changelog.rst)
|
|
144
|
+
|
|
145
|
+
## Publications
|
|
146
|
+
|
|
147
|
+
- [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
|
|
148
|
+
transfers](https://arxiv.org/abs/2607.26088), submitted (2026).
|
|
149
|
+
- [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
|
|
150
|
+
Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
|
|
151
|
+
of Chemical Information and Modeling* (2025).
|
|
152
|
+
|
|
153
|
+
## Contributing
|
|
154
|
+
|
|
155
|
+
Contributions and bug reports are welcome. Create a branch from the current
|
|
156
|
+
mainline, make a focused change, and run the repository checks before opening
|
|
157
|
+
a pull request:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
git switch -c feature/short-description
|
|
161
|
+
bash scripts/lint.sh
|
|
162
|
+
bash scripts/pytest.sh
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Questions can be sent to
|
|
166
|
+
[tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
|
|
167
|
+
|
|
168
|
+
## Contributors
|
|
169
|
+
|
|
170
|
+
- [Tieu-Long Phan](https://tieulongphan.github.io/)
|
|
171
|
+
- [Klaus Weinbauer](https://github.com/klausweinbauer)
|
|
172
|
+
- [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
|
|
173
|
+
- [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
|
|
174
|
+
|
|
175
|
+
## License
|
|
176
|
+
|
|
177
|
+
SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
|
|
178
|
+
|
|
179
|
+
## Acknowledgments
|
|
180
|
+
|
|
181
|
+
This project received funding from the European Union's Horizon Europe
|
|
182
|
+
Doctoral Network programme under Marie Skłodowska-Curie grant agreement No.
|
|
183
|
+
101072930 ([TACsy](https://tacsy.eu/)).
|
synkit-1.6.2/README.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# SynKit
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/synkit/)
|
|
4
|
+
[](https://anaconda.org/tieulongphan/synkit)
|
|
5
|
+
[](https://hub.docker.com/r/tieulongphan/synkit)
|
|
6
|
+
[](https://hub.docker.com/r/tieulongphan/synkit)
|
|
7
|
+
[](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
|
|
8
|
+
[](https://github.com/tieulongphan/synkit/releases)
|
|
9
|
+
[](https://github.com/tieulongphan/synkit/commits)
|
|
10
|
+
[](https://doi.org/10.5281/zenodo.15269901)
|
|
11
|
+
[](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml)
|
|
12
|
+
[](https://github.com/tieulongphan/synkit/stargazers)
|
|
13
|
+
|
|
14
|
+
**Graph-native reaction informatics and executable electron-flow models**
|
|
15
|
+
|
|
16
|
+
SynKit is a Python toolkit for atom-mapped reactions, chemical graph
|
|
17
|
+
transformations, Lewis-labelled graphs, and explicitly supplied reaction
|
|
18
|
+
mechanisms. It connects reaction representation, rule extraction, graph
|
|
19
|
+
rewriting, stereochemistry, and mechanism verification through a common
|
|
20
|
+
attributed-graph model.
|
|
21
|
+
|
|
22
|
+
SynKit verifies mechanisms supplied by the user; it does not claim to predict
|
|
23
|
+
the kinetically or thermodynamically preferred mechanism.
|
|
24
|
+
|
|
25
|
+

|
|
26
|
+
|
|
27
|
+
## Highlights
|
|
28
|
+
|
|
29
|
+
- Convert mapped reaction SMILES into ITS and reaction-centre graphs.
|
|
30
|
+
- Extract and apply attributed graph-transformation rules.
|
|
31
|
+
- Represent lone pairs, radicals, and separate sigma and pi occupancies with
|
|
32
|
+
Lewis-labelled graphs.
|
|
33
|
+
- Execute curved-arrow and atomically coupled fishhook events.
|
|
34
|
+
- Preserve tetrahedral, axial, and extended stereochemical information.
|
|
35
|
+
- Build and analyse mechanism trajectory graphs and chemical reaction
|
|
36
|
+
networks.
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
SynKit requires Python 3.11 or later.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
python -m pip install synkit
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Install the optional dependencies with:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
python -m pip install "synkit[all]"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Alternatively, use the published container:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
docker pull tieulongphan/synkit:latest
|
|
56
|
+
docker run --rm tieulongphan/synkit:latest \
|
|
57
|
+
python -c "import synkit; print(synkit.__version__)"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Quick start
|
|
61
|
+
|
|
62
|
+
This self-contained example converts an atom-mapped substitution into an
|
|
63
|
+
imaginary transition-state graph and reports its changed bonds:
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
from synkit.IO import rsmi_to_its
|
|
67
|
+
|
|
68
|
+
reaction = "[CH3:1][Br:2].[OH-:3]>>[CH3:1][OH:3].[Br-:2]"
|
|
69
|
+
its = rsmi_to_its(reaction, core=False, format="tuple")
|
|
70
|
+
|
|
71
|
+
changed_bonds = [
|
|
72
|
+
(source, target, data["order"])
|
|
73
|
+
for source, target, data in its.edges(data=True)
|
|
74
|
+
if data["order"][0] != data["order"][1]
|
|
75
|
+
]
|
|
76
|
+
print(changed_bonds)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The output records the broken C-Br bond as `(1.0, 0.0)` and the formed C-O
|
|
80
|
+
bond as `(0.0, 1.0)`. Continue with the
|
|
81
|
+
[graph](https://tieulongphan.github.io/SynKit/graph.html),
|
|
82
|
+
[rule](https://tieulongphan.github.io/SynKit/rule.html), and
|
|
83
|
+
[synthesis](https://tieulongphan.github.io/SynKit/synthesis.html) guides.
|
|
84
|
+
|
|
85
|
+
## Supplied-mechanism verification
|
|
86
|
+
|
|
87
|
+
SynKit can parse typed electron-flow annotations, replay their elementary
|
|
88
|
+
steps, and return a verification certificate and mechanism trajectory graph.
|
|
89
|
+
Canonical electron loci distinguish lone pairs, sigma bonds, pi bonds, and
|
|
90
|
+
radical electrons. Curved arrows carry two electrons; fishhooks carry one;
|
|
91
|
+
coupled radical events commit atomically from a common pre-state.
|
|
92
|
+
|
|
93
|
+
See the
|
|
94
|
+
[mechanism documentation](https://tieulongphan.github.io/SynKit/mechanism.html)
|
|
95
|
+
for the supported interchange formats, verification policies, and complete
|
|
96
|
+
examples.
|
|
97
|
+
|
|
98
|
+
## Documentation
|
|
99
|
+
|
|
100
|
+
- [Documentation](https://tieulongphan.github.io/SynKit/)
|
|
101
|
+
- [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
|
|
102
|
+
- [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
|
|
103
|
+
- [Changelog](doc/changelog.rst)
|
|
104
|
+
|
|
105
|
+
## Publications
|
|
106
|
+
|
|
107
|
+
- [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
|
|
108
|
+
transfers](https://arxiv.org/abs/2607.26088), submitted (2026).
|
|
109
|
+
- [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
|
|
110
|
+
Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
|
|
111
|
+
of Chemical Information and Modeling* (2025).
|
|
112
|
+
|
|
113
|
+
## Contributing
|
|
114
|
+
|
|
115
|
+
Contributions and bug reports are welcome. Create a branch from the current
|
|
116
|
+
mainline, make a focused change, and run the repository checks before opening
|
|
117
|
+
a pull request:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
git switch -c feature/short-description
|
|
121
|
+
bash scripts/lint.sh
|
|
122
|
+
bash scripts/pytest.sh
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Questions can be sent to
|
|
126
|
+
[tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
|
|
127
|
+
|
|
128
|
+
## Contributors
|
|
129
|
+
|
|
130
|
+
- [Tieu-Long Phan](https://tieulongphan.github.io/)
|
|
131
|
+
- [Klaus Weinbauer](https://github.com/klausweinbauer)
|
|
132
|
+
- [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
|
|
133
|
+
- [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
|
|
134
|
+
|
|
135
|
+
## License
|
|
136
|
+
|
|
137
|
+
SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
|
|
138
|
+
|
|
139
|
+
## Acknowledgments
|
|
140
|
+
|
|
141
|
+
This project received funding from the European Union's Horizon Europe
|
|
142
|
+
Doctoral Network programme under Marie Skłodowska-Curie grant agreement No.
|
|
143
|
+
101072930 ([TACsy](https://tacsy.eu/)).
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "synkit"
|
|
7
|
-
version = "1.6.
|
|
7
|
+
version = "1.6.2"
|
|
8
8
|
description = "Utility for reaction modeling using graph grammar"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -19,6 +19,7 @@ classifiers = [
|
|
|
19
19
|
"Operating System :: OS Independent",
|
|
20
20
|
]
|
|
21
21
|
dependencies = [
|
|
22
|
+
"numpy>=2.2.0",
|
|
22
23
|
"scikit-learn>=1.4.0",
|
|
23
24
|
"pandas>=1.5.3",
|
|
24
25
|
"rdkit>=2025.3.1",
|
|
@@ -39,7 +40,7 @@ docs = [
|
|
|
39
40
|
"pydata-sphinx-theme",
|
|
40
41
|
"sphinx-rtd-theme",
|
|
41
42
|
|
|
42
|
-
#
|
|
43
|
+
# Sphinx extensions
|
|
43
44
|
"sphinxcontrib-bibtex",
|
|
44
45
|
"sphinx-design",
|
|
45
46
|
"sphinx-copybutton",
|
|
@@ -49,8 +50,7 @@ docs = [
|
|
|
49
50
|
# (still requires the system `dot` binary to render diagrams)
|
|
50
51
|
"graphviz",
|
|
51
52
|
|
|
52
|
-
#
|
|
53
|
-
# (safe even if unused)
|
|
53
|
+
# Markdown source support
|
|
54
54
|
"myst-parser",
|
|
55
55
|
]
|
|
56
56
|
|
|
@@ -63,12 +63,15 @@ documentation = "https://tieulongphan.github.io/SynKit/"
|
|
|
63
63
|
|
|
64
64
|
[tool.hatch.build.targets.wheel]
|
|
65
65
|
packages = ["synkit"]
|
|
66
|
+
core-metadata-version = "2.4"
|
|
66
67
|
|
|
67
68
|
[tool.hatch.build.targets.wheel.force-include]
|
|
68
69
|
"synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
|
|
69
70
|
"synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
|
|
71
|
+
"synkit/CRN/Benchmark/data/kegg_modules.json" = "synkit/CRN/Benchmark/data/kegg_modules.json"
|
|
70
72
|
|
|
71
73
|
[tool.hatch.build.targets.sdist]
|
|
74
|
+
core-metadata-version = "2.4"
|
|
72
75
|
include = [
|
|
73
76
|
"/synkit",
|
|
74
77
|
"/LICENSE",
|
|
@@ -80,3 +83,12 @@ include = [
|
|
|
80
83
|
[tool.hatch.build.targets.sdist.force-include]
|
|
81
84
|
"synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
|
|
82
85
|
"synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
|
|
86
|
+
"synkit/CRN/Benchmark/data/kegg_modules.json" = "synkit/CRN/Benchmark/data/kegg_modules.json"
|
|
87
|
+
|
|
88
|
+
[tool.coverage.run]
|
|
89
|
+
source = ["synkit"]
|
|
90
|
+
|
|
91
|
+
[tool.coverage.report]
|
|
92
|
+
fail_under = 70
|
|
93
|
+
precision = 1
|
|
94
|
+
show_missing = true
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Benchmark, validation and case-study material for :mod:`synkit.CRN`.
|
|
2
|
+
|
|
3
|
+
Three things live here, all runnable and all shipped with the package so the
|
|
4
|
+
results in the paper can be regenerated by a reader:
|
|
5
|
+
|
|
6
|
+
- **A validation set** (:mod:`~synkit.CRN.Benchmark.networks`,
|
|
7
|
+
:mod:`~synkit.CRN.Benchmark.validate`) — literature and regression networks
|
|
8
|
+
with the structural verdicts they must reproduce, each quantity additionally
|
|
9
|
+
recomputed by an independent route from
|
|
10
|
+
:mod:`~synkit.CRN.Benchmark.crosschecks`.
|
|
11
|
+
- **A scaling benchmark** (:mod:`~synkit.CRN.Benchmark.scaling`) — wall-clock
|
|
12
|
+
timings of the analysis stack against network size.
|
|
13
|
+
- **A metabolic case study** (:mod:`~synkit.CRN.Benchmark.kegg`) — cached KEGG
|
|
14
|
+
modules pushed through the whole chain, from pathway retrieval to
|
|
15
|
+
conservation laws, persistence and flux realizability.
|
|
16
|
+
|
|
17
|
+
.. rubric:: Example
|
|
18
|
+
|
|
19
|
+
.. code-block:: python
|
|
20
|
+
|
|
21
|
+
from synkit.CRN.Benchmark import run_validation, validation_table
|
|
22
|
+
|
|
23
|
+
print(validation_table(run_validation()))
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from .networks import (
|
|
29
|
+
BENCHMARK_NETWORKS,
|
|
30
|
+
BenchmarkNetwork,
|
|
31
|
+
get_network,
|
|
32
|
+
network_names,
|
|
33
|
+
)
|
|
34
|
+
from .crosschecks import (
|
|
35
|
+
brute_force_siphons,
|
|
36
|
+
check_conservation_laws,
|
|
37
|
+
check_semiflows,
|
|
38
|
+
deficiency_by_rank_identity,
|
|
39
|
+
persistence_by_brute_force,
|
|
40
|
+
rank_by_svd,
|
|
41
|
+
)
|
|
42
|
+
from .scaling import (
|
|
43
|
+
NETWORK_FAMILIES,
|
|
44
|
+
ScalingRecord,
|
|
45
|
+
TASKS,
|
|
46
|
+
generate_network,
|
|
47
|
+
run_scaling_benchmark,
|
|
48
|
+
scaling_table,
|
|
49
|
+
)
|
|
50
|
+
from .kegg import (
|
|
51
|
+
CASE_STUDY_MODULES,
|
|
52
|
+
GLYCOLYSIS_FLUX,
|
|
53
|
+
KeggModuleAnalysis,
|
|
54
|
+
analyze_kegg_module,
|
|
55
|
+
build_kegg_crn,
|
|
56
|
+
check_glycolysis_flux,
|
|
57
|
+
kegg_case_study_report,
|
|
58
|
+
load_kegg_cache,
|
|
59
|
+
module_ids,
|
|
60
|
+
)
|
|
61
|
+
from .validate import (
|
|
62
|
+
NetworkValidation,
|
|
63
|
+
ValidationReport,
|
|
64
|
+
run_validation,
|
|
65
|
+
validate_network,
|
|
66
|
+
validation_table,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
__all__ = [
|
|
70
|
+
# networks
|
|
71
|
+
"BENCHMARK_NETWORKS",
|
|
72
|
+
"BenchmarkNetwork",
|
|
73
|
+
"get_network",
|
|
74
|
+
"network_names",
|
|
75
|
+
# independent cross-checks
|
|
76
|
+
"brute_force_siphons",
|
|
77
|
+
"check_conservation_laws",
|
|
78
|
+
"check_semiflows",
|
|
79
|
+
"deficiency_by_rank_identity",
|
|
80
|
+
"persistence_by_brute_force",
|
|
81
|
+
"rank_by_svd",
|
|
82
|
+
# scaling benchmark
|
|
83
|
+
"NETWORK_FAMILIES",
|
|
84
|
+
"ScalingRecord",
|
|
85
|
+
"TASKS",
|
|
86
|
+
"generate_network",
|
|
87
|
+
"run_scaling_benchmark",
|
|
88
|
+
"scaling_table",
|
|
89
|
+
# KEGG case study
|
|
90
|
+
"CASE_STUDY_MODULES",
|
|
91
|
+
"GLYCOLYSIS_FLUX",
|
|
92
|
+
"KeggModuleAnalysis",
|
|
93
|
+
"analyze_kegg_module",
|
|
94
|
+
"build_kegg_crn",
|
|
95
|
+
"check_glycolysis_flux",
|
|
96
|
+
"kegg_case_study_report",
|
|
97
|
+
"load_kegg_cache",
|
|
98
|
+
"module_ids",
|
|
99
|
+
# validation
|
|
100
|
+
"NetworkValidation",
|
|
101
|
+
"ValidationReport",
|
|
102
|
+
"run_validation",
|
|
103
|
+
"validate_network",
|
|
104
|
+
"validation_table",
|
|
105
|
+
]
|