synkit 1.6.0__tar.gz → 1.6.1b1__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.1b1/.gitignore +98 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/PKG-INFO +2 -4
- {synkit-1.6.0 → synkit-1.6.1b1}/README.md +1 -1
- {synkit-1.6.0 → synkit-1.6.1b1}/pyproject.toml +2 -5
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Symmetry/_ir.py +114 -9
- synkit-1.6.1b1/synkit/Chem/Molecule/_chirality_loci.py +169 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/_chirality_types.py +231 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/_helical_loci.py +172 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/_stereo_axis_evidence.py +204 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/_stereo_element_detection.py +196 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/_stereo_orientation_constraints.py +530 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/_tetrahedral_carriers.py +71 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/chirality.py +1056 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/cip_assignment.py +577 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/cip_ranking.py +848 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/coordinate_stereo.py +528 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/derived_stereo_naming.py +165 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/global_stereo.py +175 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/stereo_evidence.py +179 -0
- synkit-1.6.1b1/synkit/Chem/Molecule/stereo_perception.py +1053 -0
- synkit-1.6.1b1/synkit/Graph/Canon/__init__.py +16 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Canon/canon_algs.py +2 -1
- {synkit-1.6.0/synkit/Graph → synkit-1.6.1b1/synkit/Graph/Canon}/canon_graph.py +2 -2
- synkit-1.6.1b1/synkit/Graph/Canon/exact.py +960 -0
- synkit-1.6.1b1/synkit/Graph/Canon/exact_refinement.py +396 -0
- synkit-1.6.1b1/synkit/Graph/Canon/nauty.py +143 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Mech/conversion.py +40 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/__init__.py +144 -0
- synkit-1.6.1b1/synkit/Graph/Stereo/_descriptor_core.py +207 -0
- synkit-1.6.1b1/synkit/Graph/Stereo/_descriptor_serialization.py +138 -0
- synkit-1.6.1b1/synkit/Graph/Stereo/canonical.py +635 -0
- synkit-1.6.1b1/synkit/Graph/Stereo/configured.py +983 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/descriptors.py +434 -232
- synkit-1.6.1b1/synkit/Graph/Stereo/enumeration.py +595 -0
- synkit-1.6.1b1/synkit/Graph/Stereo/extended_descriptors.py +402 -0
- synkit-1.6.1b1/synkit/Graph/Stereo/global_configured.py +152 -0
- synkit-1.6.1b1/synkit/Graph/Stereo/global_stereo.py +312 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/identity.py +40 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/matching.py +14 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/orbits.py +44 -0
- synkit-1.6.1b1/synkit/Graph/Stereo/pairwise.py +225 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/rdkit_adapter.py +42 -18
- synkit-1.6.1b1/synkit/Graph/Stereo/supports.py +257 -0
- synkit-1.6.1b1/synkit/Graph/canon_graph.py +14 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/evidence.py +10 -4
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/syn_rule.py +32 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/__init__.py +2 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/graph_rewrite.py +4 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/product_state.py +9 -5
- synkit-1.6.1b1/synkit/Synthesis/Reactor/serialization_policy.py +17 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/syn_reactor.py +47 -11
- {synkit-1.6.0 → synkit-1.6.1b1}/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/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-1.6.1b1}/LICENSE +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/DAG/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/DAG/syncrn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/abstract.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/arity.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/builder.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/derivation.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/flattener.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/keys.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/mixtures.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/smiles.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/state.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/strategy.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Construct/worker.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Pathway/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Pathway/_adapter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Pathway/pathfinder.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Pathway/reachability.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Pathway/realizability.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Petrinet/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Petrinet/analyzer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Petrinet/net.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Petrinet/persistence.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Petrinet/semiflows.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Petrinet/structure.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Props/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Props/dynamics.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Props/helper.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Props/stoich.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Props/thermo.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Query/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Query/kegg_api.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Query/kegg_extract.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Query/kegg_impute.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Query/kegg_parse.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Structure/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Structure/reaction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Structure/rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Structure/species.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Structure/syncrn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Symmetry/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Symmetry/_common.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Symmetry/automorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Symmetry/canon.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Symmetry/isomorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Symmetry/symmetry.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Symmetry/wl_canon.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Visualize/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Visualize/crn_vis.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Visualize/labels.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Visualize/layout.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Visualize/palette.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Visualize/validation.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/Visualize/vis.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Structure/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Structure/backend.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Structure/conversion.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Structure/hyperedge.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Structure/hypergraph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Structure/rxn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Symmetry/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Symmetry/automorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Symmetry/canon.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/Symmetry/wl_canon.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/configs/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/configs/loader.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/configs/models.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/constants.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/crn_formula.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/deficiency.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/enumerator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/exceptions.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/explorer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/helpers.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/injectivity.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/motif.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/network.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/pathway.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/properties.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/reaction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/CRN/dev_crn/viz.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Cluster/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Cluster/butina.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Fingerprint/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Fingerprint/fp_calculator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Fingerprint/smiles_featurizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Fingerprint/transformation_fp.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Molecule/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Molecule/atom_features.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Molecule/descriptors.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Molecule/formula.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Molecule/graph_annotator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Molecule/standardize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Molecule/valence.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/aam_validator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/chem/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/chem/aam.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/chem/its.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/chem/smiles.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/exact/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/exact/branching.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/exact/certificate.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/exact/enumerate.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/exact/enumeration_result.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/exact/exhaustive.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/exact/kernel.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/exact/milp.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/graph/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/graph/automorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/graph/blockcut.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/graph/labeled_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/graph/refine.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/graph/synkit_adapter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/io/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/io/idxmapstr.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/slap/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/slap/lap.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/Mapper/slap/sequential.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/aam_validator.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/balance_check.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/canon_rsmi.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/cleaning.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/deionize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/explicit_h_audit.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/fix_aam.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/neutralize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/radical_wildcard.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/standardize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/Reaction/tautomerize.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Chem/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Data/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Data/aldol.json.gz +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Data/gen_partial_aam.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Data/paracetamol.json.gz +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Context/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Context/hier_context.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Context/radius_expand.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/FG/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/FG/api.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/FG/audit.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/FG/catalog.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/FG/detector.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/FG/model.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/FG/recognizers.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/FG/ring_system.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/Descriptors/topology.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/graph_descriptors.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/graph_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/graph_signature.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/hash_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/morgan_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/path_fps.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Feature/wl_hash.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Fusion/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Fusion/candidate.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Fusion/constructor.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Fusion/identity.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Fusion/interface.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Fusion/search.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Hyrogen/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Hyrogen/_misc.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Hyrogen/hcomplete.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Hyrogen/hextend.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/its_builder.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/its_construction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/its_decompose.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/its_destruction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/its_expand.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/its_relabel.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/its_reverter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/normalize_aam.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/partial_its.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/ITS/rc_extractor.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/MTG/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/MTG/mcs_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/MTG/mtg.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/MTG/mtg_explore.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/MTG/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/approx_mcs.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/auto_est.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/automorphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/batch_cluster.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/dedup_matches.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/graph_cluster.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/graph_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/graph_morphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/mcs_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/multi_turbo_iso.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/orbit.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/partial_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/sing.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/subgraph_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/turbo_iso.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Matcher/wl_sel.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Mech/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Mech/conversion_debug.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Mech/electron_accounting.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Mech/lwg_editor.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Mech/lwg_ops.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Morphism/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Morphism/constraints.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Morphism/morphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Morphism/stereo.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Morphism/stereo_morphism.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Morphism/stereo_morphism_helpers.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Morphism/stereo_morphism_types.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/changes.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/couplings.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/interchange.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/legacy.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Stereo/outcomes.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Wildcard/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Wildcard/fuse_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Wildcard/graph_wc.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Wildcard/its_merge.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Wildcard/radwc.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Wildcard/wc_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/Wildcard/wildcard.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/syn_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Graph/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/chem_converter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/combinatorial/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/combinatorial/gml_to_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/combinatorial/graph_to_gml.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/combinatorial/graph_to_smarts.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/combinatorial/smarts_expander.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/combinatorial/smarts_generalizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/combinatorial/smarts_to_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/conversion.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/data_io.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/data_process.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/debug.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/gml_to_nx.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/graph_to_mol.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/mol_to_graph.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/mol_to_graph_chemistry.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/nx_to_gml.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/IO/smiles_to_id.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/adapters.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/audit.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/benchmark.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/compatibility.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/drawing.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/electron_models.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/equivalence.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/interchange.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/model.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/radical_data.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/replay.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/schema.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/stereo_state.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Mechanism/symbols.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Apply/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Apply/rule_matcher.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Compose/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Compose/_identity.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Modify/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Modify/implict_rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Modify/longest_path.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Modify/molecule_rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Modify/prune_templates.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Modify/rule_utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/Modify/strip_rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/generic_stereo.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Rule/stereo_identity.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/MSR/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/MSR/path_finder.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Metrics/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Metrics/_base.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Metrics/_plot.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Metrics/_ranking.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/assignment.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/batch_reactor.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/benchmark.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/deduplication.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/fusion_validation.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/imba_engine.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/partial_engine.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/post_syn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/rbl_engine.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/rbl_matching.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/rbl_policy.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/rbl_reaction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/reactor_matching.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/reactor_stereo.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/rule_filter.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/serialization.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/Reactor/strategy.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Synthesis/reactor_utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Utils/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Utils/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/crn/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/crn/visualizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/arrows.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/chem.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/constants.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/layout.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/mapping.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/models.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/render.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/utils.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/epd/visualizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/graph_visualizer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/its/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/its/drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/its_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/molecule/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/molecule/drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/molecule/reaction.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/molecule_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/mtg/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/mtg/drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/mtg_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/pdf_writer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/reaction/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/reaction/rule.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/reaction/rxn.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/reaction_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/space/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/space/chemical.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/space/embedding.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/vis_synedu/Vis/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/vis_synedu/Vis/dpo.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/vis_synedu/rxn_vis.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/vis_synedu/vis.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/visual_drawer.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/Vis/visual_model.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/__init__.py +0 -0
- {synkit-1.6.0 → synkit-1.6.1b1}/synkit/examples.py +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
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
|
+
# Local development, audit, and debugging helpers.
|
|
18
|
+
/tools/
|
|
19
|
+
!/tools/
|
|
20
|
+
/tools/*
|
|
21
|
+
!/tools/stereo_conformance.py
|
|
22
|
+
!/tools/check_python_file_size.py
|
|
23
|
+
/debug/
|
|
24
|
+
/Test/Conformance/
|
|
25
|
+
*.rdf
|
|
26
|
+
test_syn_reactor.py
|
|
27
|
+
|
|
28
|
+
Data/Benchmark/*
|
|
29
|
+
!Data/Benchmark/partial_expand/
|
|
30
|
+
!Data/Benchmark/partial_expand/**
|
|
31
|
+
Data/Benchmark/partial_expand/results/
|
|
32
|
+
!Data/Benchmark/mech/
|
|
33
|
+
Data/Benchmark/mech/*
|
|
34
|
+
!Data/Benchmark/mech/README.md
|
|
35
|
+
!Data/Benchmark/mech/polar-failures.csv
|
|
36
|
+
!Data/Benchmark/mech/radical-failures.csv
|
|
37
|
+
*.json.gz
|
|
38
|
+
!Experiment/Lewis/Data/benchmark.json.gz
|
|
39
|
+
# *.png
|
|
40
|
+
|
|
41
|
+
run.sh
|
|
42
|
+
docs/*
|
|
43
|
+
run_rdcanon.py
|
|
44
|
+
Data/Fragment/*
|
|
45
|
+
test_partial.py
|
|
46
|
+
Data/Benchmark/synthesis/*
|
|
47
|
+
Data/USPTO/*
|
|
48
|
+
crn/*
|
|
49
|
+
test_run.py
|
|
50
|
+
Data/Study/CRN/case_formose/*
|
|
51
|
+
|
|
52
|
+
synkit/Graph/dev/*
|
|
53
|
+
*.ipynb
|
|
54
|
+
*.json
|
|
55
|
+
# Stereo benchmark inputs are versioned for reproducible fresh-clone runs.
|
|
56
|
+
# Generated reports stay Git-visible so completed results can be committed
|
|
57
|
+
# explicitly, including reports created by the long raw stress stages.
|
|
58
|
+
!Experiment/Stereo/Data/**/*.csv
|
|
59
|
+
!Experiment/Stereo/Data/**/*.json
|
|
60
|
+
!Data/Schema/
|
|
61
|
+
!Data/Schema/attribute_propagation_v1_5.json
|
|
62
|
+
!/tools/python_file_size_baseline.json
|
|
63
|
+
!Data/Mech/polar.json
|
|
64
|
+
!Data/Mech/radical.json
|
|
65
|
+
!Data/Mech/stereo.json
|
|
66
|
+
# Canonical reviewed MechanismBench partitions are executable test data.
|
|
67
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/polar.json
|
|
68
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/radical.json
|
|
69
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/stereo.json
|
|
70
|
+
!Experiment/Lewis/mech_path/Data/MechanismBench/evidence/mechanismbench_evidence.json
|
|
71
|
+
!Experiment/Lewis/rule_replay/Data/bidirectional-replay/results.json
|
|
72
|
+
!Experiment/Lewis/rule_replay/Data/relative-lone-pair/results.json
|
|
73
|
+
!Experiment/Stereo/Data/manifest.json
|
|
74
|
+
!Experiment/Stereo/Data/Perception/perception_conformance_cases.json
|
|
75
|
+
!Experiment/Stereo/Data/Perception/full_detection_report.json
|
|
76
|
+
!Test/Synthesis/Reactor/fixtures/small_rewrite_conformance.json
|
|
77
|
+
!Data/Conformance/stereomolgraph_graph_conformance.json
|
|
78
|
+
!Data/Benchmark/Stereo/
|
|
79
|
+
!Data/Benchmark/Stereo/**
|
|
80
|
+
*.txt
|
|
81
|
+
!LICENSES/*.txt
|
|
82
|
+
*.log
|
|
83
|
+
/dist/
|
|
84
|
+
sprint/
|
|
85
|
+
sprint/*
|
|
86
|
+
test_syn.py
|
|
87
|
+
.gitignore
|
|
88
|
+
measure_candidate_stages.py
|
|
89
|
+
run_valid_bug_cases.py
|
|
90
|
+
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
|
+
# Keep generated Python bytecode ignored after directory re-inclusions above.
|
|
97
|
+
**/__pycache__/
|
|
98
|
+
*.py[cod]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synkit
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.1b1
|
|
4
4
|
Summary: Utility for reaction modeling using graph grammar
|
|
5
5
|
Project-URL: homepage, https://github.com/TieuLongPhan/SynKit
|
|
6
6
|
Project-URL: source, https://github.com/TieuLongPhan/SynKit
|
|
@@ -9,8 +9,6 @@ Project-URL: documentation, https://tieulongphan.github.io/SynKit/
|
|
|
9
9
|
Author-email: Tieu Long Phan <tieu@bioinf.uni-leipzig.de>
|
|
10
10
|
License: MIT
|
|
11
11
|
License-File: LICENSE
|
|
12
|
-
License-File: LICENSES/ACS-StereoMolGraph-SI-NOTICE.md
|
|
13
|
-
License-File: LICENSES/StereoMolGraph-MIT.txt
|
|
14
12
|
Classifier: License :: OSI Approved :: MIT License
|
|
15
13
|
Classifier: Operating System :: OS Independent
|
|
16
14
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -78,7 +76,7 @@ Canonical internal electron loci are `lp`, `σ`, `π`, and `∙`; adapters accep
|
|
|
78
76
|
documented ASCII and legacy spellings. Curved arrows carry two electrons and
|
|
79
77
|
fishhooks carry one electron. Coupled radical events commit atomically.
|
|
80
78
|
|
|
81
|
-
The current package version is `1.6.
|
|
79
|
+
The current package version is `1.6.1b1`.
|
|
82
80
|
|
|
83
81
|
For more details on each utility within the repository, please refer to the documentation provided in the respective folders.
|
|
84
82
|
|
|
@@ -37,7 +37,7 @@ Canonical internal electron loci are `lp`, `σ`, `π`, and `∙`; adapters accep
|
|
|
37
37
|
documented ASCII and legacy spellings. Curved arrows carry two electrons and
|
|
38
38
|
fishhooks carry one electron. Coupled radical events commit atomically.
|
|
39
39
|
|
|
40
|
-
The current package version is `1.6.
|
|
40
|
+
The current package version is `1.6.1b1`.
|
|
41
41
|
|
|
42
42
|
For more details on each utility within the repository, please refer to the documentation provided in the respective folders.
|
|
43
43
|
|
|
@@ -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.1b1"
|
|
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,
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"""Topology-only detection of potential molecular stereo axes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import networkx as nx
|
|
6
|
+
from rdkit import Chem
|
|
7
|
+
|
|
8
|
+
from synkit.Graph.Stereo.descriptors import Reference, virtual_reference
|
|
9
|
+
from synkit.Graph.Stereo.supports import AxisStereoSupport
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _cumulene_end_references(
|
|
13
|
+
atom: Chem.Atom,
|
|
14
|
+
axis_neighbor: int,
|
|
15
|
+
) -> tuple[Reference, Reference] | None:
|
|
16
|
+
"""Return zero-based terminal references for one cumulene end."""
|
|
17
|
+
center = atom.GetIdx()
|
|
18
|
+
references: list[Reference] = [
|
|
19
|
+
neighbor.GetIdx()
|
|
20
|
+
for neighbor in atom.GetNeighbors()
|
|
21
|
+
if neighbor.GetIdx() != axis_neighbor
|
|
22
|
+
]
|
|
23
|
+
hidden_hydrogens = int(atom.GetNumExplicitHs()) + int(atom.GetNumImplicitHs())
|
|
24
|
+
references.extend(virtual_reference("H", center) for _ in range(hidden_hydrogens))
|
|
25
|
+
if len(references) == 1 and atom.GetAtomicNum() == 15:
|
|
26
|
+
references.append(virtual_reference("LP", center))
|
|
27
|
+
if len(references) != 2 or references[0] == references[1]:
|
|
28
|
+
return None
|
|
29
|
+
return references[0], references[1]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _potential_cumulene_supports(
|
|
33
|
+
molecule: Chem.Mol,
|
|
34
|
+
) -> tuple[AxisStereoSupport, ...]:
|
|
35
|
+
"""Detect even-cumulene axes without assigning their orientation."""
|
|
36
|
+
double_graph = nx.Graph()
|
|
37
|
+
double_graph.add_edges_from(
|
|
38
|
+
(bond.GetBeginAtomIdx(), bond.GetEndAtomIdx())
|
|
39
|
+
for bond in molecule.GetBonds()
|
|
40
|
+
if bond.GetBondType() == Chem.BondType.DOUBLE
|
|
41
|
+
)
|
|
42
|
+
supports = []
|
|
43
|
+
for component in nx.connected_components(double_graph):
|
|
44
|
+
axis = double_graph.subgraph(component)
|
|
45
|
+
edge_count = axis.number_of_edges()
|
|
46
|
+
if edge_count < 2 or edge_count % 2 != 0:
|
|
47
|
+
continue
|
|
48
|
+
if edge_count != axis.number_of_nodes() - 1:
|
|
49
|
+
continue
|
|
50
|
+
degrees = dict(axis.degree())
|
|
51
|
+
if any(degree > 2 for degree in degrees.values()):
|
|
52
|
+
continue
|
|
53
|
+
ends = sorted(node for node, degree in degrees.items() if degree == 1)
|
|
54
|
+
if len(ends) != 2:
|
|
55
|
+
continue
|
|
56
|
+
path = nx.shortest_path(axis, ends[0], ends[1])
|
|
57
|
+
if any(molecule.GetAtomWithIdx(node).GetDegree() != 2 for node in path[1:-1]):
|
|
58
|
+
continue
|
|
59
|
+
left_refs = _cumulene_end_references(
|
|
60
|
+
molecule.GetAtomWithIdx(path[0]),
|
|
61
|
+
path[1],
|
|
62
|
+
)
|
|
63
|
+
right_refs = _cumulene_end_references(
|
|
64
|
+
molecule.GetAtomWithIdx(path[-1]),
|
|
65
|
+
path[-2],
|
|
66
|
+
)
|
|
67
|
+
if left_refs is None or right_refs is None:
|
|
68
|
+
continue
|
|
69
|
+
supports.append(AxisStereoSupport(tuple(path), (left_refs, right_refs)))
|
|
70
|
+
return tuple(supports)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _potential_biaryl_supports(
|
|
74
|
+
molecule: Chem.Mol,
|
|
75
|
+
*,
|
|
76
|
+
include_extended_ring_axes: bool,
|
|
77
|
+
) -> tuple[AxisStereoSupport, ...]:
|
|
78
|
+
"""Detect ring-associated bond axes without orientation or barrier claims."""
|
|
79
|
+
supports = []
|
|
80
|
+
for bond in molecule.GetBonds():
|
|
81
|
+
if bond.GetBondType() not in {
|
|
82
|
+
Chem.BondType.SINGLE,
|
|
83
|
+
Chem.BondType.AROMATIC,
|
|
84
|
+
}:
|
|
85
|
+
continue
|
|
86
|
+
left_atom = bond.GetBeginAtom()
|
|
87
|
+
right_atom = bond.GetEndAtom()
|
|
88
|
+
hybridizations = {
|
|
89
|
+
left_atom.GetHybridization(),
|
|
90
|
+
right_atom.GetHybridization(),
|
|
91
|
+
}
|
|
92
|
+
containing_ring_sizes = tuple(
|
|
93
|
+
len(ring)
|
|
94
|
+
for ring in molecule.GetRingInfo().BondRings()
|
|
95
|
+
if bond.GetIdx() in ring
|
|
96
|
+
)
|
|
97
|
+
aromatic_ring_axis = (
|
|
98
|
+
bond.GetIsAromatic()
|
|
99
|
+
and left_atom.GetIsAromatic()
|
|
100
|
+
and right_atom.GetIsAromatic()
|
|
101
|
+
and any(size > 6 for size in containing_ring_sizes)
|
|
102
|
+
)
|
|
103
|
+
linked_ring_axis = (
|
|
104
|
+
not bond.GetIsAromatic()
|
|
105
|
+
and (
|
|
106
|
+
left_atom.IsInRing()
|
|
107
|
+
or right_atom.IsInRing()
|
|
108
|
+
)
|
|
109
|
+
and Chem.HybridizationType.SP2 in hybridizations
|
|
110
|
+
and hybridizations
|
|
111
|
+
<= {
|
|
112
|
+
Chem.HybridizationType.SP2,
|
|
113
|
+
Chem.HybridizationType.SP3,
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
standard_biaryl_axis = (
|
|
117
|
+
not bond.GetIsAromatic()
|
|
118
|
+
and left_atom.GetIsAromatic()
|
|
119
|
+
and right_atom.GetIsAromatic()
|
|
120
|
+
)
|
|
121
|
+
if not standard_biaryl_axis and not (
|
|
122
|
+
include_extended_ring_axes
|
|
123
|
+
and (aromatic_ring_axis or linked_ring_axis)
|
|
124
|
+
):
|
|
125
|
+
continue
|
|
126
|
+
left, right = left_atom.GetIdx(), right_atom.GetIdx()
|
|
127
|
+
left_refs = tuple(
|
|
128
|
+
neighbor.GetIdx()
|
|
129
|
+
for neighbor in left_atom.GetNeighbors()
|
|
130
|
+
if neighbor.GetIdx() != right_atom.GetIdx()
|
|
131
|
+
)
|
|
132
|
+
right_refs = tuple(
|
|
133
|
+
neighbor.GetIdx()
|
|
134
|
+
for neighbor in right_atom.GetNeighbors()
|
|
135
|
+
if neighbor.GetIdx() != left_atom.GetIdx()
|
|
136
|
+
)
|
|
137
|
+
if len(left_refs) != 2 or len(right_refs) != 2:
|
|
138
|
+
continue
|
|
139
|
+
supports.append(
|
|
140
|
+
AxisStereoSupport(
|
|
141
|
+
(left, right),
|
|
142
|
+
(left_refs, right_refs),
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
return tuple(supports)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def detect_potential_axis_supports(
|
|
149
|
+
molecule: Chem.Mol,
|
|
150
|
+
*,
|
|
151
|
+
include_extended_ring_axes: bool = False,
|
|
152
|
+
) -> tuple[tuple[str, AxisStereoSupport], ...]:
|
|
153
|
+
"""Return typed topology supports for potential molecular stereo axes."""
|
|
154
|
+
if molecule is None:
|
|
155
|
+
raise ValueError("Potential stereo-locus detection requires a molecule.")
|
|
156
|
+
working = Chem.Mol(molecule)
|
|
157
|
+
return (
|
|
158
|
+
*(
|
|
159
|
+
("cumulene_axis", support)
|
|
160
|
+
for support in _potential_cumulene_supports(working)
|
|
161
|
+
),
|
|
162
|
+
*(
|
|
163
|
+
("atrop_axis", support)
|
|
164
|
+
for support in _potential_biaryl_supports(
|
|
165
|
+
working,
|
|
166
|
+
include_extended_ring_axes=include_extended_ring_axes,
|
|
167
|
+
)
|
|
168
|
+
),
|
|
169
|
+
)
|