synkit 1.6.0__tar.gz → 1.6.1__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.1/.gitignore +108 -0
- synkit-1.6.1/PKG-INFO +182 -0
- synkit-1.6.1/README.md +143 -0
- {synkit-1.6.0 → synkit-1.6.1}/pyproject.toml +2 -5
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/_ir.py +114 -9
- synkit-1.6.1/synkit/Chem/Molecule/_chirality_loci.py +165 -0
- synkit-1.6.1/synkit/Chem/Molecule/_chirality_types.py +231 -0
- synkit-1.6.1/synkit/Chem/Molecule/_helical_loci.py +167 -0
- synkit-1.6.1/synkit/Chem/Molecule/_stereo_axis_evidence.py +200 -0
- synkit-1.6.1/synkit/Chem/Molecule/_stereo_element_detection.py +193 -0
- synkit-1.6.1/synkit/Chem/Molecule/_stereo_orientation_constraints.py +511 -0
- synkit-1.6.1/synkit/Chem/Molecule/_tetrahedral_carriers.py +63 -0
- synkit-1.6.1/synkit/Chem/Molecule/chirality.py +1041 -0
- synkit-1.6.1/synkit/Chem/Molecule/cip_assignment.py +569 -0
- synkit-1.6.1/synkit/Chem/Molecule/cip_ranking.py +843 -0
- synkit-1.6.1/synkit/Chem/Molecule/coordinate_stereo.py +503 -0
- synkit-1.6.1/synkit/Chem/Molecule/derived_stereo_naming.py +165 -0
- synkit-1.6.1/synkit/Chem/Molecule/global_stereo.py +175 -0
- synkit-1.6.1/synkit/Chem/Molecule/stereo_evidence.py +179 -0
- synkit-1.6.1/synkit/Chem/Molecule/stereo_perception.py +1032 -0
- synkit-1.6.1/synkit/Graph/Canon/__init__.py +16 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Canon/canon_algs.py +2 -1
- {synkit-1.6.0/synkit/Graph → synkit-1.6.1/synkit/Graph/Canon}/canon_graph.py +2 -2
- synkit-1.6.1/synkit/Graph/Canon/exact.py +957 -0
- synkit-1.6.1/synkit/Graph/Canon/exact_refinement.py +368 -0
- synkit-1.6.1/synkit/Graph/Canon/nauty.py +143 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/candidate.py +33 -2
- synkit-1.6.1/synkit/Graph/Hyrogen/__init__.py +6 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Hyrogen/hcomplete.py +287 -339
- synkit-1.6.1/synkit/Graph/Hyrogen/hcomplete_legacy.py +368 -0
- synkit-1.6.1/synkit/Graph/Hyrogen/hcompletion_algorithms.py +713 -0
- synkit-1.6.1/synkit/Graph/Hyrogen/hextend.py +557 -0
- synkit-1.6.1/synkit/Graph/Hyrogen/hextend_legacy.py +215 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_construction.py +40 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_destruction.py +11 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/rc_extractor.py +23 -7
- synkit-1.6.1/synkit/Graph/ITS/stereo.py +74 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/dedup_matches.py +10 -5
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/subgraph_matcher.py +91 -11
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/conversion.py +40 -0
- synkit-1.6.1/synkit/Graph/Stereo/__init__.py +368 -0
- synkit-1.6.1/synkit/Graph/Stereo/_descriptor_core.py +207 -0
- synkit-1.6.1/synkit/Graph/Stereo/_descriptor_serialization.py +138 -0
- synkit-1.6.1/synkit/Graph/Stereo/canonical.py +635 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/changes.py +220 -8
- synkit-1.6.1/synkit/Graph/Stereo/composition.py +391 -0
- synkit-1.6.1/synkit/Graph/Stereo/configured.py +981 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/couplings.py +23 -2
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/descriptors.py +434 -232
- synkit-1.6.1/synkit/Graph/Stereo/enumeration.py +590 -0
- synkit-1.6.1/synkit/Graph/Stereo/extended_descriptors.py +402 -0
- synkit-1.6.1/synkit/Graph/Stereo/global_configured.py +152 -0
- synkit-1.6.1/synkit/Graph/Stereo/global_stereo.py +304 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/identity.py +37 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/matching.py +79 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/orbits.py +44 -0
- synkit-1.6.1/synkit/Graph/Stereo/pairwise.py +224 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/rdkit_adapter.py +42 -18
- synkit-1.6.1/synkit/Graph/Stereo/reaction_interchange.py +266 -0
- synkit-1.6.1/synkit/Graph/Stereo/semantics.py +296 -0
- synkit-1.6.1/synkit/Graph/Stereo/supports.py +257 -0
- synkit-1.6.1/synkit/Graph/Stereo/wire.py +339 -0
- synkit-1.6.1/synkit/Graph/canon_graph.py +14 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/chem_converter.py +60 -2
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/__init__.py +10 -1
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/equivalence.py +75 -1
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/evidence.py +9 -4
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/interchange.py +31 -14
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/model.py +238 -0
- synkit-1.6.1/synkit/Mechanism/neighbor_stereo.py +312 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/replay.py +53 -1
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/schema.py +58 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/stereo_state.py +68 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/generic_stereo.py +114 -1
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/syn_rule.py +39 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/__init__.py +4 -1
- synkit-1.6.1/synkit/Synthesis/Reactor/assignment.py +35 -0
- synkit-1.6.1/synkit/Synthesis/Reactor/deduplication.py +830 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/graph_rewrite.py +136 -28
- synkit-1.6.1/synkit/Synthesis/Reactor/matching_policy.py +235 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/product_state.py +122 -44
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/reactor_matching.py +65 -40
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/reactor_stereo.py +238 -5
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/serialization.py +12 -2
- synkit-1.6.1/synkit/Synthesis/Reactor/serialization_policy.py +16 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/syn_reactor.py +120 -23
- {synkit-1.6.0 → synkit-1.6.1}/synkit/version.py +1 -1
- synkit-1.6.0/.gitignore +0 -73
- synkit-1.6.0/Data/Mech/README.md +0 -46
- synkit-1.6.0/Data/Mech/polar.json +0 -15921
- synkit-1.6.0/Data/Mech/radical.json +0 -12062
- synkit-1.6.0/Data/Mech/stereo.json +0 -7875
- synkit-1.6.0/LICENSES/ACS-StereoMolGraph-SI-NOTICE.md +0 -19
- synkit-1.6.0/LICENSES/StereoMolGraph-MIT.txt +0 -30
- synkit-1.6.0/PKG-INFO +0 -212
- synkit-1.6.0/README.md +0 -171
- synkit-1.6.0/synkit/Chem/Molecule/chirality.py +0 -761
- synkit-1.6.0/synkit/Graph/Canon/__init__.py +0 -3
- synkit-1.6.0/synkit/Graph/Canon/canon_graph.py +0 -530
- synkit-1.6.0/synkit/Graph/Canon/nauty.py +0 -320
- synkit-1.6.0/synkit/Graph/Hyrogen/hextend.py +0 -305
- synkit-1.6.0/synkit/Graph/Stereo/__init__.py +0 -152
- synkit-1.6.0/synkit/Synthesis/Reactor/assignment.py +0 -16
- synkit-1.6.0/synkit/Synthesis/Reactor/deduplication.py +0 -361
- synkit-1.6.0/synkit/Utils/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/LICENSE +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/DAG/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/DAG/syncrn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/abstract.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/arity.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/builder.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/derivation.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/flattener.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/keys.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/mixtures.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/smiles.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/state.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/strategy.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Construct/worker.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/_adapter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/pathfinder.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/reachability.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Pathway/realizability.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/analyzer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/net.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/persistence.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/semiflows.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Petrinet/structure.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/dynamics.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/helper.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/stoich.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Props/thermo.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/kegg_api.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/kegg_extract.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/kegg_impute.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Query/kegg_parse.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/reaction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/species.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Structure/syncrn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/_common.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/automorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/canon.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/isomorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/symmetry.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Symmetry/wl_canon.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/crn_vis.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/labels.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/layout.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/palette.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/validation.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/Visualize/vis.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/backend.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/conversion.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/hyperedge.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/hypergraph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Structure/rxn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Symmetry/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Symmetry/automorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Symmetry/canon.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/Symmetry/wl_canon.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/configs/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/configs/loader.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/configs/models.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/constants.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/crn_formula.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/deficiency.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/enumerator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/exceptions.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/explorer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/helpers.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/injectivity.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/motif.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/network.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/pathway.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/properties.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/reaction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/CRN/dev_crn/viz.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Cluster/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Cluster/butina.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Fingerprint/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Fingerprint/fp_calculator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Fingerprint/smiles_featurizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Fingerprint/transformation_fp.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/atom_features.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/descriptors.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/formula.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/graph_annotator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/standardize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Molecule/valence.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/aam_validator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/chem/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/chem/aam.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/chem/its.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/chem/smiles.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/branching.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/certificate.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/enumerate.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/enumeration_result.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/exhaustive.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/kernel.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/exact/milp.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/automorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/blockcut.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/labeled_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/refine.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/graph/synkit_adapter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/io/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/io/idxmapstr.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/slap/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/slap/lap.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/Mapper/slap/sequential.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/aam_validator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/balance_check.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/canon_rsmi.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/cleaning.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/deionize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/explicit_h_audit.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/fix_aam.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/neutralize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/radical_wildcard.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/standardize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/Reaction/tautomerize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Chem/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Data/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Data/aldol.json.gz +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Data/gen_partial_aam.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Data/paracetamol.json.gz +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Context/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Context/hier_context.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Context/radius_expand.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/api.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/audit.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/catalog.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/detector.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/model.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/recognizers.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/FG/ring_system.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/Descriptors/topology.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/graph_descriptors.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/graph_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/graph_signature.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/hash_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/morgan_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/path_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Feature/wl_hash.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/constructor.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/identity.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/interface.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Fusion/search.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Hyrogen/_misc.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_builder.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_decompose.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_expand.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_relabel.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/its_reverter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/normalize_aam.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/ITS/partial_its.py +0 -0
- {synkit-1.6.0/synkit/Graph/Hyrogen → synkit-1.6.1/synkit/Graph/MTG}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/MTG/mcs_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/MTG/mtg.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/MTG/mtg_explore.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/MTG/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/approx_mcs.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/auto_est.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/automorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/batch_cluster.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/graph_cluster.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/graph_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/graph_morphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/mcs_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/multi_turbo_iso.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/orbit.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/partial_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/sing.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/turbo_iso.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Matcher/wl_sel.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/conversion_debug.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/electron_accounting.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/lwg_editor.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Mech/lwg_ops.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/constraints.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/morphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/stereo.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/stereo_morphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/stereo_morphism_helpers.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Morphism/stereo_morphism_types.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/interchange.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/legacy.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Stereo/outcomes.py +0 -0
- {synkit-1.6.0/synkit/Graph/MTG → synkit-1.6.1/synkit/Graph/Wildcard}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/fuse_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/graph_wc.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/its_merge.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/radwc.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/wc_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/Wildcard/wildcard.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/syn_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Graph/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/gml_to_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/graph_to_gml.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/graph_to_smarts.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/smarts_expander.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/smarts_generalizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/combinatorial/smarts_to_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/conversion.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/data_io.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/data_process.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/debug.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/gml_to_nx.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/graph_to_mol.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/mol_to_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/mol_to_graph_chemistry.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/nx_to_gml.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/IO/smiles_to_id.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/adapters.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/audit.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/benchmark.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/compatibility.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/drawing.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/electron_models.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/radical_data.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Mechanism/symbols.py +0 -0
- {synkit-1.6.0/synkit/Graph/Wildcard → synkit-1.6.1/synkit/Rule/Apply}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Apply/rule_matcher.py +0 -0
- {synkit-1.6.0/synkit/Rule/Apply → synkit-1.6.1/synkit/Rule/Compose}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Compose/_identity.py +0 -0
- {synkit-1.6.0/synkit/Rule/Compose → synkit-1.6.1/synkit/Rule/Modify}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/implict_rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/longest_path.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/molecule_rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/prune_templates.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/rule_utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/Modify/strip_rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Rule/stereo_identity.py +0 -0
- {synkit-1.6.0/synkit/Rule/Modify → synkit-1.6.1/synkit/Synthesis/MSR}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/MSR/path_finder.py +0 -0
- {synkit-1.6.0/synkit/Synthesis/MSR → synkit-1.6.1/synkit/Synthesis/Metrics}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Metrics/_base.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Metrics/_plot.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Metrics/_ranking.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/batch_reactor.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/benchmark.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/fusion_validation.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/imba_engine.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/partial_engine.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/post_syn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rbl_engine.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rbl_matching.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rbl_policy.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rbl_reaction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/rule_filter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/Reactor/strategy.py +0 -0
- {synkit-1.6.0/synkit/Synthesis/Metrics → synkit-1.6.1/synkit/Synthesis}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Synthesis/reactor_utils.py +0 -0
- {synkit-1.6.0/synkit/Synthesis → synkit-1.6.1/synkit/Utils}/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Utils/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/crn/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/crn/visualizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/arrows.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/chem.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/constants.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/layout.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/mapping.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/models.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/render.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/epd/visualizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/graph_visualizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/its/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/its/drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/its_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/molecule/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/molecule/drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/molecule/reaction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/molecule_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/mtg/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/mtg/drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/mtg_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/pdf_writer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/reaction/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/reaction/rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/reaction/rxn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/reaction_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/space/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/space/chemical.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/space/embedding.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/vis_synedu/Vis/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/vis_synedu/Vis/dpo.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/vis_synedu/rxn_vis.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/vis_synedu/vis.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/visual_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/Vis/visual_model.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1}/synkit/examples.py +0 -0
synkit-1.6.1/.gitignore
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
*.pyc
|
|
2
|
+
*cachedir
|
|
3
|
+
*.csv
|
|
4
|
+
!Experiment/Lewis/Data/all.csv
|
|
5
|
+
!Experiment/Lewis/Data/combinatorial_all.csv
|
|
6
|
+
!Experiment/Lewis/mech_path/Data/reconstruction_audit/polar-failures.csv
|
|
7
|
+
!Experiment/Lewis/mech_path/Data/reconstruction_audit/radical-failures.csv
|
|
8
|
+
!Experiment/Lewis/mech_path/Data/reconstruction_audit/radical-arrow-review.csv
|
|
9
|
+
*/catboost_info/*
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
*.pkl.gz
|
|
13
|
+
*.pdf
|
|
14
|
+
|
|
15
|
+
.coverage
|
|
16
|
+
dev/*
|
|
17
|
+
/debug/
|
|
18
|
+
/Test/Conformance/
|
|
19
|
+
*.rdf
|
|
20
|
+
test_syn_reactor.py
|
|
21
|
+
|
|
22
|
+
Data/Benchmark/*
|
|
23
|
+
!Data/Benchmark/partial_expand/
|
|
24
|
+
!Data/Benchmark/partial_expand/**
|
|
25
|
+
Data/Benchmark/partial_expand/results/
|
|
26
|
+
!Data/Benchmark/mech/
|
|
27
|
+
Data/Benchmark/mech/*
|
|
28
|
+
!Data/Benchmark/mech/README.md
|
|
29
|
+
!Data/Benchmark/mech/polar-failures.csv
|
|
30
|
+
!Data/Benchmark/mech/radical-failures.csv
|
|
31
|
+
*.json.gz
|
|
32
|
+
!Experiment/Lewis/Data/benchmark.json.gz
|
|
33
|
+
# *.png
|
|
34
|
+
|
|
35
|
+
run.sh
|
|
36
|
+
docs/*
|
|
37
|
+
run_rdcanon.py
|
|
38
|
+
Data/Fragment/*
|
|
39
|
+
test_partial.py
|
|
40
|
+
Data/Benchmark/synthesis/*
|
|
41
|
+
Data/USPTO/*
|
|
42
|
+
crn/*
|
|
43
|
+
test_run.py
|
|
44
|
+
Data/Study/CRN/case_formose/*
|
|
45
|
+
|
|
46
|
+
synkit/Graph/dev/*
|
|
47
|
+
*.ipynb
|
|
48
|
+
*.json
|
|
49
|
+
# Stereo benchmark inputs are versioned for reproducible fresh-clone runs.
|
|
50
|
+
# Generated reports stay Git-visible so completed results can be committed
|
|
51
|
+
# explicitly, including reports created by the long raw stress stages.
|
|
52
|
+
!Experiment/Stereo/Data/**/*.csv
|
|
53
|
+
!Experiment/Stereo/Data/**/*.json
|
|
54
|
+
!Data/Schema/
|
|
55
|
+
!Data/Schema/attribute_propagation_v1_5.json
|
|
56
|
+
!/tools/python_file_size_baseline.json
|
|
57
|
+
!Data/Mech/polar.json
|
|
58
|
+
!Data/Mech/radical.json
|
|
59
|
+
!Data/Mech/stereo.json
|
|
60
|
+
!Experiment/Lewis/Data/hydrogen.pkl.gz
|
|
61
|
+
# Canonical reviewed MechanismBench partitions are executable test data.
|
|
62
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/polar.json
|
|
63
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/radical.json
|
|
64
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/stereo.json
|
|
65
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/electrocyclic_machinery.json
|
|
66
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/stereo_branch_coverage.json
|
|
67
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/stereo_couplings.json
|
|
68
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/evidence/mechanismbench_evidence.json
|
|
69
|
+
!Experiment/Lewis/rule_replay/Data/bidirectional-replay/results.json
|
|
70
|
+
!Experiment/Lewis/rule_replay/Data/relative-lone-pair/results.json
|
|
71
|
+
!Experiment/Stereo/Data/manifest.json
|
|
72
|
+
!Experiment/Stereo/Data/Perception/perception_conformance_cases.json
|
|
73
|
+
!Experiment/Stereo/Data/Perception/full_detection_report.json
|
|
74
|
+
!Test/Synthesis/Reactor/fixtures/small_rewrite_conformance.json
|
|
75
|
+
!Data/Conformance/stereomolgraph_graph_conformance.json
|
|
76
|
+
!Data/Benchmark/Stereo/
|
|
77
|
+
!Data/Benchmark/Stereo/**
|
|
78
|
+
*.txt
|
|
79
|
+
!LICENSES/*.txt
|
|
80
|
+
*.log
|
|
81
|
+
/dist/
|
|
82
|
+
sprint/
|
|
83
|
+
sprint/*
|
|
84
|
+
test_syn.py
|
|
85
|
+
.gitignore
|
|
86
|
+
measure_candidate_stages.py
|
|
87
|
+
run_valid_bug_cases.py
|
|
88
|
+
paper/*
|
|
89
|
+
# Nested standalone Git repository.
|
|
90
|
+
/paper/og_paper/
|
|
91
|
+
|
|
92
|
+
# Fresh benchmark runs are reproducible and can be large. Retained reference
|
|
93
|
+
# outputs live inside each experiment's Data directory.
|
|
94
|
+
Experiment/Lewis/Runs/
|
|
95
|
+
|
|
96
|
+
# Generated FLOWER intermediates and long-run evidence. The portable
|
|
97
|
+
# full-reaction batch payload is intentionally retained in Git.
|
|
98
|
+
Experiment/Lewis/FLOWER/batches/
|
|
99
|
+
Experiment/Lewis/FLOWER/full_reactions/
|
|
100
|
+
Experiment/Lewis/FLOWER/replay-debug/
|
|
101
|
+
Experiment/Lewis/FLOWER/replay-runs/
|
|
102
|
+
Experiment/Lewis/FLOWER/replay-results*/
|
|
103
|
+
!Experiment/Lewis/FLOWER/full-reaction-batches/manifest.json
|
|
104
|
+
!Experiment/Lewis/FLOWER/full-reaction-replay-summary.json
|
|
105
|
+
|
|
106
|
+
# Keep generated Python bytecode ignored after directory re-inclusions above.
|
|
107
|
+
**/__pycache__/
|
|
108
|
+
*.py[cod]
|
synkit-1.6.1/PKG-INFO
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synkit
|
|
3
|
+
Version: 1.6.1
|
|
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: pandas>=1.5.3
|
|
18
|
+
Requires-Dist: rdkit>=2025.3.1
|
|
19
|
+
Requires-Dist: regex>=2024.11.6
|
|
20
|
+
Requires-Dist: requests>=2.32.3
|
|
21
|
+
Requires-Dist: scikit-learn>=1.4.0
|
|
22
|
+
Requires-Dist: scipy>=1.14.0
|
|
23
|
+
Requires-Dist: seaborn>=0.13.2
|
|
24
|
+
Provides-Extra: all
|
|
25
|
+
Requires-Dist: numpy>=2.2.0; extra == 'all'
|
|
26
|
+
Requires-Dist: sympy>=1.13.1; extra == 'all'
|
|
27
|
+
Requires-Dist: torch>=2.2.0; extra == 'all'
|
|
28
|
+
Provides-Extra: docs
|
|
29
|
+
Requires-Dist: graphviz; extra == 'docs'
|
|
30
|
+
Requires-Dist: myst-parser; extra == 'docs'
|
|
31
|
+
Requires-Dist: pydata-sphinx-theme; extra == 'docs'
|
|
32
|
+
Requires-Dist: sphinx-copybutton; extra == 'docs'
|
|
33
|
+
Requires-Dist: sphinx-design; extra == 'docs'
|
|
34
|
+
Requires-Dist: sphinx-rtd-theme; extra == 'docs'
|
|
35
|
+
Requires-Dist: sphinx-togglebutton; extra == 'docs'
|
|
36
|
+
Requires-Dist: sphinx>=6.0; extra == 'docs'
|
|
37
|
+
Requires-Dist: sphinxcontrib-bibtex; extra == 'docs'
|
|
38
|
+
Description-Content-Type: text/markdown
|
|
39
|
+
|
|
40
|
+
# SynKit
|
|
41
|
+
|
|
42
|
+
[](https://pypi.org/project/synkit/)
|
|
43
|
+
[](https://anaconda.org/tieulongphan/synkit)
|
|
44
|
+
[](https://hub.docker.com/r/tieulongphan/synkit)
|
|
45
|
+
[](https://hub.docker.com/r/tieulongphan/synkit)
|
|
46
|
+
[](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
|
|
47
|
+
[](https://github.com/tieulongphan/synkit/releases)
|
|
48
|
+
[](https://github.com/tieulongphan/synkit/commits)
|
|
49
|
+
[](https://doi.org/10.5281/zenodo.15269901)
|
|
50
|
+
[](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml)
|
|
51
|
+
[](https://github.com/tieulongphan/synkit/stargazers)
|
|
52
|
+
|
|
53
|
+
**Graph-native reaction informatics and executable electron-flow models**
|
|
54
|
+
|
|
55
|
+
SynKit is a Python toolkit for atom-mapped reactions, chemical graph
|
|
56
|
+
transformations, Lewis-labelled graphs, and explicitly supplied reaction
|
|
57
|
+
mechanisms. It connects reaction representation, rule extraction, graph
|
|
58
|
+
rewriting, stereochemistry, and mechanism verification through a common
|
|
59
|
+
attributed-graph model.
|
|
60
|
+
|
|
61
|
+
SynKit verifies mechanisms supplied by the user; it does not claim to predict
|
|
62
|
+
the kinetically or thermodynamically preferred mechanism.
|
|
63
|
+
|
|
64
|
+

|
|
65
|
+
|
|
66
|
+
## Highlights
|
|
67
|
+
|
|
68
|
+
- Convert mapped reaction SMILES into ITS and reaction-centre graphs.
|
|
69
|
+
- Extract and apply attributed graph-transformation rules.
|
|
70
|
+
- Represent lone pairs, radicals, and separate sigma and pi occupancies with
|
|
71
|
+
Lewis-labelled graphs.
|
|
72
|
+
- Execute curved-arrow and atomically coupled fishhook events.
|
|
73
|
+
- Preserve tetrahedral, axial, and extended stereochemical information.
|
|
74
|
+
- Build and analyse mechanism trajectory graphs and chemical reaction
|
|
75
|
+
networks.
|
|
76
|
+
|
|
77
|
+
## Installation
|
|
78
|
+
|
|
79
|
+
SynKit requires Python 3.11 or later.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python -m pip install synkit
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Install the optional dependencies with:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
python -m pip install "synkit[all]"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Alternatively, use the published container:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
docker pull tieulongphan/synkit:latest
|
|
95
|
+
docker run --rm tieulongphan/synkit:latest \
|
|
96
|
+
python -c "import synkit; print(synkit.__version__)"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Quick start
|
|
100
|
+
|
|
101
|
+
This self-contained example converts an atom-mapped substitution into an
|
|
102
|
+
imaginary transition-state graph and reports its changed bonds:
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from synkit.IO import rsmi_to_its
|
|
106
|
+
|
|
107
|
+
reaction = "[CH3:1][Br:2].[OH-:3]>>[CH3:1][OH:3].[Br-:2]"
|
|
108
|
+
its = rsmi_to_its(reaction, core=False, format="tuple")
|
|
109
|
+
|
|
110
|
+
changed_bonds = [
|
|
111
|
+
(source, target, data["order"])
|
|
112
|
+
for source, target, data in its.edges(data=True)
|
|
113
|
+
if data["order"][0] != data["order"][1]
|
|
114
|
+
]
|
|
115
|
+
print(changed_bonds)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The output records the broken C-Br bond as `(1.0, 0.0)` and the formed C-O
|
|
119
|
+
bond as `(0.0, 1.0)`. Continue with the
|
|
120
|
+
[graph](https://tieulongphan.github.io/SynKit/graph.html),
|
|
121
|
+
[rule](https://tieulongphan.github.io/SynKit/rule.html), and
|
|
122
|
+
[synthesis](https://tieulongphan.github.io/SynKit/synthesis.html) guides.
|
|
123
|
+
|
|
124
|
+
## Supplied-mechanism verification
|
|
125
|
+
|
|
126
|
+
SynKit can parse typed electron-flow annotations, replay their elementary
|
|
127
|
+
steps, and return a verification certificate and mechanism trajectory graph.
|
|
128
|
+
Canonical electron loci distinguish lone pairs, sigma bonds, pi bonds, and
|
|
129
|
+
radical electrons. Curved arrows carry two electrons; fishhooks carry one;
|
|
130
|
+
coupled radical events commit atomically from a common pre-state.
|
|
131
|
+
|
|
132
|
+
See the
|
|
133
|
+
[mechanism documentation](https://tieulongphan.github.io/SynKit/mechanism.html)
|
|
134
|
+
for the supported interchange formats, verification policies, and complete
|
|
135
|
+
examples.
|
|
136
|
+
|
|
137
|
+
## Documentation
|
|
138
|
+
|
|
139
|
+
- [Documentation](https://tieulongphan.github.io/SynKit/)
|
|
140
|
+
- [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
|
|
141
|
+
- [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
|
|
142
|
+
- [Changelog](doc/changelog.rst)
|
|
143
|
+
|
|
144
|
+
## Publications
|
|
145
|
+
|
|
146
|
+
- [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
|
|
147
|
+
transfers](https://arxiv.org/abs/2607.26088), arXiv:2607.26088 (2026).
|
|
148
|
+
- [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
|
|
149
|
+
Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
|
|
150
|
+
of Chemical Information and Modeling* (2025).
|
|
151
|
+
|
|
152
|
+
## Contributing
|
|
153
|
+
|
|
154
|
+
Contributions and bug reports are welcome. Create a branch from the current
|
|
155
|
+
mainline, make a focused change, and run the repository checks before opening
|
|
156
|
+
a pull request:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
git switch -c feature/short-description
|
|
160
|
+
bash scripts/lint.sh
|
|
161
|
+
bash scripts/pytest.sh
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Questions can be sent to
|
|
165
|
+
[tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
|
|
166
|
+
|
|
167
|
+
## Contributors
|
|
168
|
+
|
|
169
|
+
- [Tieu-Long Phan](https://tieulongphan.github.io/)
|
|
170
|
+
- [Klaus Weinbauer](https://github.com/klausweinbauer)
|
|
171
|
+
- [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
|
|
172
|
+
- [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
|
|
173
|
+
|
|
174
|
+
## License
|
|
175
|
+
|
|
176
|
+
SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
|
|
177
|
+
|
|
178
|
+
## Acknowledgments
|
|
179
|
+
|
|
180
|
+
This project received funding from the European Union's Horizon Europe
|
|
181
|
+
Doctoral Network programme under Marie Skłodowska-Curie grant agreement No.
|
|
182
|
+
101072930 ([TACsy](https://tacsy.eu/)).
|
synkit-1.6.1/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), arXiv:2607.26088 (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,12 +4,12 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "synkit"
|
|
7
|
-
version = "1.6.
|
|
7
|
+
version = "1.6.1"
|
|
8
8
|
description = "Utility for reaction modeling using graph grammar"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
license = { text = "MIT" }
|
|
12
|
-
license-files = ["LICENSE", "LICENSES/*"]
|
|
12
|
+
license-files = ["LICENSE", "synkit/Graph/Stereo/LICENSES/*"]
|
|
13
13
|
authors = [
|
|
14
14
|
{ name = "Tieu Long Phan", email = "tieu@bioinf.uni-leipzig.de" }
|
|
15
15
|
]
|
|
@@ -67,12 +67,10 @@ packages = ["synkit"]
|
|
|
67
67
|
[tool.hatch.build.targets.wheel.force-include]
|
|
68
68
|
"synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
|
|
69
69
|
"synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
|
|
70
|
-
"Data/Mech" = "synkit/Data/Mech"
|
|
71
70
|
|
|
72
71
|
[tool.hatch.build.targets.sdist]
|
|
73
72
|
include = [
|
|
74
73
|
"/synkit",
|
|
75
|
-
"/Data/Mech",
|
|
76
74
|
"/LICENSE",
|
|
77
75
|
"/LICENSES",
|
|
78
76
|
"/README.md",
|
|
@@ -82,4 +80,3 @@ include = [
|
|
|
82
80
|
[tool.hatch.build.targets.sdist.force-include]
|
|
83
81
|
"synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
|
|
84
82
|
"synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
|
|
85
|
-
"Data/Mech" = "Data/Mech"
|
|
@@ -7,6 +7,13 @@ from typing import Any, Dict, List, Optional, Sequence, Tuple
|
|
|
7
7
|
|
|
8
8
|
import networkx as nx
|
|
9
9
|
|
|
10
|
+
from synkit.Graph.Canon.exact import (
|
|
11
|
+
CanonicalSearchIncomplete,
|
|
12
|
+
ExactCanonicalResult,
|
|
13
|
+
ExactColoredGraphCanonicalizer,
|
|
14
|
+
IncompleteCanonicalResult,
|
|
15
|
+
)
|
|
16
|
+
|
|
10
17
|
from ._common import (
|
|
11
18
|
AutomorphismResult,
|
|
12
19
|
CanonicalResult,
|
|
@@ -723,6 +730,91 @@ class IRCanonicalEngine:
|
|
|
723
730
|
Exact-search internal result.
|
|
724
731
|
:rtype: IRInternalResult
|
|
725
732
|
"""
|
|
733
|
+
if max_count is not None or timeout_sec is not None or stop_after_two:
|
|
734
|
+
return self._run_bounded_compatibility(
|
|
735
|
+
max_count=max_count,
|
|
736
|
+
timeout_sec=timeout_sec,
|
|
737
|
+
stop_after_two=stop_after_two,
|
|
738
|
+
)
|
|
739
|
+
cached = self._reuse_cached_run(
|
|
740
|
+
max_count=max_count,
|
|
741
|
+
timeout_sec=timeout_sec,
|
|
742
|
+
stop_after_two=stop_after_two,
|
|
743
|
+
)
|
|
744
|
+
if cached is not None:
|
|
745
|
+
return cached
|
|
746
|
+
|
|
747
|
+
native = ExactColoredGraphCanonicalizer(
|
|
748
|
+
self.G,
|
|
749
|
+
node_color=lambda attrs: node_token(attrs, self.config),
|
|
750
|
+
edge_color=lambda attrs: edge_token(attrs, self.config),
|
|
751
|
+
).search(timeout_seconds=timeout_sec)
|
|
752
|
+
if isinstance(native, IncompleteCanonicalResult):
|
|
753
|
+
raise CanonicalSearchIncomplete(
|
|
754
|
+
"CRN canonicalization did not complete: " f"{native.reason}."
|
|
755
|
+
)
|
|
756
|
+
if not isinstance(native, ExactCanonicalResult):
|
|
757
|
+
raise RuntimeError("Native exact canonicalizer returned no result.")
|
|
758
|
+
|
|
759
|
+
full_mappings = [witness.as_dict() for witness in native.automorphisms]
|
|
760
|
+
cap = 2 if stop_after_two else max_count
|
|
761
|
+
stopped = cap is not None and len(full_mappings) > cap
|
|
762
|
+
sample_mappings = full_mappings if cap is None else full_mappings[:cap]
|
|
763
|
+
best_order = list(native.canonical_order)
|
|
764
|
+
sample_perms = [
|
|
765
|
+
[mapping[node] for node in best_order] for mapping in sample_mappings
|
|
766
|
+
]
|
|
767
|
+
orbits = orbits_from_mappings(
|
|
768
|
+
best_order,
|
|
769
|
+
(
|
|
770
|
+
sample_mappings
|
|
771
|
+
if sample_mappings
|
|
772
|
+
else [{node: node for node in best_order}]
|
|
773
|
+
),
|
|
774
|
+
)
|
|
775
|
+
result = IRInternalResult(
|
|
776
|
+
canonical_order=best_order,
|
|
777
|
+
canonical_key=graph_key_from_order(
|
|
778
|
+
self.G,
|
|
779
|
+
best_order,
|
|
780
|
+
self.config,
|
|
781
|
+
),
|
|
782
|
+
automorphism_count=len(sample_mappings),
|
|
783
|
+
sample_permutations=sample_perms,
|
|
784
|
+
sample_mappings=sample_mappings,
|
|
785
|
+
orbits=orbits,
|
|
786
|
+
elapsed_seconds=native.statistics.elapsed_seconds,
|
|
787
|
+
stopped_early=stopped,
|
|
788
|
+
)
|
|
789
|
+
if timeout_sec is None:
|
|
790
|
+
full_result = IRInternalResult(
|
|
791
|
+
canonical_order=best_order,
|
|
792
|
+
canonical_key=result.canonical_key,
|
|
793
|
+
automorphism_count=len(full_mappings),
|
|
794
|
+
sample_permutations=[
|
|
795
|
+
[mapping[node] for node in best_order] for mapping in full_mappings
|
|
796
|
+
],
|
|
797
|
+
sample_mappings=full_mappings,
|
|
798
|
+
orbits=[set(cell) for cell in native.orbits],
|
|
799
|
+
elapsed_seconds=native.statistics.elapsed_seconds,
|
|
800
|
+
stopped_early=False,
|
|
801
|
+
)
|
|
802
|
+
self._exact_full_cache = full_result
|
|
803
|
+
return result
|
|
804
|
+
|
|
805
|
+
def _run_bounded_compatibility(
|
|
806
|
+
self,
|
|
807
|
+
*,
|
|
808
|
+
max_count: Optional[int],
|
|
809
|
+
timeout_sec: Optional[float],
|
|
810
|
+
stop_after_two: bool,
|
|
811
|
+
) -> IRInternalResult:
|
|
812
|
+
"""Run the historical bounded diagnostic IR traversal.
|
|
813
|
+
|
|
814
|
+
This path preserves CRN automorphism-count and timeout diagnostics.
|
|
815
|
+
``stopped_early`` is authoritative: callers may inspect the partial
|
|
816
|
+
evidence, but :meth:`canonical_result` refuses to promote it.
|
|
817
|
+
"""
|
|
726
818
|
cached = self._reuse_cached_run(
|
|
727
819
|
max_count=max_count,
|
|
728
820
|
timeout_sec=timeout_sec,
|
|
@@ -742,7 +834,12 @@ class IRCanonicalEngine:
|
|
|
742
834
|
nonlocal best_key, best_order, sample_perms, count, stopped
|
|
743
835
|
if stopped:
|
|
744
836
|
return
|
|
745
|
-
if should_stop(
|
|
837
|
+
if should_stop(
|
|
838
|
+
start,
|
|
839
|
+
timeout_sec,
|
|
840
|
+
count=count,
|
|
841
|
+
max_count=max_count,
|
|
842
|
+
):
|
|
746
843
|
stopped = True
|
|
747
844
|
return
|
|
748
845
|
|
|
@@ -770,18 +867,25 @@ class IRCanonicalEngine:
|
|
|
770
867
|
|
|
771
868
|
target = self._target_cell(refined)
|
|
772
869
|
ordered_candidates = sorted(
|
|
773
|
-
target,
|
|
870
|
+
target,
|
|
871
|
+
key=lambda value: self._candidate_order_key(
|
|
872
|
+
value,
|
|
873
|
+
refined,
|
|
874
|
+
),
|
|
774
875
|
)
|
|
775
|
-
for
|
|
776
|
-
child = self._build_child_partition(
|
|
876
|
+
for value in ordered_candidates:
|
|
877
|
+
child = self._build_child_partition(
|
|
878
|
+
refined,
|
|
879
|
+
target,
|
|
880
|
+
value,
|
|
881
|
+
)
|
|
777
882
|
dfs(child)
|
|
778
883
|
if stopped:
|
|
779
884
|
return
|
|
780
885
|
|
|
781
886
|
dfs(init)
|
|
782
887
|
assert best_key is not None and best_order is not None
|
|
783
|
-
|
|
784
|
-
result = self._assemble_result(
|
|
888
|
+
return self._assemble_result(
|
|
785
889
|
start=start,
|
|
786
890
|
best_key=best_key,
|
|
787
891
|
best_order=best_order,
|
|
@@ -789,9 +893,6 @@ class IRCanonicalEngine:
|
|
|
789
893
|
count=count,
|
|
790
894
|
stopped=stopped,
|
|
791
895
|
)
|
|
792
|
-
if timeout_sec is None and not result.stopped_early and not stop_after_two:
|
|
793
|
-
self._exact_full_cache = result
|
|
794
|
-
return result
|
|
795
896
|
|
|
796
897
|
def canonical_result(
|
|
797
898
|
self, *, timeout_sec: Optional[float] = None
|
|
@@ -808,6 +909,10 @@ class IRCanonicalEngine:
|
|
|
808
909
|
:rtype: CanonicalResult
|
|
809
910
|
"""
|
|
810
911
|
res = self.run(timeout_sec=timeout_sec)
|
|
912
|
+
if res.stopped_early:
|
|
913
|
+
raise CanonicalSearchIncomplete(
|
|
914
|
+
"CRN canonical identity requires a complete search."
|
|
915
|
+
)
|
|
811
916
|
return CanonicalResult(
|
|
812
917
|
canonical_order=res.canonical_order,
|
|
813
918
|
canonical_key=res.canonical_key,
|